0

我已禁用 ajax 验证,但我有'enableClientValidation'=>true 形式。会话保存在数据库中。那么 Yii 如何检查 Captcha 字段以关注另一个字段?我看不到 net-> all firebug 选项卡有任何变化。

4

3 回答 3

0

如果不调用$form->error().

如果要使用 ajax 验证或客户端验证,请务必调用..

$form->error($model, 'field')

..在需要实时验证的每个字段的视图文件中。

我希望它能解决你的问题。

于 2012-09-13T06:04:52.313 回答
0

我们大多认为客户端的验证码验证是不可能的,但它是可能的。

是的,yii 可以使用简单的哈希(一侧加密)公式在客户端进行验证码。由于这个原因,没有 ajax 请求,“我们看不到 net->all firebug 选项卡有任何变化。”(Shayan 说)

有时我们可能会认为使用 javascript 之类的开源代码不可能生成单侧哈希,但如果您根据自身加密一个句子或一个单词,这是可能的。所以要么不存在源密钥和解密密钥(类似于 php 的 crypt 函数)。php md5 函数会自动执行此操作。

var hash = jQuery('body').data('captcha.hash'); //hash in the jQuery data storage of body
if (hash == null)
    hash = 563;//this simple hash is generated by server and will be different for different captcha images
else
    hash = hash[1];
for(var i=value.length-1, h=0; i >= 0; --i) h+=value.toLowerCase().charCodeAt(i);
if(h != hash) {
    messages.push("The verification code is incorrect.");
}

因此,使用客户端验证器,验证码将在客户端和服务器中验证两次。

另一个注意事项:yii doc 的正确句子是:

基于 AJAX 的验证有一些限制。首先,它不适用于文件上传字段。其次,它不应该用于执行可能导致服务器端状态更改的验证。第三,它目前不适合使用表格数据输入。

yii 句子中的第二个注释意味着当您使用 ajax 验证时,服务器端 ajax 验证会导致服务器端会话存储库中的验证码图像代码被刷新(我几天前遇到的问题),因为在 ajax 验证过程中整个表单将被提交到服务器以仅验证一个字段。Yii 为 CCaptchaAction 提供了一个默认值为 3 的 testTime 属性,以便在之前的验证码验证成功时重用验证码。但这没有用,因为如果您的验证码字段在注册表单检查用户名时为空,则验证码验证将失败(不成功)。然而,对于我们来说,在 CCaptchaValidator 的 ajax 验证中排除验证码验证就像小菜一碟一样简单。

于 2013-11-19T21:29:25.510 回答
0

客户端验证将 JavaScript 代码放置在验证数据的页面底部,而不是使用 Ajax。由于没有在客户端存储答案的情况下无法使用 JavaScript 来验证验证码,除非您使用 Ajax,否则这是不可能的。但是 Yii 提供的内置验证码仅在表单提交时进行验证,即使启用了 Ajax 验证也是如此。

http://www.yiiframework.com/doc/api/1.1/CActiveForm它声明...

CActiveForm 在支持 AJAX 验证方面存在一些限制。首先,它不使用文件上传字段进行验证。其次,它不应该用于执行可能导致服务器端状态更改的验证。例如,它不适合执行由 CCaptchAction 完成的 CAPTCHA 验证,因为每个验证请求都会将测试数量增加一。第三,它目前不适合使用表格数据输入。

因此,如果您想在客户端验证验证码,您必须使用 Ajax,并且您必须自己编程,因为默认情况下 Yii 不提供此功能。

于 2012-08-28T01:21:19.683 回答