symfony - 呈现表单时忽略我的自定义表单类型模板
问题描述
我创建了一个自定义字段类型类BootstrapToggleType extends AbstractType
,它是我的子类,CheckboxType
我也给它加上了前缀,以防万一如下
public function getBlockPrefix(): string
{
return 'bootstrap_toggle';
}
public function buildForm(FormBuilderInterface $builder, array $options)
{
$builder->addEventListener(FormEvents::PRE_SET_DATA, function (FormEvent $event) {
$form = $event->getForm();
$config = $form->getParent()->get($form->getName())->getConfig();
$options = $config->getOptions();
$defaultDataOptions = $this->_bootstrapToggleDataDefaults;
$form->getParent()->add($form->getName(), CheckboxType::class, array_replace_recursive($options, [
'attr' => $defaultDataOptions,
]))
;
});
}
我将自定义表单主题添加到 twig.yamlform_themes: ['Form/custom_types.html.twig', 'bootstrap_4_layout.html.twig']
并使用以下代码创建了提到的文件
{% block bootstrap_toggle_row %}
{% for child in form.children if not child.rendered %}
<div class="my-custom-wrapper">
<div class="form-group">
{{ form_label(child) }}
{{ form_widget(child) }}
{{ form_help(child) }}
{{ form_errors(child) }}
</div>
</div>
{% endfor %}
{% endblock %}
但是,该字段是使用标准主题呈现的,而忽略bootstrap_toggle_row
了我在做什么错?
问题基本上出在这部分代码上$builder->addEventListener(FormEvents::PRE_SET_DATA, function (FormEvent $event) {
。但是我需要使用这样的构造来使用FormType
对象提供的名称创建一个字段$builder->add('is_published', BootstrapToggleType::class)
如果我将那部分代码更改为类似的东西
public function buildForm(FormBuilderInterface $builder, array $options)
{
$builder->addChild('testName', CheckboxType::class);
}
我的自定义模板正确呈现。
添加
因为我重新添加了另一个孩子,所以我必须提供正确的块前缀。
$form->getParent()->add($form->getName(), CheckboxType::class, array_replace_recursive($options, [
'attr' => $defaultDataOptions,
'block_prefix' => 'bootstrap_toggle'
]));
然后在我的自定义模板中,我需要将form
变量作为单个子项直接引用,而不是数组。所以不要循环孩子
{% for child in form.children if not child.rendered %}
直接打电话就行
{{ form_label(form) }}
{{ form_widget(form) }}
{{ form_help(form) }}
{{ form_errors(form) }}
现在它起作用了。
解决方案
推荐阅读
- python - Python datetime 始终评估为 2 个值之一,但绝不是相同的一个值
- python - 在 DIRECTED networkx 图中查找多条路径
- php - Laravel,soap API 需要登录
- python - 使用 Selenium Hangs 抓取“简单网站”
- c++ - 错误:“无法加载 DLL 函数!”
- azerothcore - 您如何更改服务器的时区以匹配本地?
- angular - 文本区域包含情感符号
- linux - “此平台不支持 SMP”
- tinymce - TinyMCE 边框样式 5.4.1:折叠与分离
- assembly - STM32。计时器不断计数过去的自动重载值?