首页 > 解决方案 > Symfony 4:将自定义数据传递给表单集合原型

问题描述

当 'allow_add' 选项设置为 true 时,CollectionType 字段具有特殊的 'prototype' 变量。此变量可用于呈现原型 html,如下所示:

data-prototype="{{ form_widget(form.collectionfieldname.vars.prototype)|e('html_attr') }}"

看起来“原型”只是使用部分数据构建的集合子 FormView 的一个实例(例如,名称设置为“__name__”,而大多数其他变量留空)。

所有这些魔法发生在哪里?是否可以在构建表单时修改传递给原型视图的数据?例如,我想将“value”变量的默认值从空白更改为“__val__”(在 Twig 模板之外)。

标签: symfonysymfony-formssymfony4

解决方案


回答自己的问题 - “entry_options”设置中定义的值用于构建原型。可以像这样将这些值传递给表单构建器:

$builder
            ->add('email', CollectionType::class, array(
                ...
                'entry_options' => array(
                    'someoption' => 'somevalue',
                ),
                ...
                ))

如果这还不够,可以通过覆盖“CollectionType”类中的“buildForm”方法来修改默认行为,该方法负责收集选项和构建原型:

class CollectionType extends AbstractType
{
    ...

    public function buildForm(FormBuilderInterface $builder, array $options)
    {
        if ($options['allow_add'] && $options['prototype']) {
            $prototypeOptions = array_replace(array(
                'required' => $options['required'],
                'label' => $options['prototype_name'].'label__',
            ), $options['entry_options']);

            if (null !== $options['prototype_data']) {
                $prototypeOptions['data'] = $options['prototype_data'];
            }

            $prototype = $builder->create($options['prototype_name'], $options['entry_type'], $prototypeOptions);
            $builder->setAttribute('prototype', $prototype->getForm());
        }

        ...
    }
...
}

推荐阅读