Php Symfony2一种形式的同一类多个实体
我想呈现一个具有相同类的多个实体的窗体。 我将显示两个字段,Price(type=text)和Enabled(type=checkbox) 我不知道我将拥有多少这些实体,所以表单必须动态地获取它们 我试着做了以下几点Php Symfony2一种形式的同一类多个实体,php,forms,symfony,doctrine-orm,Php,Forms,Symfony,Doctrine Orm,我想呈现一个具有相同类的多个实体的窗体。 我将显示两个字段,Price(type=text)和Enabled(type=checkbox) 我不知道我将拥有多少这些实体,所以表单必须动态地获取它们 我试着做了以下几点 public function buildForm(FormBuilderInterface $builder, array $options) { $builder ->add('price', 'text', array(
public function buildForm(FormBuilderInterface $builder, array $options)
{
$builder
->add('price', 'text', array(
'label' => 'Price',
'required' => true
))
->add('enabled','checkbox',array(
'label' => 'Use this currency',
))
;
}
public function setDefaultOptions(OptionsResolverInterface $resolver)
{
$resolver->setDefaults(array(
'data_class' => 'Osiris\Entity\Pricing',
'csrf_protection' => false
));
}
public function getName()
{
return 'pricingtype';
}
在我的控制器中,我创建了如下表单:
$pricingForm = $this->createFormBuilder($prices)
->add('items','collection',array(
'required' => false,
'prototype' => true,
'type' => new PricingType(),
))
->getForm()
;
在我的树枝上,我做:
{% for price in form_pricing %}
<h2>Price</h2>
<div class="row">{{ form_widget(price) }}</div>
{% endfor %}
{%用于价格的形式_pricing%}
价格
{{form_widget(price)}
{%endfor%}
然而,它只有h2价格和class=row的空div。我觉得我已经走了一半,但我不知道如何继续前进。
如果有人也知道如何在提交时获取字段,我将非常感激。我认为您在您的小树枝文件中遗漏了一个for循环 检查此示例:
{# store the prototype on the data-prototype attribute #}
<ul id="email-fields-list" data-prototype="{{ form_widget(form.emails.vars.prototype)|e }}">
{% for emailField in form.emails %}
<li>
{{ form_errors(emailField) }}
{{ form_widget(emailField) }}
</li>
{% endfor %}
</ul>
{#将原型存储在数据原型属性#}
{form.emails%}
-
{{form_errors(emailField)}
{{form_widget(emailField)}
{%endfor%}
看到这个循环,我想你需要添加到你的细枝文件中
除了循环之外,还需要添加JavaScript
检查此链接:
检查完整的代码。它将帮助您使用集合字段类型从单个实体类生成多个实体表单。我找到了解决方案 我在Controller中创建表单的方式是错误的! 我必须做到以下几点:
$pricingForm = $this->createFormBuilder(array('prices'=>$prices))
->add('prices','collection',array(
'required' => true,
'allow_add' => true,
'type' => new PricingType(),
))
->getForm()
;
使用集合时必须使用“allow_add=>true”,否则它将不向表单中添加任何PricingType实体集合
然后,由于表单是在控制器“$this->createFormBuilder(array('prices'=>$prices))
”中构建的,$prices
数组必须作为数组传递,数组键名与“->add('prices','collection',array(…)
中使用的键名相同,这是'prices'
,因此Symfony将知道在哪里绑定什么。$prices
是定价对象的数组数组(0=>newpricing())
在我的PricingType中,我有:
class PricingType extends AbstractType {
public function buildForm(FormBuilderInterface $builder, array $options)
{
$builder
->add('price', 'text', array(
'label' => false,
'required' => true
))
->add('enabled','checkbox',array(
'label' => 'Use this currency',
))
;
}
public function setDefaultOptions(OptionsResolverInterface $resolver)
{
$resolver->setDefaults(array(
'data_class' => 'XXX\XXX\Entity\Pricing',
'csrf_protection' => false
));
}
public function getName()
{
return 'pricingtype';
}
}
在这里,我需要控制标签属性。我找不到它的方法(如果有人知道,请发布方法)。我覆盖我的小枝模板,如下所示:
{% for price in form_pricing.prices %}
<div class="price-row">{{ form_row(price) }}</div>
{% endfor %}
在顶部,我们需要下一行代码:
{% form_theme form_pricing _self %}
然后按如下所示覆盖行和小部件(调试是一场噩梦):
然后在主体中,按如下方式渲染表单元素:
{% for price in form_pricing.prices %}
<div class="price-row">{{ form_row(price) }}</div>
{% endfor %}
{price%表格中的价格为_pricing.prices%}
{{表列(价格)}
{%endfor%}
我真的希望这会对你有所帮助,guyz。调试twig文件真是一场噩梦,多亏了我聪明的同事,我才这么做。这是一个很好的例子,但我不会让用户选择在表单中添加更多字段。然后不要添加JavaScript代码,只要表单和twig代码就足够了。我创建了一个定价数组并将其传递给FormBuil当我在twig中循环我的表单时({form_pricing.prices%}{{form_widget(price)}})它不会返回任何内容。有什么想法吗?来自Symfony2示例页面:在这两种情况下,除非您的电子邮件数据数组已经包含一些电子邮件,否则不会呈现任何输入字段。在这个链接中给出:您得到了您要找的解决方案吗?是的,我将其作为下面问题的答案发布。您好,这正是我试图做的,但我无法克隆你的解决方案。你如何定义你的控制器?如果你还在上面,请向我解释一下。