文档中的CActiveForm
约为:(clientOptions部分)
ajaxVar:string,指示请求的参数名称是AJAX请求。触发AJAX验证时,名为此属性的参数将与其他表单数据一起发送到服务器。参数值是表单ID。然后,服务器端可以检测谁触发了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
。在CActiveForm中初始化ajaxVar(ajax)
时
电子邮件形式:
<?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();
}
}
答案 0 :(得分:1)
ajaxVar
如果'validateOnSubmit'=>true,
,则初始化onsubmit。尝试使用validateOnChange=>true
并在初始化时显示您的cactiveform代码。
真的停止发明“一个自行车”。
如果您在上一个问题中没有理解我的代码,请尝试阅读http://learnyii.blogspot.com/2010/12/yii.html。
我向您展示了我在工作项目中使用的ajax验证代码。使用该方法,您的$_POST
将使用JSON对象更新所有字段,这将包含表单错误。
停止充斥社区。问候。
答案 1 :(得分:1)
在你的行动中:
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'));
}
在您的视图提交按钮中:
<?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."]}
这样做,不要浪费时间。问候。