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」というテキストを含むものを探しましたが、その存在を示すものは見つかりませんでした。

編集:

また、登録後にメールを送信したいのですが、この ajax 化された CActiveForm のロジックの流れを正しく理解していないと送信できません。そのコードをどこに配置しますか? (私はそれをコーディングする方法を知っていますが、どこに置くべきかわかりません)

4

1 に答える 1

1

TL;DR; しかし、ほとんどの私の回答には、引用されたセンテンスと既存のコードが含まれていますが、実際には長すぎませんでした:)

ログインと登録にajaxを使用しています。ログインが機能し、ログインに成功すると、ユーザーはホームページにリダイレクトされます。登録は機能しますが、登録が成功した後、ユーザーをホームページにリダイレクトしません。そこに座っているだけです。確かにそれはちょっとうまくいきますが、舞台裏で何をしているのか正確にはわかりません。

検証を行ってフォームを送信したときと同じように機能しますが、アプリがリダイレクトされるかどうかは、次に何をするかによって異なります。私が探していたのはコメント行です `

// render と 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を介してフォームを検証するために使用されます。これは、コントローラーの2行以下に到達することを意味します

        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 に答える