0

我无法准确理解 ajax 处理的 CActiveForm 的逻辑流程。

语境:

我正在使用 ajax 进行登录和注册。成功登录后,登录工作并将用户重定向到主页。注册有效,但在成功注册后不会将用户重定向到主页。它只是坐在那里。当然它有点工作,但我不明白它在幕后到底在做什么。

控制器代码:(控制器/模型/视图代码在登录和注册操作之间几乎完全相同)

public function actionLogin()
{
    $model = new LoginForm;

    // if it is ajax validation request
    if (isset($_POST['ajax']) && $_POST['ajax'] === 'login-form') {
        echo CActiveForm::validate($model);
        app()->end();
    }
    // render and nonajax handling here...
}

public function actionRegister() {
    $model = new RegisterForm;

    // if it is ajax validation request
    if(isset($_POST['ajax']) && $_POST['ajax'] === 'register-form')
    {
        echo CActiveForm::validate($model);
        app()->end();
    }
    // render and nonajax handling here...
}

问题:

我曾尝试进行打印行调试以查看代码最终的去向,但似乎对于 ajax 请求,代码以app()->end();. 为什么登录操作重定向我而不是注册操作?指定我将被重定向到哪里的代码在哪里?我知道对于app()->end();代码,yii 除了退出应用程序之外还会引发“onEndRequest”事件。这是重定向代码的位置吗?我在受保护的文件夹中查找了包含文本“onEndRequest”的任何内容,但找不到任何存在的迹象。

编辑:

我也想在注册后发送一封电子邮件,但如果没有正确理解这个 ajaxified CActiveForm 的逻辑流程,我就无法这样做。我会在哪里放置该代码?(我知道如何编码,我只是不知道放在哪里)

4

1 回答 1

1

TL;博士; 但几乎我的答案包含引用的句子和现有的代码,实际上它并没有太长:)

我正在使用 ajax 进行登录和注册。成功登录后,登录工作并将用户重定向到主页。注册有效,但在成功注册后不会将用户重定向到主页。它只是坐在那里。当然它有点工作,但我不明白它在幕后到底在做什么。

当您进行验证和提交表单时,它们的工作方式相同,但是您的应用程序是否重定向取决于您接下来要做什么,我正在寻找的是您的评论行`

// 渲染和 nonajax 处理在这里...`

我提出了登录代码的下一部分(Yii 默认),我认为您已经拥有了它。

// collect user input data
        if(isset($_POST['LoginForm']))
        {
            $model->attributes=$_POST['LoginForm'];
            // validate user input and redirect to the previous page if valid
            if($model->validate() && $model->login())
                $this->redirect(Yii::app()->user->returnUrl);
        }

您应该看到完成它的重定向行,我不会再谈论returnUrl了。

一旦你设置了你的表单,'enableAjaxValidation'=>true,Yii 就必须绑定看起来像的函数

jQuery('#your-form-id').yiiactiveform( ...);

这用于通过原因 ajax 验证您的表单,这意味着它将到达控制器上的两行以下

        echo CActiveForm::validate($model);
        app()->end(); //end request and return ajax result

如果您在没有 yii ajax 验证的情况下提交表单,则通过以下检查您永远不会达到以上行

if(isset($_POST['ajax']) && $_POST['ajax'] === 'your-form')

如果没有返回错误,那么一旦没有回调函数,yiiactiveform 函数接下来会做什么?让我们打开下面的源代码来检查它

\framework\web\js\source\jquery.yiiactiveform.js

我只是引用了一个必要的部分

if (settings.afterValidate === undefined || settings.afterValidate($form, data, hasError)) {
                                if (!hasError) {
                                    validated = true;
                                    var $button = $form.data('submitObject') || $form.find(':submit:first');
                                    // TODO: if the submission is caused by "change" event, it will not work
                                    if ($button.length) {
                                        $button.click();
                                    } else {  // no submit button in the form
                                        $form.submit();
                                    }
                                    return;
                                }
                            }

如果表单通过验证,它只需找到提交按钮并单击,使表单以正常方式提交。在您的情况下,这意味着表单将发布到actionRegister另一个,它不再满足 ajax 验证

public function actionRegister() {
    $model = new RegisterForm; 

    //where perform ajax validation but form which was submitted normally would not reach
      .....

//the next part what you need would come

if(isset($_POST['RegisterForm']))
    {
        $model->attributes=$_POST['RegisterForm'];
        // validate user input and redirect to the previous page if valid
        if($model->validate()){
                    //send mail here ... then redirect

            $this->redirect(Yii::app()->user->returnUrl);
             }

    }

$this->render('register',array('model'=>$model));
}
于 2013-08-20T03:22:48.513 回答