4

複数の行を持つ単純なフォームを作成します。

コントローラ:

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() コントローラーで検証する方法は? 各入力には一意の名前が必要ですよね? ...そしておそらく、何らかの形で name="something[name][]" を設定する必要がありますが、どうすればよいですか?

4

1 に答える 1

7

Ok Cerad のコメントは正しかったので、これにはコレクションを使用する必要があります。最初はばかげているように聞こえるかもしれませんが、それはちょっと正しいです。それを理解するのにしばらく時間がかかりました。

したがって、arrayCollection であり、各製品を挿入する ProductsType を作成する必要がありました。(タスクとタグを含むドキュメントのように)

私はそれを使用しました:

$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 %}

クール!

于 2012-09-12T11:13:20.730 に答える