2015-03-31 85 views
2

我已发布我的解决方案作为答案。Symfony2多个同一类的实体在一个表单中(已解决)

我想渲染一个具有多个相同Class实体的表单。 我将显示2个字段,价格(type = text)和启用(type =复选框)。

我不知道这些实体有多少个,因此表单必须动态获取它们。

我曾尝试做以下

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

然而,它只带有h2价格和空行div与class = row。我觉得我在那里一半,但我不知道如何继续前进。 如果有人知道如何提交字段,我会很感激。

+0

你有你想要的解决方案吗? – 2015-04-01 13:58:32

+0

是的,我把它作为对我的问题的答案发布在下面。 – 2015-04-02 10:56:46

回答

0

我想你已经在你的树枝文件 检查错过了循环一个这个例子:

{# 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> 

见循环,我认为你需要在你的树枝文件中添加。

除了循环,您还需要添加JavaScript也。

检查此链接:

http://symfony.com/doc/current/reference/forms/types/collection.html#adding-and-removing-items

检查的完整代码。它将帮助您使用集合字段类型从单个实体类生成多个实体表单。

+0

这是一个很好的例子,但我不会给用户添加更多字段的选项。 – 2015-03-31 15:22:52

+0

然后不添加JavaScript代码,只是形式和枝条代码就足够了。 – 2015-03-31 15:25:35

+0

我创建了一个定价数组并将其传递给FormBuilder。当我把我的表格放在树枝上时( {%for price in form_pricing.prices%}

{{ form_widget(price) }}
) 它不会返回任何东西。任何想法? – 2015-03-31 15:54:57

2

我找到了解决办法

我创造了控制器的形式的方式是错误的! 我必须做到以下几点:

$pricingForm = $this->createFormBuilder(array('prices'=>$prices)) 
       ->add('prices','collection',array(
        'required'  => true, 
        'allow_add'  => true, 
        'type'   => new PricingType(), 
       )) 
       ->getForm() 
      ; 

“allow_add =>真”,收集工作时是必要的,否则会任何实体PricingType集合添加到窗体。

然后,因为该形式是在控制器“$this->createFormBuilder(array('prices'=>$prices))”内部内置,$prices阵列必须被传递与阵列的阵列KEYNAME相同一个在“->add('prices','collection',array(...)”使用,这是'prices'所以symfony会知道如何结合,其中。 $prices是一组定价对象array(0 => new Pricing())

在我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'; 
    } 
} 

在这里,我必须在标签属性控制。我无法找到它的方式(如果有人知道,请张贴如何)。我重写我的树枝模板如下:

在山顶,我们需要的下一行代码:

{% form_theme form_pricing _self %} 

然后覆盖排和Widget如下(这是一个噩梦调试):

{% block _form_prices_entry_row %} 
    {% spaceless %} 
     {{ form_widget(form) }} 
    {% endspaceless %} 
{% endblock %} 

{% block _form_prices_entry_widget %} 
    {% spaceless %} 

     {{ form_row(form.price, { 'label' : form.vars.value.getCurrency().getTitle() }) }} 
     {{ form_row(form.enabled) }} 

    {% endspaceless %} 
{% endblock %} 

在身体的话,渲染表单元素如下:

{% for price in form_pricing.prices %} 
        <div class="price-row">{{ form_row(price) }}</div> 
       {% endfor %} 

我真的希望这将帮助你guyz。调试特别是小枝文件是一场真正的噩梦,我感谢我的聪明同事。

+0

嗨,这正是我想要做的,但我无法克隆你的解。你如何定义你的控制器?如果你还在,请给我解释一下。 – mario 2016-02-17 14:55:35

相关问题