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

问题描述 投票:2回答:1

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

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

我有两个想法,但它们都没有奏效。

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

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

php symfony symfony-forms
1个回答
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嵌入另一种形式,它就应该有效。

© www.soinside.com 2019 - 2024. All rights reserved.