2013-10-15 6 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に関連する可能性があります。

$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スクリプトは常に正しくtrueまたはfalseを返している。ここで

は改訂コードです。ドキュメントによれば、true以外のものは、エラーメッセージを引き起こすはずです。しかし、エラーメッセージが表示されません。他の小切手が正常に機能しているため(例:rangelength、ここでは貼り付け済みのコードを削除しています)、エラーメッセージが機能しています。

+0

リモートメソッドのマニュアルを読んでいませんか?サーバーコードによって何が返されなければならないかが明確に説明されています。 – Sparky

+0

@ Sparky:ところで、はい、私はドキュメントを読んでいました、特に[この部分](http://jqueryvalidation.org/remote-method/):_応答はJSONとして評価され、有効な要素デフォルトのメッセージを使用して、無効な要素に対してfalse、未定義またはnullのいずれかを指定できます。または文字列、たとえば。 – brentonstrine

+0

また、有効な要素について_ _ "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

ドキュメンテーションには次のように書かれています。 "serverside応答は" true "でなければならないJSON文字列でなければなりません。 .. "しかしjusには良いt 'echo 'true';'または 'echo 'false';'そしてJSON部分を忘れる – CIRCLE

-2

文字列を戻しても自動的には表示されません。 documentation for the remote method状態

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

このヒントはありがたいですが、手動で処理するのではなくエラーを処理するためにバリデーターが必要です。それを超えて、エラーメッセージを自動的に処理するプラグインを使用して手動でその機能を回避するのは意味がありません。手動でやりたいのであれば、最初にプラグインを使用しませんでした。 – brentonstrine

2

は、サーバー側の応答が有効な要素のための"true"でなければならない、とすることができJSON文字列でなければなりませんあなたはそれを表示したい場合は、このような何かをする必要があります"false"undefined、またはnull(デフォルトのエラーメッセージを使用)。サーバー側の応答が文字列の場合、たとえば。 "That name is already taken, try peter123 instead"の場合、この文字列はデフォルトの代わりにカスタムエラーメッセージとして表示されます。


見積OP:

"スクリプトdoes_user_exist.php戻っ1ユーザーが存在するかどうか。"

これは、あなたが望むものとは逆の可能性があります。 1trueと解釈されている可能性があります。これはプラグインに "合格"したことを伝えます。ドキュメントごとに、ユーザーが存在し、エラーメッセージをトリガーする場合は、応答はfalse,undefinednull、または文字列(メッセージ)でなければなりません。

+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 
     ); 

    } 

} 

願っています!