-1

PHP で MVC フレームワークを使用しています。標準モデル/page_model.php、コントローラー/page.php、およびビュー/page.php。

私はユーザー登録スクリプトを持っています (ここから適応: php-login.netは、ユーザーが不適格に登録した場合にエラーメッセージを返します (たとえば、電子メールは既に取得されています):

私の controller/register.php では、これは次のように実現されます。

    function register_action() {

    $registration_successful = $this->model->registerNewUser();

    $this->view->errors = $this->model->errors;

    if ($registration_successful == true) {
       $this->view->render('register/success');    //  view/register/success.php
    } else {
        $this->view->render('register/error');  // view/register/error.php
    }        

}

model/register_model.php スクリプトでは、エラーが作成されると、特定のエラー メッセージで終了します。例えば

else {
  $this->errors[] = FEEDBACK_UNKNOWN_ERROR
}    

そして、このエラーはレンダリングされたビュー (view/register/error.php) に表示されます:

<?php

if (isset($this->errors)) {

    foreach ($this->errors as $error) {
        echo '<div class="system_message">'.$error.'</div>';
    }

}

?>

これはすべてうまくいきます。さて、私の質問: 現時点では、ユーザーが複数のページからフォームを送信できるようにしています。エラーが発生するたびに、レジスタ/エラーをレンダリングします。ユーザーが別のページに送信されないように、実際にエラーを現在のページとインラインで返すにはどうすればよいですか (つまり、エラーメッセージが現在のビュー、ajax スタイルに挿入されます)。

私は、彼らがサイト エクスペリエンスのどこにいるかを失いたくないのです。理想的にはこれは PHP のみですが、コードの実装方法について具体的に教えていただければ、AJAX に関する回答もお願いします。

4

1 に答える 1

2

次のように実行できます: コントローラーで - 次のような json でエンコードされた配列を返します

try {
    if($this->model->registerNewUser())
       return json_encode( Array( "status" => "success", "message" => "Registration successful"));
    throw new Exception("Validation Errors");
}
catch (Exception $e) {
   return json_encode( Array( "status" => "error", "errormsgs" => $this->model->errors ));
}

そして今、このようなあなたのajaxコード

var form = $("#registrationForm");
form.on("submit", function(){
   $.ajax({
       url: form.attr("action"),
       data: form.serialize(),
       type: "POST",
       dataType: "json",
       success: function(data){
            var message = $("<div></div>").addClass("alert");
            if(data.status === "success"){
                 message.addClass("alert-success").html(data.message).appendTo(form);
            }
            elseif(data.status === "error"){
                 for( var error in data.errormsgs ){
                     message.append("<div>"+error+"</div>");
                 }
                 message.addClass("alert-error").appendTo(form);
            } 
            window.setTimeout(function(){ message.fadeOut("slow") }, 2000 );
       }
  });
  return false;
});

2 つのポインター - ValidationException をいくつか作成してスローすることをお勧めします。そうすれば、誤って他のものをキャッチすることはありません。次に、registerNewUser() では camelCase を使用しますが、他のすべてでは snake_case を使用するネーミングに取り組みたいと思うかもしれません。コードの読みやすさと書式設定に適しています。

于 2013-10-12T11:43:42.390 に答える