2012-09-10 2 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> 

Когда i submit form, каждый из моих полей ввода имеет одинаковые атрибуты имени, и я получаю только последний. Как захватить все строки и проверить их в моем контроллере submitAction()? Каждый вход должен иметь уникальное имя, не так ли? ... и, возможно, мне нужно установить каким-то образом name = "something [name] []", но как это сделать?

+1

Взгляните на группу полей коллекций: http://symfony.com/doc/current/reference/forms/types/collection.html и http://symfony.com/doc/current/cookbook/form/ form_collections.html. В итоге вы передадите $ products в свою форму. – Cerad

+0

Можете ли вы привести мне пример. Я не понимаю, как в этом случае коллекция будет работать. –

+0

Сделайте себе форму ProductType и вставьте ProductType в коллекцию. – Cerad

ответ

6

Ok Cerad был прав с его комментариями, и мы должны использовать коллекцию для этого. Сначала это может показаться глупостью, но это правильно. Мне потребовалось некоторое время, чтобы обойти его.

Так что мне пришлось создать ProductType, который является arrayCollection и вставляет каждый Продукт. (Так же, как и в документации с Task и бирками)

Я использовал это:

$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 Не могли бы вы показать, как выглядит класс ProductType? – Shaolin

Смежные вопросы