Yii ajaxSubmitButton () с проверкой полей

Я использую Yii ajaxSubmitButton () для отправки формы. Кроме того, я установил для параметра enableAjaxValidation значение true для проверки соответствующих текстовых полей.

Что я могу сделать:

  1. Подтвердите поле, когда фокус покинет его, асинхронно.
  2. Вызовите метод на стороне сервера, когда кнопка нажата, асинхронно.

Проблема в том, что я не знаю, как выполнять проверку полей при нажатии кнопки отправки и, если модель проверена, выполняет частичную визуализацию на стороне клиента.

Если я переопределяю событие «success» в ajaxSubmitButton, я получаю частичный рендеринг, но я не могу поддерживать проверку модели.

Любая помощь?


РЕДАКТИРОВАТЬ

Спасибо за ответ,

Флаг validateOnSubmit уже установлен, и модель будет правильно проверена, если событие «success» не было установлено.

Когда ajaxSubmitButton выглядит так:

<?php echo CHtml::ajaxSubmitButton( 'Send', CHtml::normalizeUrl(array('site/ajaxIndexSubmit')), array( 'error'=>'js:function(){ alert(\'error\'); }', 'beforeSend'=>'js:function(){ alert(\'beforeSend\'); }', 'success'=>'js:function(data){ alert(\'success, data from server: \'+data); }', 'complete'=>'js:function(){ alert(\'complete\'); }', //'update'=>'#where_to_put_the_response', ) ); ?> 

предупреждение («успех») напечатает строку, соответствующую проверке модели. Как только у меня есть эта строка, какая логика должна быть вызвана на стороне клиента?

Причиной переопределения обработчика javascript «success» является получение частичного рендеринга с сервера, отличного от проверки модели. Я хочу обе вещи: валидация и частичное рендеринг.

Эй, у меня была такая же проблема, и у меня получилось работать даже с aftervalidate, beforevalidate и т. Д. И во-вторых, я предпочитаю использовать расширение для этого coz. У моего приложения уже много. Поэтому я сделал это:

Изменить: Согласно предложению Барта, я сам ставил этот код.

Шаг 1: @ действие вашего контроллера

 public function actionMyAction() { $model=new User; $this->performAjaxValidation($model); if(isset($_POST['User'])) { $model->attributes=$_POST['User']; $valid=$model->validate(); if($valid){ //do anything here echo CJSON::encode(array( 'status'=>'success' )); Yii::app()->end(); } else{ $error = CActiveForm::validate($model); if($error!='[]') echo $error; Yii::app()->end(); } } } 

Шаг 2: @ ваш вид Ваша форма может выглядеть так:

 <?php $form=$this->beginWidget('CActiveForm', array( 'id'=>'user-form', 'enableAjaxValidation'=>true, 'action'=>$this->createUrl('myController/MyAction'), 'enableClientValidation'=>true, )); ?> <div class="errorMessage" id="formResult"></div> <div id="AjaxLoader" style="display: none"><img src="<?php echo Yii::app()->request->baseUrl; ?>/images/spinner.gif"></img></div> <div class="row-user-single"> <?php echo $form->labelEx($model,'attribute1'); ?> <?php echo $form->passwordField($model,'attribute1',array('size'=>60,'maxlength'=>500)); ?> <?php echo $form->error($model,'attribute1'); ?> </div> <div class="row-user-single"> <?php echo $form->labelEx($model,'attribute2'); ?> <?php echo $form->passwordField($model,'attribute2',array('size'=>60,'maxlength'=>500)); ?> <?php echo $form->error($model,'attribute2'); ?> </div> <div class="buttons"> <?php echo CHtml::ajaxSubmitButton('Save',CHtml::normalizeUrl(array('myController/MyAction','render'=>true)), array( 'dataType'=>'json', 'type'=>'post', 'success'=>'function(data) { $("#AjaxLoader").hide(); if(data.status=="success"){ $("#formResult").html("form submitted successfully."); $("#user-form")[0].reset(); } else{ $.each(data, function(key, val) { $("#user-form #"+key+"_em_").text(val); $("#user-form #"+key+"_em_").show(); }); } }', 'beforeSend'=>'function(){ $("#AjaxLoader").show(); }' ),array('id'=>'mybtn','class'=>'class1 class2')); ?> 

Это работает отлично для меня. И весь написанный выше код – это мой стиль письма. Вы можете изменить их по мере необходимости, но есть только две вещи, которые следует отметить следующим образом: 1. @ ваш контрольный вызов проверяет вашу модель и возвращает объект json, если форма недействительна. 2. @ ваш взгляд разбивает этот объект json (OR traverse через него) и показывать сообщения об ошибках в соответствующих элементах формы.

Будь проще 🙂

Вы можете увидеть мой блог также здесь: http://www.yiiframework.com/forum/index.php/topic/37075-form-validation-with-ajaxsubmitbutton/

CActiveForm имеет общедоступное свойство, называемое $clientOptions . Параметр validateOnSubmit по умолчанию является ложным. Вам нужно, чтобы это было правдой. По вашему мнению, это должно выглядеть примерно так:

 <?php $form=$this->beginWidget('CActiveForm', array( 'id'=>'yourFormId', 'enableAjaxValidation'=>TRUE, 'clientOptions'=>array('validateOnSubmit'=>TRUE), )); ?> 

http://www.yiiframework.com/doc/api/1.1/CActiveForm#clientOptions-detail

Я нашел решение. Моя CActive форма

 <?php $form=$this->beginWidget('CActiveForm', array( 'id'=>'gold-value-form', 'enableAjaxValidation'=>true, 'clientOptions'=>array( 'validateOnSubmit'=>true, 'afterValidate'=>'js:function(form, data, hasError) { if(jQuery.isEmptyObject(data)) { alert("ok") } return false; }' ), )); ?> 

Мое создание Действие

 public function actionCreate() { $this->layout=false; $model=new GoldValue; if(isset($_POST['ajax']) && $_POST['ajax']==='gold-value-form') { if(isset($_POST['GoldValue'])) { $model->attributes=$_POST['GoldValue']; if(!$model->save()) echo CActiveForm::validate($model); } } Yii::app()->end(); } 

Я собираюсь попробовать отправить другое значение (отправленное с помощью $ _GET) на клике ajaxSubmitButton. Тестирование значения, а затем выполнение проверки, если значение не существует. Будет ли это работать на вас?

проверьте этот фрагмент, он решает проблему на стороне клиента. http://www.yiiframework.com/wiki/466/a-simple-way-to-get-yii-client-side-form-validation-run-when-submitting -по-Ajax /

Попробуй это:

 /* 1) Register the snippet into the HEAD. Be sure that it is linked after jquery.yii.js is linked. 2) Configure your CActiveForm instance like this: */ $this->beginWidget('CActiveForm', array( ... 'enableClientValidation'=>true, 'clientOptions'=>array( 'validateOnSubmit'=>true, 'afterValidate'=>'js:$.yii.fix.ajaxSubmit.afterValidate' ) ... ); /* 3) Configure your CHtml::ajaxSubmitButton instance like this: */ echo CHtml::ajaxSubmitButton('Whateverlabel', 'whateverurl', array( ... 'beforeSend'=>'js:$.yii.fix.ajaxSubmit.beforeSend("#YOUR_FORM_ID")' ... ); 

См. Больше http://www.codexamples.com/90/chtml-ajaxsubmitbutton/ или http://www.codexamples.com/category/chtml-8/