【问题标题】:What exactly is the flow of logic for an ajax CActiveForm? (yii framework)ajax CActiveForm 的逻辑流程到底是什么? (yii 框架)
【发布时间】:2013-08-19 22:32:08
【问题描述】:

我无法准确理解 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 的逻辑流程,我就无法这样做。我会在哪里放置该代码? (我知道怎么编码,就是不知道放哪里)

【问题讨论】:

  • 要回答您的第一个问题,为什么注册时没有重定向,您应该向我们展示您的完整 actionRegister() 代码。

标签: php yii


【解决方案1】:

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

我正在使用 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));
}

【讨论】:

  • 这也是我最初的想法,但我尝试使用firephp进行打印线调试,如果我通过ajax提交,“app()->end();”下面的代码都没有永远被执行......我很感激帮助,我想我会将其标记为已接受的答案,但问题仍然存在。我会再次尝试进一步研究...
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-08-29
  • 1970-01-01
  • 2021-12-19
  • 2010-11-06
  • 1970-01-01
  • 2014-04-15
  • 1970-01-01
相关资源
最近更新 更多