Когда ajaxVar инициализируется в CActiveForm

О CActiveForm в документе: (раздел CustomerOptions)

ajaxVar: string, имя параметра, указывающего запрос, является запросом AJAX. Когда активирована проверка AJAX, параметр, названный как это свойство, будет отправлен вместе с другими данными формы на сервер. Значение параметра – это идентификатор формы. Затем сторона сервера может определить, кто инициирует проверку AJAX и соответственно реагирует. По умолчанию используется «ajax».

Теперь загляните в мой пример: Резюме: у меня есть форма с двумя полями mail и newEmail , я отправил форму через ajaxSubmitButton (если вам нужен код формы, скажите, что я положил его). В следующем я получаю var_dump($_POST) в двух состояниях:

Во-первых: после var_dump ($ _ POST), когда поле (newEmail) остается пустым:

 array 'User' => array 'email' => string 'user@gmail.com' (length=14) 'newEmail' => string '' (length=0) 

Во-вторых: после var_dump ($ _ POST), когда все поля заполняются:

 array 'User' => array 'email' => string 'user@gmail.com' (length=14) 'newEmail' => string 'admin@gmail.net' (length=19) 'ajax' => string 'email-form' (length=10) 'yt0' => string 'update' (length=18) 

Как вы видите, только когда все поля заполнены, ajaxVar(ajax) существует в $_POST . Когда ajaxVar(ajax) инициализирован в CActiveForm?


редактировать

электронная почта форма:

 <?php <div class="form"> <?php $form = $this->beginWidget('CActiveForm',array( 'id'=>'email-form', 'enableAjaxValidation'=>true, 'clientOptions'=>array( 'validateOnSubmit'=>true, 'focus'=>'input[type="email"]:first', ) )); ?> <div class="row"> <?php echo $form->label($model,'email') ?> <?php echo $form->textField($model,'email') ?> <?php echo $form->error($model,'email') ?> </div> <div class="row"> <?php echo $form->label($model,'newEmail') ?> <?php echo $form->textField($model,'newEmail') ?> <?php echo $form->error($model,'newEmail') ?> </div> <hr> <div class="row"> <?php echo CHtml::ajaxSubmitButton( 'update', Yii::app()->createUrl('upanel/user/CEmail'), array( 'dataType'=>'json', 'type' => 'POST', 'data' => "js:$('#email-form').serialize()", 'success'=>'function(data){ if(data.status=="success") { //alert(data.status); hideFormErrors(form="#email-form"); callback(status=data.status); }else{ formErrors(data,form="#email-form"); } }', 'beforeSend'=>'before', ), array( 'id' => 'update-button'.uniqid(), 'class'=>'submit-button' ) ); ?> </div> <?php $this->endWidget() ?> </div> <?php echo $form->errorSummary($model,'please solve following errors:') ?> 

actionCEmail:

 public function actionCEmail() { /*ob_start(); var_dump($_POST); $log=ob_get_contents(); $fp = fopen('data.html', 'w'); fwrite($fp, $log); fclose($fp); Yii::app()->end();*/ //This block active whenever i want see the $_POST content $model = $this->loadModel(Yii::app()->user->id); $model->scenario = 'CEmail'; $this->performAjaxValidation($model,'email-form'); if(Yii::app()->request->isAjaxRequest) $this->renderPartial('_cemail',array('model'=>$model),false,true); else $this->render('update',array('model'=>$model,'form'=>'_cemail')); } protected function performAjaxValidation($model,$form) { if(isset($_POST['ajax']) && $_POST['ajax']===$form) { echo CActiveForm::validate($model); Yii::app()->end(); } } 

 ajaxVar 

инициализируется onsubmit, если 'validateOnSubmit'=>true, ,. Попробуйте использовать validateOnChange=>true и покажите свой код cactiveform при его инициализации.

И действительно прекратите изобретать «байкль». Попробуйте прочитать http://learnyii.blogspot.com/2010/12/yii.html, если вы не поняли мой код в предыдущем вопросе. Я показал вам рабочий код проверки ajax, который я использую в рабочем проекте. И с помощью этого метода ваш $_POST будет обновлять при изменении всех полей с объектом JSON, который будет содержать ошибки для формы.

Прекратите наводнение сообщества. С уважением.

В ваших действиях:

  public function actionCEmail() { $model = $this->loadModel(Yii::app()->user->id); $model->scenario = 'CEmail'; if(Yii::app()->request->isAjaxRequest) { $error = CActiveForm::validate($model); if($error!='[]') { echo $error; Yii::app()->end(); } } if(isset($_POST['CEmailForm'])) { //put form name in POST above //do whatever you need with model here //save / edit etc. //in the end echo CJSON::encode(array( 'status'=>'success', )); Yii::app()->end(); } if(Yii::app()->request->isAjaxRequest) //check renders $this->renderPartial('_cemail',array('model'=>$model),false,true); else $this->render('update',array('model'=>$model,'form'=>'_cemail')); } 

В вашей кнопке submit:

  <?php echo CHtml::ajaxSubmitButton ("Save", Yii::app()->request->url, array ( 'dataType' => 'json', 'type'=>'post', 'success' => 'js:function (data) { if(data.status=="success"){ //do whatever you need on success //show flash/notification }; } else {//show errors here $.each(data, function(key, val) { $("#YourFormIDhere #"+key+"_em_").text(val); $("#YourFormIDhere #"+key+"_em_").css(\'display\',\'block\'); }); //can show error summarry here or custom notifications }; }', ), array ( 'id' => 'yourbuttonid_submit_'.rand(1,255), // Need a unique id or they start to conflict with more than one load. ));?> 

Попытайтесь сделать это. Оно работает. Будь проще. Вы потеряли 2? дней для проверки 2 полей. Я просто сделал это в моей форме changepassword. Мне потребовалось 5 минут. Мой пост при попытке сохранить с пустым полем по умолчанию:

 {"UserChangePassword_verifyPassword":["Required field","Retype Password is incorrect."]} 

Сделайте так и не теряйте время. С уважением.