2012-09-10 41 views
4

相同的實體創建一個簡單的表格多行:多行中的Symfony2

控制器:

public function indexAction() 
{ 
    $repository = $this->getDoctrine()->getRepository('MyBundle:Product'); 
    $products = $repository->findAll(); 

    foreach ($products as $product) { 
     $forms[] = $this->createForm(new ProductType, $product)->createView(); 
    } 

    return $this->render('MBundle:Default:index.html.twig', array('form' => $forms);   

} 

我在樹枝呈現此:

<form action="{{ path('_submit') }}" method="post"> 
{% for key, formData in forms %} 
    {{ form_row(formData.id) }} 
    {{ form_row(formData.name) }} 
    {{ form_row(formData.nameEnglish) }} 
    <br clear="all" /> 
{% endfor %} 
</form> 

當我提交表單我的每個輸入字段集具有相同的名稱屬性,我只得到最後一個。如何抓住所有行並在submitAction()控制器中驗證它們?每個輸入都需要具有唯一的名稱,對嗎? ...也許我需要設置某種名稱=「東西[名稱] []」,但如何做到這一點?

+1

查看收藏字段組:http://symfony.com/doc/current/reference/forms/types/collection.html和http://symfony.com/doc/current/cookbook/form/ form_collections.html。您最終會將$產品傳遞給您的表單。 – Cerad

+0

你能舉個例子嗎?我不明白如何在這種情況下集合將工作 –

+0

使自己ProductsType形式和嵌入ProductType作爲集合。 – Cerad

回答

6

Ok Cerad對他的評論是正確的,我們必須爲此使用收集。起初聽起來像是一種胡言亂語,但它確實是對的。我花了一段時間才找到它。

所以我不得不創建一個ProductsType這是一個arrayCollection並插入每個產品。 (就像在與任務和標籤文檔)

我用的是:

$repository = $this->getDoctrine()->getRepository('ExampleBundle:Product'); 
$products = $repository->findAll(); 

$productCollection = new Products; 

foreach ($products as $product) { 
    $productCollection->getProducts()->add($product); 
} 

$collection = $this->createForm(new ProductsType, $productCollection); 

return $this->render('ExampleBundle:Default:index.html.twig', array(
    'collection' => $collection->createView() 
     )); 

然後在樹枝我做的:

<div class="products"> 
    {% for product in collection.products %} 
     {{ form_row(product.id) }} 
     {{ form_row(product.name) }} 
     {{ form_row(product.description) }} 
     <br clear="all" /> 
    {% endfor %} 
</div>  

完成任務。

甚至可以通過這個應用主題到每一行:

{% block _productsType_products_entry_name_row %} 
    <div class="yourDivName">{{ block('form_widget') }}</div> 
{% endblock %} 
{% block _productsType_products_entry_description_row %} 
    <div class="yourDivDescription">{{ block('form_widget') }}</div> 
{% endblock %} 

酷的東西!

+1

你可以簡化一點:$ productCollection = array('products'=> $ products);沒有真正的需要(在這種情況下),使一個產品類 – Cerad

+1

@ TroodoN-Mike請問您能展示產品類型如何看起來像? – Shaolin