0

CActiveForm を含むウィジェットを作成しました。すべて正常に動作しますが、今は ajax 検証を有効にしたいと考えています。

問題は、ajax 検証の出力に、検証 JSON 文字列に加えてYii::app()->end()、html のすべて (残りを停止するため、その一部) も含まれていることです。ウィジェット内で使用していて、このウィジェットを配置したコントローラー/アクションに対して検証要求が行われるため、奇妙ではありません。

有効な JSON 文字列が返されるように、すべての html を出力しないようにする方法はありますか?

私はすでにvalidationUrlCActiveForm の を別のコントローラー/アクションに設定しようとしましたが、問題はモデルを送信する必要があり、このモデルはvalidationUrlではなくウィジェットで決定されることです。

ウィジェット:

    public function run()
    {

        $model = new User;
        $model->scenario = 'create';

        $this->performAjaxValidation($model);

        if (isset($_POST['User'])) {

            $model->attributes = $_POST['User'];

            if ($model->save()) {



            }

        }

        $this->render('register-form', array(
            'model' => $model
        ));

    }

    /**
     * Performs the AJAX validation.
     * @param User $model the model to be validated
     */
    protected function performAjaxValidation($model)
    {
        if(isset($_POST['ajax']))
        {
            echo CActiveForm::validate($model);
            Yii::app()->end();
        }
    }

performAjaxValidation() の出力 (ajax 呼び出し):

.. more html here ..
<section class="box">

    <h1>Register form simple</h1>

    {"UserPartialSignup_email":["Email is geen geldig emailadres."]}
4

1 に答える 1

2

私はこのように解決しました:

検証が行われる AJAX コントローラーを作成しました。

Ajaxコントローラー:

    /**
     * Validates a model.
     *
     * Validates a model, POST containing the data. This method is usually used for widget based forms.
     *
     * @param $m model name which have to be validated
     * @param $s scenario for this model, optional.
     * @return string JSON containing the validation data
     */

     public function actionValidate($m, $s = null)
     {

        if ($this->checkValidationData($m, $s) && isset($_POST['ajax']))
        {
            $model = new $m;
            $model->scenario = $s;

            echo CActiveForm::validate($model);
            Yii::app()->end();


        } else {

            throw new CHttpException(500, 'No valid validation combination used');

        }

     }

モデル名とシナリオをGETパラメーターとして指定できます。この組み合わせがcheckValidationData()メソッドで許可されているかどうかを確認しています。

CActiveForm が配置されているウィジェットのビューで、ajax/validate を参照して validationUrl を追加しました。

ウィジェット/ビュー/registerform.php:

<?php $form = $this->beginWidget('CActiveForm', array(
    'id'=>'signup-form-advanced',
    'enableAjaxValidation'=>true,
    'clientOptions' => array(
        'validationUrl' => array('ajax/validate', 'm' => get_class($model), 's' => 'create')
    )
    //'enableClientValidation'=>true,
)); ?>
于 2013-11-12T10:52:22.520 に答える