使用输入过滤器时忽略ZF2 Captcha验证

时间:2014-07-16 10:21:21

标签: php validation zend-framework2 captcha input-filter

我的ZF2应用程序中有一个表单,其中包含CAPTCHA元素,如下所示:

$this->add(array(
        'type' => 'Zend\Form\Element\Captcha',
        'name' => 'captcha',
        'attributes' => array(
            'class'=>'form-control',
        ),
        'options' => array(
            'label' => 'Please verify you are human.',
            'captcha' => array('class' => 'Dumb')
        ),
    ));

我有一个附加到表单的输入过滤器,用于验证表单中的其他元素(名称,电子邮件,消息)。如果将其附加到表单,则在检查是否有效时将忽略CAPTCHA字段的验证。

if ($request->isPost()) {          
        // set the filter
        $form->setInputFilter($form->getInputFilter());
        $form->setData($request->getPost());
        if ($form->isValid()) { ...

如果我删除了输入过滤器,则CAPTCHA字段被正确验证,但显然其他字段没有验证器。我犯的是什么愚蠢的错误?我必须在输入过滤器中设置“CAPTCHA”验证器吗?

2 个答案:

答案 0 :(得分:1)

问题是因为,我假设您在表单上创建了一个名为:

的方法

getInputFilter();

覆盖原始的getInputFilter(),

有两种解决方案:

将表单上的函数重命名为getInputFilterCustom()

然后修改:

if ($request->isPost()) {          
    // set the filter
    $form->setInputFilter($form->getInputFilterCustom());

或在当前的getInputFilter()内添加逻辑以验证验证码。

答案 1 :(得分:0)

这是我在ZF2表单中添加验证码图像控件的代码:

        $this->add(array(
                'name' => 'captcha',
                'type' => 'Captcha',
                'attributes' => array(
                        'id'    => 'captcha',
                        'autocomplete' => 'off',
                        'required'     => 'required'
                ),
                'options'    => array(
                        'label' => 'Captcha :',
                        'captcha' => new \Zend\Captcha\Image(array(
                            'font' => 'public/fonts/arial.ttf',
                            'imgDir' => 'public/img/captcha',
                            'imgUrl' => 'img/captcha'               
                        ))
                ),
        ));

其他表单元素正在使用输入过滤器中的验证器,但我没有使用任何验证器来使其工作。

我希望这可以帮到你。