当前位置:  开发笔记 > 数据库 > 正文

symfony2多个嵌套表单原型

如何解决《symfony2多个嵌套表单原型》经验,为你挑选了1个好方法。

我想在另一个集合类型中包含一个集合类型.它应该如下所示:在此输入图像描述

只使用一个集合工作正常,但我需要编辑外部表单的原型,因此它为每一行呈现内部表单的原型.

任何想法我怎么能这样做?还有什么是最好的保存方式

编辑:现在我正在尝试渲染嵌套表单的原型:

  
    {# iterate over each existing tag and render its only field: name #} {% for characteristic in form.characteristics %}
  • {{ form_row(characteristic.name) }}
  • {% for opt in form.characteristics.options %} {% endfor %}
    {% endfor %}

它给出了错误 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')) 
        ;

第一级原型,工作正常.



1> Alexey B...:

形式和原型

您需要保留来自不同集合的两个原型.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

推荐阅读
linjiabin43
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有