在Symfony

时间:2015-05-25 07:18:05

标签: forms symfony twig

我在Symfony中创建了一个表单:

$form = $this->createFormBuilder($template)
    ->add('product1', 'text')
    ->add('product2', 'text')
    ->add('save', 'submit')
    ->getForm();

现在这是我的枝条:

{{ form_start(form) }}
   {% for i in 1..2 %}
      <div class="col-md-3">
         <div class="product">
            <div class="name">
               {{ form_label(form.product{{ i }} ) }}
               {{ form_errors(form.product{{ i }} ) }}
               {{ form_widget(form.product{{ i }} ) }}
            </div>
         </div>
      </div>
   {% endfor %}
{{ form_end(form) }

主要思想是迭代for for并获得一个新的form.product<X>每个循环。 我无法使它工作,我甚至不知道是否可以这样做。有什么想法吗?

3 个答案:

答案 0 :(得分:1)

我建议你为此目的使用Collection类型。但如果你想按自己的方式去做,你应该这样做:

{{ form_start(form) }}
   {% for i in 1..2 %}
      <div class="col-md-3">
         <div class="product">
            <div class="name">
               {{ form_label( attribute(form, 'product' ~ i) ) }}
               {{ form_errors( attribute(form, 'product' ~ i) ) }}
               {{ form_widget( attribute(form, 'product' ~ i) ) }}
            </div>
         </div>
      </div>
   {% endfor %}
{{ form_end(form) }

答案 1 :(得分:1)

你是对的,它可能不会奏效。有关信息,Twig中的串联符号是&#34;〜&#34;。 在您的情况下,如果您的实体应该有2个或更多&#34;产品&#34;您应该使用集合而不是手动创建每个产品。 在您的实体中,您将拥有类似

的内容
/**
 * @ORM\OneToMany(targetEntity="Product", mappedBy="category")
 */
protected $products;

在产品实体上,你会有

 /**
 * @ORM\ManyToOne(targetEntity="Category", inversedBy="products")
 * @ORM\JoinColumn(name="category_id", referencedColumnName="id")
 */
protected $category;

然后在您的第一个实体__constructor或您的控制器中,您可以迭代创建任意数量的产品,然后将它们添加到实体中。

在您的表单中,您只需添加:

$builder->add('products', 'collection');

你可以在Twig中迭代它。

希望这会对你有所帮助

答案 2 :(得分:0)

您应该从只与“产品”实体具有ManyToOne关系的实体开始。假设我们将此实体称为“ProductContainer”。

然后为ProductContainer创建一个表单,其中只有一个类型为“collection”的字段,它将为您创建产品列表。

您可以按照本教程:http://symfony.com/doc/current/cookbook/form/form_collections.html