【问题标题】:Using performAjaxValidation inside a widget (Yii)在小部件中使用 performAjaxValidation (Yii)
【发布时间】:2013-11-11 15:47:23
【问题描述】:

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

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

有没有办法防止输出所有的html,所以返回一个有效的JSON字符串?

我已经尝试将 CActiveForm 中的 validationUrl 设置为另一个控制器/操作,但问题是我必须将模型与它一起发送,并且此模型是在我的小部件中确定的,而不是在 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."]}

【问题讨论】:

    标签: ajax validation yii widget


    【解决方案1】:

    我是这样解决的:

    我创建了一个完成验证的 AJAX 控制器:

    AjaxController:

        /**
         * 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,
    )); ?>
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-04-27
      • 1970-01-01
      • 1970-01-01
      • 2015-12-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多