使用输入滤波器时ZF2验证码验证忽略(ZF2 Captcha validation ignored

2019-10-20 11:23发布

我在一个CAPTCHA元素ZF2应用形式如下:

$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字段是正确验证,但显然其他领域没有验证。 什么愚蠢的错误我在做什么? 是否有“验证码”验证我的输入滤波器设置?

Answer 1:

这个问题是因为,我认为你的窗体上创建了一个名为方法:

getInputFilter();

它覆盖原始getInputFilter(),

有两种解决方法:

表单中重命名功能是getInputFilterCustom()

然后又修改:

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

或者你目前getInputFilter()内添加验证验证码的逻辑。



Answer 2:

这是我的代码在ZF2形式添加captcha图像控制:

        $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'               
                        ))
                ),
        ));

其他人构成元素使用的校验输入滤波器,但我没有使用任何验证,使其工作。

我希望这可以帮助你。



Answer 3:

这是因为你不调用父getInputFilter()内你的。 简单地做

public function getInputFilter()
{
    parent::getInputFilter();

    //... your filters here
}


文章来源: ZF2 Captcha validation ignored when using an input filter