如何使用Symfony2表单清除字段值

Ada*_*dam 11 forms symfony

我正在编写自己的CAPTCHA类,当表单没有验证时,我不想用前面的答案预先填充验证码输入,原因很明显.我只想在渲染之前清除输入.

我发现数据选项仅用于默认值,该值由用户输入的内容覆盖.我尝试了以下代码:

$form->get('captcha')->setData(null);
Run Code Online (Sandbox Code Playgroud)

..请求与表单绑定后,但AlreadyBoundException抛出一个.我实际上设法让它与:

if (isset($formView->children['captcha'])) {
    $formView->children['captcha']->vars['value'] = null;
}
Run Code Online (Sandbox Code Playgroud)

但这看起来不对,并且绝对不符合Symfony标准.我已经查看了构建表单时可以提供的其他选项,但我看不到任何注意事项.

有谁有想法吗?

顺便说一句,我有一半期望Symfony2包含一个CAPTCHA解决方案,这主要是一个学习练习,而我习惯了框架.

Ste*_*ant 5

我想你想处理这个表单字段,就像Symfony处理一个password字段:它不会被填充.我们来看看PasswordType:

namespace Symfony\Component\Form\Extension\Core\Type;

class PasswordType extends AbstractType
{
    public function buildView(FormView $view, FormInterface $form, array $options)
    {
        if ($options['always_empty'] || !$form->isSubmitted()) {
            $view->vars['value'] = '';
        }
    }

    public function configureOptions(OptionsResolver $resolver)
    {
        $resolver->setDefaults(array(
            'always_empty' => true,
            'trim' => false,
        ));
    }

    //...
}
Run Code Online (Sandbox Code Playgroud)

所以,它非常简单:只需添加FormType $view->vars['value'] = ''buildView方法(即CaptchaType).这意味着该字段的数据未被清除,但不会传递给Twig模板.方法不同,但结果相同:验证失败后密码字段保持为空.

如果你真的很懒,你可以使用PasswordType,但由于该字段的输入将被屏蔽(*****),这会使烦人的验证码字段更糟.

您的表单类型可能如下所示:

class CaptchaType extends AbstractType
{
    /**
     * {@inheritdoc}
     */
    public function buildView(FormView $view, FormInterface $form, array $options)
    {
        $view->vars['value'] = '';
    }

    /**
     * {@inheritdoc}
     */
    public function getParent()
    {
        return __NAMESPACE__.'\TextType';
    }

    /**
     * {@inheritdoc}
     */
    public function getName()
    {
        return $this->getBlockPrefix();
    }

    /**
     * {@inheritdoc}
     */
    public function getBlockPrefix()
    {
        return 'captcha';
    }
}
Run Code Online (Sandbox Code Playgroud)

编辑:刚刚发现CaptchaBundle采用了相同的方法.