Symfony 4:将自定义数据传递给Form Collection原型

时间:2018-12-24 21:50:00

标签: symfony symfony-forms symfony4

当'allow_add'选项设置为true时,

CollectionType字段具有特殊的'prototype'变量。此变量可用于呈现html原型:

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

“ prototype”似乎只是用部分数据构建的集合子FormView的一个实例(例如,name设置为“ __name__”,而其他大多数var留空)。

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

1 个答案:

答案 0 :(得分:0)

回答自己的问题-在“ 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());
        }

        ...
    }
...
}