symfony - Symfony 4:将自定义数据传递给表单集合原型
问题描述
当 'allow_add' 选项设置为 true 时,CollectionType 字段具有特殊的 'prototype' 变量。此变量可用于呈现原型 html,如下所示:
data-prototype="{{ form_widget(form.collectionfieldname.vars.prototype)|e('html_attr') }}"
看起来“原型”只是使用部分数据构建的集合子 FormView 的一个实例(例如,名称设置为“__name__”,而大多数其他变量留空)。
所有这些魔法发生在哪里?是否可以在构建表单时修改传递给原型视图的数据?例如,我想将“value”变量的默认值从空白更改为“__val__”(在 Twig 模板之外)。
解决方案
回答自己的问题 - “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());
}
...
}
...
}
推荐阅读
- c# - 在树形结构 C# 中挑选循环数
- c++ - 如何在 LPCSTR 上搜索子字符串?
- javascript - 如何将数组转换为对象
- javascript - 我想创建一个带有工作下一个和上一个按钮的图像模式
- javascript - 单击按钮以显示一些弹出窗口(模态)后如何隐藏 AG-Grid
- vue.js - 使用@nuxtjs/i18n 有一小部分时间找不到此页面
- javascript - “× TypeError: this.props.tracks.map is not a function” 为什么会这样?
- r - R分层函数中有吗?
- python - Pandas 从数据行创建列类别
- excel - 尽管代码应该停止,vba 在“End Sub”之后跳转回 sub