如何通过Ajax重新加载表单上的验证码?

时间:2012-01-30 19:43:52

标签: php jquery zend-framework zend-form captcha

我正在使用Ajax提交表单。我在我的表单上使用验证码,当我提交表单时没有任何验证错误,它第一次工作正常。有时,服务器会返回一些验证错误,但不会提交表单。此时我需要刷新验证码图像而不重新加载整个页面。

Zend表格中的验证码:

$captcha= new Zend_Form_Element_Captcha('captcha', array(
                'id'=>'captcha',
                'title'=>'Security Check.',
                'captcha'  => array(
                'captcha'  => 'Image',
                'required' => true,
                'font'     => '../public/fonts/ARIALN.TTF',
                'wordlen'  => '6',
                'width'    => '200',
                'height'   => '50',
                'imgdir'   => '../public/images/captcha/',
                'imgurl'   => '/images/captcha/'
                )));

表单提交的jQuery:

jQuery('form.AjaxForm').submit( function() {

    $.ajax({
        url     : $(this).attr('action'),
        type    : $(this).attr('method'),
        dataType: 'json',
        data    : $(this).serialize(),
        success : function( data ) {
                      // reload captcha here
                      alert('Success'); 
                  },
        error   : function( xhr, err ) {
                      // reload captcha here
                      alert('Error');
                }
    });

    return false;
}); 

如何在表单提交上重新加载验证码?

由于

1 个答案:

答案 0 :(得分:1)

我目前没有示例,但我查看了如何在表单中生成验证码,我认为您可能需要做的是在json中为captcha表单元素返回一个新的html代码如果表单验证失败,则回复。

captcha元素使用对创建并存储在images文件夹中的图像的引用,而html格式使用与该图像关联的id。

如果您拨打$yourForm->getElement('captcha')->render();并将其添加到json响应,则可以使用新的验证码元素更新您的页面。唯一的问题是使用默认装饰器调用render也可能返回<dt><dd>标签,你将不得不用html中的javascript替换它。如果您使用自定义装饰器,那么它可能会有所不同,或者您只能渲染图像和隐藏字段而不是标签并将其插入到div标签中。

// in your controller where the form was validated
$form = new Form();
if (form->isValid($this->getRequest()->getPost()) == false) {
    $captcha = $form->getElement('captcha')->render();
    $json['captchahtml'] = $captcha;
}

$this->view->json = json_encode($json);

然后在你的jquery success回调中,检查表单是否验证失败并更新验证码html。

希望有所帮助。