CollectionType字段具有特殊的'prototype'变量。此变量可用于呈现html原型:
data-prototype="{{ form_widget(form.collectionfieldname.vars.prototype)|e('html_attr') }}"
“ prototype”似乎只是用部分数据构建的集合子FormView的一个实例(例如,name设置为“ __name__”,而其他大多数var留空)。
所有这些魔术发生在哪里?构建表单时,可以修改哪些数据传递给原型视图吗?例如,我想将“ value”变量的默认值从空白更改为“ __val __”(在Twig模板之外)。
答案 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());
}
...
}
...
}