2013-10-15 57 views
5

我使用remote方法jQuery Validation來檢查系統中是否已存在用戶名。如果用戶存在,則腳本does_user_exist.php返回1來自jQuery的錯誤響應驗證遠程無法正常工作

$registration.find(".username").each(function() { 
    var $this = $(this); 
    $this.rules('add', { 
     remote: { 
      url: "does_user_exist.php", 
      type: "post", 
      dataType: "json", 
      data: {uname: function(){ return $this.val(); } }, 
      async: false, 
      success: function (data) { //returns 1 if user exists 
       if (data) { 
        console.log("false!"); 
        return "Sorry, that user already exists." //doesn't work 
        //return false;  //doesn't work 
        //return data;   //doesn't work 
        //return {"string"}; //doesn't work 
        //return {0: "string"};//doesn't work 
       } else { 
        console.log("true!"); 
        return true; 
       } 
      } 
     }, 
     messages: { 
      remote: jQuery.format("{0}") //doesn't work 
      // remote: "Simple string doesn't work here either" 
     } 
    }); 
}); 

我的問題是,從不顯示錯誤消息。我可以從我的console.log輸出中看到,當用戶存在時它正確記錄了false!,但錯誤消息從不出現。

正如你可以從註釋行中看到的,我一直試圖通過猜測和檢查來弄清楚我到底做了什麼錯誤,假設我以某種方式返回了錯誤字符串錯誤的格式,但我沒有成功。

編輯3: 我能夠得到後端響應被改變。 PHP現在發送的JSON編碼爲true/false,無濟於事。我們試圖發送通過以下方式後端迴應,但該插件似乎並沒有被不管接住我們做什麼:

json_encode(false) 
json_encode('["false"]') 
json_encode("false") 
json_encode(["false"]) 
"false" 
false 
NULL 
"" 
0 

至於我可以根據記錄,其中之一就告訴應該有工作:

的響應被評估爲JSON,並且必須是有效的元素, 真實,可以是任何虛假,未定義或爲空無效元素,使用 默認的消息;

注意,這個問題的答案可能與this issue有關。

下面是修改後的代碼:

$registration.find(".username").each(function() { 
    var $this = $(this); 
    remote: { 
     url: "does_user_exist.php", 
     type: "post", 
     data: {entityExistence: function(){return $this.val();} }, 
     success: function(data){ console.log(data); } 
    }, 
    messages: { 
     remote: "Sorry, that username is not available." 
    } 
}); 

PHP腳本總是返回truefalse正確。根據文檔,除了true之外的任何內容都會觸發錯誤消息。但是錯誤信息沒有出現。我知道錯誤消息正在工作,因爲還有其他檢查正在正常工作(例如rangelength,爲了清晰起見從此粘貼代碼中刪除)。

+0

您沒有閱讀遠程方法的文檔?它清楚地解釋了你的服務器代碼必須返回的內容。 – Sparky

+0

@Sparky:順便說一下,是的,我確實閱讀了它的文檔,特別是[這部分](http://jqueryvalidation.org/remote-method/):_響應評估爲JSON,對於有效元素必須爲真,並且對於無效元素,可以使用默認消息爲false,undefined或null;或一個字符串,例如。 「該名稱已被佔用,請嘗試使用peter123」來顯示錯誤消息._ – brentonstrine

+0

同時引用:_「對於有效元素必須爲」true「_〜當用戶不存在時返回」true「?你的'1'被解釋爲一個字符串還是'true'?我們已經知道'1'不是_「false,undefined或null」_ – Sparky

回答

6

好吧,最後想出來,隨機。 success回調顯然毀了一切。我所要做的就是刪除此:只要我做了,一切工作完全按預期使用簡單的字符串響應

success: function(data){ 
    console.log(data); 
} 

"true" 

"false" 

我可以不解釋這一點,但我希望有人更新文檔!我注意到使用complete並不會像success那樣破壞它。

+2

我也有這個工作,通過簡單地讓我的PHP腳本'echo「true」;'或'echo「false」'。 – stursby

+0

該文檔說:「服務器端響應必須是必須爲'true'的JSON字符串。 ..「但更好的理由t'echo'true';''或'echo'false';'忘記JSON部分 – CIRCLE

-2

返回字符串不會自動顯示它。如果要顯示它您需要做這樣的事情:

$('#myDiv').html('<p class="error">Sorry, that user already exists.</p>'); 
+2

感謝你提供這個技巧,但是我需要驗證器來處理錯誤,而不是手動處理錯誤,我將它與tooltipster集成在一起,但是除此之外,使用自動處理錯誤消息的插件沒有意義,然後繞過該功能手動執行該操作。如果我想手動執行此操作,我將不會首先使用該插件。 – brentonstrine

2

documentation for the remote method狀態:

的服務器端的響應必須是一個JSON字符串必須"true"的有效元素,並且可以"false"undefinednull對於無效元素,使用默認錯誤消息。如果服務器端響應是一個字符串,例如。 "That name is already taken, try peter123 instead",此字符串將顯示爲自定義錯誤消息以代替默認值。


報價OP:

「劇本does_user_exist.php返回該用戶是否存在1」。

這可能與你想要的相反。由於1可能會被解釋爲true,它告訴插件「通過」驗證。根據文檔,如果用戶存在並且您想要觸發錯誤消息,則響應必須是falseundefined,null或字符串(消息)。

+0

請參閱我的編輯,我能夠更改PHP響應,但同樣的問題正在發生。 – brentonstrine

+0

@brentonstrine,你有沒有嘗試過'echo「true」'?請參閱:http://stackoverflow.com/a/18862144/594235 – Sparky

2

不幸的是,上面的答案有點神祕。

爲了得到它的工作,你需要遵循JS。

$('#register-form').validate({ 
    rules: { 
     'first-name': "required", 
     'surname': "required", 
     'email': { 
      required: true, 
      email: true, 
      remote: { 
       url: 'ajax/users/emailInUse', 
       type: 'post', 
       data: { 
        email: function() { 
         return $('input[name=email]').val(); 
        } 
       } 
      } 
     }, 
     'username': "required", 
     'password': "required", 
     'confirm-password': { 
      equalTo: "input[name=password]" 
     } 
    }, 
    messages: { 
     'first-name': "Please enter your first name", 
     'surname': "Please enter your surname", 
     'email': { 
      required: "Please enter your email address", 
      email: "Please enter a valid email e.g. [email protected]" 
     }, 
     'username': "Please enter a username", 
     'password': "Please enter a password", 
     'confirm-password': "Passwords do not match" 
    } 
}); 

和你的後端代碼應運行檢查郵件是否是有效還是無效,並返回結果爲JSON字符串中的消息。例如

[ 
    " is already in use..." 
] 

例後端代碼:

public function emailInUseAction() 
{ 

    $this->setJsonResponse(); 

    if($this->request->isAjax()) 
    { 

     $email = $this->request->getPost('email'); 

     $emailInUse = Users::emailInUse($email); 

     $message = false; 

     if($emailInUse) 
     { 

      $message = $email . ' is already in use...'; 

     } 

     return array(
      $message 
     ); 

    } 

} 

希望這有助於人誰遇到的問題!