仅在未授权用户时添加自定义表单类型

时间:2017-09-15 10:52:33

标签: php symfony symfony-forms

我创建了一个自定义表单类型 - RecaptchaType。我使用$builder->add('recaptcha', RecaptchaType::class)将其添加到多种形式中。对于视图,我创建了一个宏,因此在twig中我将其呈现如下{{ forms.recaptcha(form.recaptcha) }}

但现在我只想为未登录的用户显示recaptcha。在twig宏中,我可以简单地添加条件。但是,如果我只想编辑RecaptchaType并且不想触摸正在使用它的表单类型,那么如何才能在表单类型中添加(或删除)recaptcha输入。

我有两个想法,但它们都没有起作用。

  • 在RecaptchaType中使用函数buildForm并在满足条件时执行$builder->remove('recaptcha')(用户已登录)
  • 将选项'呈现'传递给$resolver->setDefaults(),在表单中访问它并依赖于值->add。但我无法访问该值。

你会怎么做?如果需要,我可以添加代码示例。

1 个答案:

答案 0 :(得分:3)

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嵌入到其他表单中,就应该有效。