symfony2多重嵌套表单原型

我想在另一个集合types中包含一个集合types。 它应该是这样的: 在这里输入图像说明

使用只有一个集合工作正常,但我需要编辑外部窗体的原型,所以它呈现每行的内部forms的原型。

任何想法我怎么能做到这一点? 另外什么是最好的方式来保存

编辑:现在我想呈现嵌套的窗体的原型:

<ul class="characteristics-container" data-prototype="{{ form_widget(form.characteristics.vars.prototype)|e }}" data-prototype-options="{{ form_widget(form.characteristics.options.vars.prototype|e ) }}"> {# iterate over each existing tag and render its only field: name #} {% for characteristic in form.characteristics %} <li>{{ form_row(characteristic.name) }}</li> <div class="characteristics-options"> {% for opt in form.characteristics.options %} {% endfor %} </div> {% endfor %} </ul> 

它在form_widget(form.characteristics.options.vars.prototype|e

 Method "options" for object "Symfony\Component\Form\FormView" does not exist in 

我试过特征[0],它说关键不存在

这是我的表单类:

PromotionType(基本forms)

 $builder ->add('characteristics','collection', array( 'label' => 'Caracteristicas', 'type' => new PromotionCharacteristicType(), 'allow_add' => true, 'allow_delete' => true, 'by_reference' => false )) 

PromotionCharacteristicType

  $builder ->add('name',NULL, array('label' => 'Nome')) ->add('options', 'collection', array( 'type' => new PromotionCharacteristicOptionType(), 'allow_add' => true, 'allow_delete' => true, 'prototype' => true, 'by_reference' => false, )) ; 

PromotionCharacteristicOptionType

  $builder ->add('name',NULL, array('label' => 'Nome')) ; 

第一级原型,工作正常。

forms和原型

您需要保留来自不同集合的两个原型。 Symfony提供将它们存储在div标签的data-prototype属性中,该标签包装了这个集合。 在你的情况下,这是非常低效的。 所以你可以用空白的div来手工渲染

例如你有字符的forms

 class CharacterType extends AbstractType { public function buildForm(FormBuilderInterface $builder, array $options) { $builder->add('opts', 'collection', array( 'type' => new OptionType(), 'allow_add' => true, 'allow_delete' => true, 'prototype' => true, 'prototype_name' => '__opt_prot__' )); $builder->add('char_desc', 'text'); } public function getName() { return 'char'; } } 

然后创build具有字符集合的表单

 $form = $this->createFormBuilder() ->add('chars', 'collection', array( 'type' => new CharacterType(), 'allow_add' => true, 'allow_delete' => true, 'prototype_name' => '__char_prot__' )) ->getForm(); # example data $form->setData( array( 'chars' => array( array('options' => array(), 'char_desc' => 1), array('options' => array(), 'char_desc' => 2), ), ) ); 

并获得原型

 <div id="prots" data-prototype-opt="{{ form_widget(form.chars.vars.prototype.children['opts'].vars.prototype) | e }}" data-prototype-char="{{ form_widget(form.chars.vars.prototype) | e }}" > </div> 

然后像这个例子那样渲染集合或重写collection_widget块

 {% for char in form.chars %} {{ form_row(char.char_desc) }} <label for="">opts</label> {% for opt in char.opts %} {{ form_row(opt.text) }} {% endfor %} {% endfor %} 

如何保存它

如果可以,请使用nosql数据库。 或者将EAV模型用于关系数据库。 但是,如果不需要search选项或对其进行sorting,则可以将序列化数组存储在数据库中,并使用doctrinetypesarray

加上Alexey B.的回答,我通常不需要使用prototype.children['opts']来访问该集合的原型。 我只是使用prototype.<collection_name>如下所示:

 <div id="prots" data-prototype-opt="{{ form_widget(form.chars.vars.prototype.opts.vars.prototype) | e }}" data-prototype-char="{{ form_widget(form.chars.vars.prototype) | e }}" > </div>