在 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 中有 help 和 help_html 选项,并且很少有扩展表单类型。
Help Html。您可以根据需要使用额外的 html 和 css.
配置帮助文本
是否可以在 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 中有 help 和 help_html 选项,并且很少有扩展表单类型。
Help Html。您可以根据需要使用额外的 html 和 css.
配置帮助文本