2012-08-27 65 views

回答

0

客戶端驗證將JavaScript代碼放置在驗證數據而不是使用Ajax的頁面底部。由於沒有使用JavaScript驗證驗證碼的方法,因爲沒有在客戶端存儲答案,除非使用Ajax,否則這是不可能的。但Yii提供的內置Captcha只在表單提交時驗證,即使啓用了Ajax驗證。

http://www.yiiframework.com/doc/api/1.1/CActiveForm它指出...

有關於它的AJAX 驗證support.First CActiveForm一定的侷限性,它不與文件上傳 fields.Second驗證,它不應該被用來執行可能導致服務器端狀態改變的驗證。例如,它不適合於 執行CCaptchAction所做的CAPTCHA驗證,因爲每個 驗證請求都會將測試次數增加1。第三, 它不適用於表格數據輸入。

所以如果你想在客戶端驗證Captcha,你必須使用Ajax,你必須自己編寫這個程序,因爲Yii默認不提供這個功能。

0

如果沒有撥打$form->error(),Ajax /客戶端驗證將不起作用。

如果你想使用AJAX驗證或客戶端驗證,一定要打電話..

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

..in爲需要現場確認每個字段的視圖文件。

我希望它能解決您的問題。

0

我們大多認爲客戶端的驗證碼驗證是不可能的,但它是可能的。

是的yii可以使用簡單的哈希(單邊加密)公式在客戶端進行驗證碼驗證。由於這個原因,沒有Ajax請求和「我們看不到任何變化在網絡 - >所有螢火蟲選項卡。」(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."); 
} 

因此,使用客戶端驗證器驗證碼將驗證在客戶端和服務器兩次。

而另注:從警予DOC正確的一句是:

基於AJAX的驗證有一些限制。首先,它不適用於文件上傳字段。其次,它不應該用於執行可能導致服務器端狀態更改的驗證。第三,它的設計目前不是用於表格數據輸入。

在警予句子第二個音符,當你正在使用AJAX驗證手段,服務器端AJAX驗證導致在服務器端的會話信息庫的驗證碼圖像的代碼被刷新,因爲(我過些天前的問題)在ajax驗證過程中,整個表單將被逐個提交給服務器,以驗證只有一個字段。 如果前面的驗證碼驗證成功,Yii將默認值爲3的testTime屬性授權給CCaptchaAction以重用驗證碼。但它沒有用處,因爲如果註冊表單在逐個檢查用戶名時驗證碼字段爲空,則驗證碼驗證將失敗(不成功)。然而,對於我們來說,解決方案就像一塊蛋糕或蛋糕一樣簡單,以便在CCaptchaValidator的ajax驗證中排除驗證碼驗證。