2013-11-11 3 views
0

Я создал виджет с CActiveForm в нем. Все работает нормально, но теперь я хочу включить проверку ajax для него.Использование performAjaxValidation внутри виджета (Yii)

Проблема заключается в том, что вывод моей проверки ajax содержит, помимо строки JSON проверки, все (и ее часть, так как Yii::app()->end() останавливает остальные) моего html. Не странно, потому что я использую его внутри виджета, и запрос проверки выполняется для контроллера/действия, где я разместил этот виджет.

Есть ли способ предотвратить вывод всех html, поэтому возвращается действительная строка JSON?

Я уже пытался установить validationUrl в CActiveForm другому контроллеру/действию, но проблема в том, что я должен отправить модель с ней, и эта модель определяется в моем виджете, а не в validationUrl.

Widget:

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."]} 

ответ

2

Я решил это так:

Я создал 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, 
)); ?> 
Смежные вопросы