在 Symfony 中自定义表单字段类型以显示纯文本(甚至 html)

Custom Form Field Type in Symfony to display plain text (or even html)

是否可以在 symfony 中添加一个新的表单字段类型来简单地呈现可配置的消息?我尝试添加一个新的 AlertType,它应该将给定消息呈现为 bootstrap 4 警报组件。它确实有效,但问题是,如果我在实际表单中使用此表单字段类型,则数据映射器会在分配的数据 class 中搜索 属性。但是在数据 class 中有一个 属性 是没有意义的,因为这种表单类型实际上并不需要任何用户输入。是否可以禁用表单类型的数据映射?我想是的,因为 \Symfony\Component\Form\Extension\Core\Type\ButtonType 实现了我想要实现的目标 - 但如何实现?

目前我的自定义表单域类型如下:

<?php
// src/Form/Type/AlertType.php
namespace App\Form\Type;

use Symfony\Component\Form\AbstractType;
use Symfony\Component\Form\FormInterface;
use Symfony\Component\Form\FormView;
use Symfony\Component\OptionsResolver\OptionsResolver;

class AlertType extends AbstractType
{
    /**
     * @inheritDoc
     */
    public function configureOptions(OptionsResolver $resolver): void
    {
        parent::configureOptions($resolver);

        $resolver->setDefaults(
            [
                'context' => 'danger',
                'message' => '',
            ]
        );
    }

    /**
     * @inheritDoc
     */
    public function buildView(FormView $view, FormInterface $form, array $options)
    {
        $view->vars['context'] = $options['context'];
        $view->vars['message'] = $options['message'];
    }
}

模板如下:

{% block alert_row %}
    <div class="alert alert-{{ context|escape('html_attr') }}" role="alert">
        {{ message }}
    </div>
{% endblock %}

表单类型(使用表单字段类型)是:

<?php
namespace App\Form\Type;

use App\Setup\SetupFormData;
use Symfony\Component\Form\AbstractType;
use Symfony\Component\Form\Extension\Core\Type\PasswordType;
use Symfony\Component\Form\Extension\Core\Type\SubmitType;
use Symfony\Component\Form\FormBuilderInterface;
use Symfony\Component\OptionsResolver\OptionsResolver;

class SetupFormType extends AbstractType
{
    /**
     * @inheritDoc
     */
    public function buildForm(FormBuilderInterface $builder, array $options): void
    {
        $builder
            ->add(
                'setupPassword',
                PasswordType::class
            )
            ->add(
                'warning',
                AlertType::class,
                ['message' => 'HELLO', 'context' => 'primary']
            )
            ->add(
                'save',
                SubmitType::class
            );
    }

    /**
     * @inheritDoc
     */
    public function configureOptions(OptionsResolver $resolver): void
    {
        $resolver->setDefaults(
            [
                'data_class' => SetupFormData::class,
            ]
        );
    }
}

只要 SetupFormData 有一个名为 $warning 的 属性,一切都按预期工作。但是我不喜欢将这个 属性 添加到数据 class.

如果您不想映射,只需添加此 'mapped' => false,

$builder
            ->add(
                'setupPassword',
                PasswordType::class
            )
            ->add(
                'warning',
                AlertType::class,
                ['message' => 'HELLO', 'context' => 'primary'],
                'mapped' => false,
            )
            ->add(
                'save',
                SubmitType::class
            );

从 Symfony 4+ 开始,您在 TextFormField 中有 helphelp_html 选项,并且很少有扩展表单类型。

Help Html。您可以根据需要使用额外的 html 和 css.

配置帮助文本