我正在使用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;
});
如何在表单提交上重新加载验证码?
由于
答案 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。
希望有所帮助。