仅在用户未被授权时添加自定义表单类型
Add custom form type only when user is not authorized
我创建了自定义表单类型 - RecaptchaType
。我使用 $builder->add('recaptcha', RecaptchaType::class)
将它添加到多种形式中。为了查看,我创建了一个宏,所以在树枝中我将其渲染如下 {{ forms.recaptcha(form.recaptcha) }}
.
但现在我只想为未登录的用户显示验证码。在 twig 宏中我可以简单地添加 if 条件。但是,如果我只想编辑 RecaptchaType 并且不想触摸正在使用它的表单类型,我该如何实现不在表单类型中添加(或删除)recaptcha 输入。
我有两个想法,但都没有奏效。
- 在 RecaptchaType 中使用函数 buildForm 并在满足条件(用户已登录)时执行
$builder->remove('recaptcha')
- 将选项 'render' 传递给
$resolver->setDefaults()
,以形式访问它并取决于值 ->add
与否。但是我无法访问该值。
你会怎么做?如果需要,我可以添加代码示例。
TL;DR; 要删除有条件地将此逻辑封装在自身中的表单类型,您可以执行以下操作:
RecaptchaType
:
public function buildForm(FormBuilderInterface $builder, array $options)
{
$builder->addEventListener(FormEvents::PRE_SET_DATA, function (FormEvent $event) {
if ($this->isAuthenticated()) {
$form = $event->getForm();
$form->getParent()->remove($form->getName());
}
});
}
现在,如果您要自定义表单主题,请确保在呈现之前检查该字段是否存在:
{% if form.recaptcha is defined %}
{{ forms.recaptcha(form.recaptcha) }}
{% endif %}
只要您的 RecaptchaType
嵌入到另一个表单中,它就应该可以工作。
我创建了自定义表单类型 - RecaptchaType
。我使用 $builder->add('recaptcha', RecaptchaType::class)
将它添加到多种形式中。为了查看,我创建了一个宏,所以在树枝中我将其渲染如下 {{ forms.recaptcha(form.recaptcha) }}
.
但现在我只想为未登录的用户显示验证码。在 twig 宏中我可以简单地添加 if 条件。但是,如果我只想编辑 RecaptchaType 并且不想触摸正在使用它的表单类型,我该如何实现不在表单类型中添加(或删除)recaptcha 输入。
我有两个想法,但都没有奏效。
- 在 RecaptchaType 中使用函数 buildForm 并在满足条件(用户已登录)时执行
$builder->remove('recaptcha')
- 将选项 'render' 传递给
$resolver->setDefaults()
,以形式访问它并取决于值->add
与否。但是我无法访问该值。
你会怎么做?如果需要,我可以添加代码示例。
TL;DR; 要删除有条件地将此逻辑封装在自身中的表单类型,您可以执行以下操作:
RecaptchaType
:
public function buildForm(FormBuilderInterface $builder, array $options)
{
$builder->addEventListener(FormEvents::PRE_SET_DATA, function (FormEvent $event) {
if ($this->isAuthenticated()) {
$form = $event->getForm();
$form->getParent()->remove($form->getName());
}
});
}
现在,如果您要自定义表单主题,请确保在呈现之前检查该字段是否存在:
{% if form.recaptcha is defined %}
{{ forms.recaptcha(form.recaptcha) }}
{% endif %}
只要您的 RecaptchaType
嵌入到另一个表单中,它就应该可以工作。