2013-10-15 4 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는 이제 true/false으로 인코딩 된 JSON을 보내고 있습니다. 우리는 다음과 같은 방법으로 백엔드 응답을 전송 시도하지만, 플러그인은 우리가하는 일에 상관없이 그것을 잡는하지하지 않는 것 :

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

를 지금까지 내가 문서, 다음 중 하나를 기반으로 말할 수있는 근무해야합니다

응답이 JSON으로 평가하고 유효한 요소 에 대한 진실해야하고 할 수있는 모든 거짓 정의되지 않았거나 기본 메시지를 사용하여 잘못된 요소에 대한 널 (null);

참고로이 질문에 대한 대답은 this issue과 관련이 있습니다. PHP 스크립트는 항상 올바르게 true 또는 false을 반환

$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." 
    } 
}); 

: 여기

는 수정 된 코드입니다. 설명서에 따르면 true을 제외한 모든 항목에서 오류 메시지가 표시됩니다. 그러나 오류 메시지가 나타나지 않습니다. 다른 체크가 잘 작동하고 있기 때문에 오류 메시지가 작동하고 있음을 알고 있습니다 (예 : rangelength, 붙여 넣기 된 코드에서 제거하여 명확하게 나타남).

+0

원격 메소드에 대한 설명서를 읽지 않았습니까? 그것은 당신의 서버 코드에 의해 반환되어야하는 것을 명확하게 설명합니다. – Sparky

+0

@ Sparky : 그런데 예 (특히이 부분) (http://jqueryvalidation.org/remote-method/)를 읽었습니다 : _ 응답은 JSON으로 평가되며 유효한 요소에 대해 true 여야합니다 기본 메시지를 사용하여 잘못된 요소에 대해 false, undefined 또는 null 일 수 있습니다. 또는 문자열, 예를 들어. "그 이름은 이미 취해진 상태입니다. 대신에 peter123을 시도해보십시오."오류 메시지로 표시하려면 – brentonstrine

+0

또한 인용 : _ "유효한 요소에 대해"true 여야합니다. "_ ~ 사용자가 존재하지 않을 때 'true'를 반환합니까? 귀하의 '1'은 문자열 또는 '사실'로 해석됩니까? 우리는 이미 '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 문자열이어야합니다. .. "하지만 jus 더 낫다. t echo'true ';'또는'echo'false ';'그리고 JSON 부분을 잊어 버린다. – CIRCLE

-2

문자열을 반환해도 자동으로 표시되지 않습니다. 당신이 그것을 표시 할 경우이 같은 것을 수행해야합니다

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

이 팁을 주셔서 감사합니다.하지만 수동으로 처리하는 대신 오류를 처리하기 위해 유효성 검사기가 필요합니다. 툴팁스터와 통합하고 있지만 그 이상으로 자동으로 오류 메시지를 처리하는 플러그인을 사용하고 수동으로 플러그인을 수행하는 것을 피하는 것이 바람직하지 않습니다. 수동으로 처리하고 싶다면 처음에는 플러그인을 사용하지 않았을 것입니다. – brentonstrine

2

documentation for the remote method 상태 :

는 서버 측 응답이 유효한 요소에 대한 "true"을해야 JSON 문자열이어야하고 될 수 있습니다 잘못된 오류 메시지의 경우 "false", undefined 또는 null입니다. 서버 측 응답이 문자열 인 경우. "That name is already taken, try peter123 instead",이 문자열은 기본값 대신 사용자 지정 오류 메시지로 표시됩니다.


견적 OP :

"스크립트 does_user_exist.php 반환 1 사용자가 존재합니다."

이것은 원하는 것과 반대 일 수 있습니다. 은 true으로 해석 될 수 있습니다.이 플러그인은 플러그인에 유효성 검사를 "통과"했음을 알립니다. 문서 당 사용자가 존재하고 오류 메시지를 트리거하려는 경우 응답은 false, undefined, 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 
     ); 

    } 

} 

희망!

관련 문제