首页 > 解决方案 > 呈现表单时忽略我的自定义表单类型模板

问题描述

我创建了一个自定义字段类型类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) }}

现在它起作用了。

标签: symfonysymfony4symfony-forms

解决方案


推荐阅读