Эй, у меня была та же проблема, и я не смог заставить ее работать даже с aftervalidate, beforevalidate и т. Д. И во-вторых, я не хочу использовать расширение для этого, потому что в моем приложении их уже много.
Итак, я сделал это:
Редактировать: Согласно предложению Барта, я помещаю этот код здесь сам.
Шаг 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. @ ваш контроллер вызывает validate вашей модели и возвращает объект json, если форма неверна
2. @ ваш взгляд разбивает этот объект json (или проходит через него) и показывает сообщения об ошибках под соответствующими элементами формы.
Будьте проще:)
Вы также можете увидеть мой блог здесь:
http://www.yiiframework.com/forum/index.php/topic/37075-form-validation-with-ajaxsubmitbutton/