-1

我正在使用带有 PHP 的 MVC 框架;标准模型/page_model.php、控制器/page.php 和 view/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 回答