0

我创建了一个带有 CActiveForm 的小部件。一切正常,但现在我想为其启用 ajax 验证。

问题是我的 ajax 验证的输出除了包含验证 JSON 字符串之外,还包含Yii::app()->end()我的 html 的所有(以及它的一部分,因为停止了其余部分)。并不奇怪,因为我在一个小部件中使用它并且验证请求是对我放置这个小部件的控制器/动作完成的。

有什么方法可以防止输出所有的 html,所以返回一个有效的 JSON 字符串?

我已经尝试将validationUrlCActiveForm 中的

小部件:

    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 的小部件的视图中,我添加了 validationUrl,指的是 ajax/validate:

小部件/视图/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 回答