我正在编写自己的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解决方案,这主要是一个学习练习,而我习惯了框架.
我想你想处理这个表单字段,就像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采用了相同的方法.