我想在另一个集合类型中包含一个集合类型.它应该如下所示:
只使用一个集合工作正常,但我需要编辑外部表单的原型,因此它为每一行呈现内部表单的原型.
任何想法我怎么能这样做?还有什么是最好的保存方式
编辑:现在我正在尝试渲染嵌套表单的原型:
它给出了错误 form_widget(form.characteristics.options.vars.prototype|e
Method "options" for object "Symfony\Component\Form\FormView" does not exist in
我尝试了特征[0],它说密钥不存在
这是我的表单类:
PromotionType(基本形式)
$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')) ;
第一级原型,工作正常.
您需要保留来自不同集合的两个原型.Symfony提供将它们存储在div标签的data-prototype属性中,该属性包装集合.在你的情况下,效率非常低.所以你可以在空的div中手工渲染它
您有字符形式的示例
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'; } }
然后创建具有字符集合的表单
$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), ), ) );
并获得原型
然后像这个例子中那样渲染集合或覆盖collection_widget块
{% for char in form.chars %} {{ form_row(char.char_desc) }} {% for opt in char.opts %} {{ form_row(opt.text) }} {% endfor %} {% endfor %}
如果可以,请使用nosql数据库.或者将EAV模型用于关系数据库.但是,如果您不需要搜索选项或对它们进行排序,则可以在数据库中存储序列化数组并使用原则类型array