我创建了一个允许用户保存表格数据的表单。我遵循了这个tutorial。我已经设法为模型添加多个实例,我在帖子中获取数据并且它正在获得验证。问题在于错误摘要和AJAX验证。
下面是我的控制器代码,我为第二个Model创建了一个数组并将其传递给表单。
$model = new UserAccountDetail;
$addresses = array();
array_push($addresses, new UserAddress);
array_push($addresses, new UserAddress);
$this->validateUserAccount($model,$addresses);
if(isset($_POST['UserAccountDetail']) && isset($_POST['UserAddress']))
{
$model->attributes = $_POST['UserAccountDetail'];
$model->validate();
$addresses = array();
for($i=0;$i<2;$i++)
{
if(isset($_POST['UserAddress'][$i]))
{
$address = new UserAddress;
$address->attributes = $_POST['UserAddress'][$i];
array_push($addresses, $address);
$address->validate();
}
}
}
$this->render('accountinformation',array('model'=>$model,'addresses'=>$addresses));
以下是我的ajax验证功能:
protected function validateUserAccount($model,$addresses)
{
if(isset($_POST['ajax']) && $_POST['ajax']==='user-account-detail-form')
{
echo CActiveForm::validate($model).CActiveForm::validateTabular($addresses);
Yii::app()->end();
}
}
当我运行此代码时,Ajax验证不起作用。 onclick验证确实有效,但对于表格数据,消息不会显示在错误摘要中,但字段会以红色突出显示。
我还需要其他任何东西,请告诉我。 谢谢你的时间。干杯!!!!!
更新查看文件:
<?php $form=$this->beginWidget('CActiveForm', array(
'id'=>'user-account-detail-form',
'enableAjaxValidation'=>true,
)); ?>
<?php echo $form->errorSummary($model,$address); ?>
<h2> Account Details </h2>
<div class="row">
<?php echo $form->labelEx($model,'Title'); ?>
<?php echo $form->dropDownList($model,'Title', $model->getAllTitles()); ?>
<?php echo $form->error($model,'Title'); ?>
</div>
<div class="row">
<?php echo $form->labelEx($model,'firstName'); ?>
<?php echo $form->textField($model,'firstName',array('size'=>50,'maxlength'=>100)); ?>
<?php echo $form->error($model,'firstName'); ?>
</div>
<div class="row">
<?php echo $form->labelEx($model,'middleName'); ?>
<?php echo $form->textField($model,'middleName',array('size'=>50,'maxlength'=>100)); ?>
<?php echo $form->error($model,'middleName'); ?>
</div>
<div class="row">
<?php echo $form->labelEx($model,'lastName'); ?>
<?php echo $form->textField($model,'lastName',array('size'=>50,'maxlength'=>100)); ?>
<?php echo $form->error($model,'lastName'); ?>
</div>
<div class="row">
<?php echo $form->labelEx($model,'displayName'); ?>
<?php echo $form->textField($model,'displayName',array('size'=>50,'maxlength'=>200)); ?>
<?php echo $form->error($model,'displayName'); ?>
</div>
<div class="row">
<?php echo $form->labelEx($model,'birthDate'); ?>
<?php echo $form->textField($model,'birthDate',array('size'=>50,'maxlength'=>15)); ?>
<?php echo $form->error($model,'birthDate'); ?>
</div>
<div class="row">
<?php echo $form->labelEx($model,'lenderType'); ?>
<?php echo $form->textField($model,'lenderType',array('size'=>50,'maxlength'=>15)); ?>
<?php echo $form->error($model,'lenderType'); ?>
</div>
<div class="row">
<?php echo $form->labelEx($model,'businessName'); ?>
<?php echo $form->textField($model,'businessName',array('size'=>60,'maxlength'=>200)); ?>
<?php echo $form->error($model,'businessName'); ?>
</div>
<div class="row">
<?php echo $form->labelEx($model,'hearAboutUs'); ?>
<?php echo $form->dropDownList($model,'hearAboutUs', $model->getAllHearAbout()); ?>
<?php echo $form->error($model,'hearAboutUs'); ?>
</div>
<div class="row">
<?php echo $form->labelEx($model,'promotionalCode'); ?>
<?php echo $form->textField($model,'promotionalCode',array('size'=>60,'maxlength'=>100)); ?>
<?php echo $form->error($model,'promotionalCode'); ?>
</div>
<div class="row">
<?php echo $form->labelEx($model,'mobileNumber'); ?>
<?php echo $form->textField($model,'mobileNumber',array('size'=>50,'maxlength'=>15)); ?>
<?php echo $form->error($model,'mobileNumber'); ?>
</div>
<div class="row">
<?php echo $form->labelEx($model,'workLandline'); ?>
<?php echo $form->textField($model,'workLandline',array('size'=>50,'maxlength'=>15)); ?>
<?php echo $form->error($model,'workLandline'); ?>
</div>
<?php echo $form->textField($model,'thirdAnswer',array('size'=>60,'maxlength'=>100)); ?>
<?php echo $form->error($model,'thirdAnswer'); ?>
</div>
<h2>Address </h2>
<?php foreach ($addresses as $i=>$address) { ?>
<div class="row">
<?php echo $form->labelEx($address,"[$i]Flat"); ?>
<?php echo $form->textField($address,"[$i]Flat",array('size'=>60,'maxlength'=>100)); ?>
<?php echo $form->error($address,"[$i]Flat"); ?>
</div>
<div class="row">
<?php echo $form->labelEx($address,"[$i]buildingName"); ?>
<?php echo $form->textField($address,"[$i]buildingName",array('size'=>60,'maxlength'=>100)); ?>
<?php echo $form->error($address,"[$i]buildingName"); ?>
</div>
<div class="row">
<?php echo $form->labelEx($address,"[$i]buildingNumber"); ?>
<?php echo $form->textField($address,"[$i]buildingNumber",array('size'=>60,'maxlength'=>100)); ?>
<?php echo $form->error($address,"[$i]buildingNumber"); ?>
</div>
<div class="row">
<?php echo $form->labelEx($address,"[$i]street"); ?>
<?php echo $form->textField($address,"[$i]street",array('size'=>60,'maxlength'=>100)); ?>
<?php echo $form->error($address,"[$i]street"); ?>
</div>
<div class="row">
<?php echo $form->labelEx($address,"[$i]district"); ?>
<?php echo $form->textField($address,"[$i]district",array('size'=>60,'maxlength'=>100)); ?>
<?php echo $form->error($address,"[$i]district"); ?>
</div>
<div class="row">
<?php echo $form->labelEx($address,"[$i]town"); ?>
<?php echo $form->textField($address,"[$i]town",array('size'=>60,'maxlength'=>100)); ?>
<?php echo $form->error($address,"[$i]town"); ?>
</div>
<div class="row">
<?php echo $form->labelEx($address,"[$i]county"); ?>
<?php echo $form->textField($address,"[$i]county",array('size'=>60,'maxlength'=>100)); ?>
<?php echo $form->error($address,"[$i]county"); ?>
</div>
<div class="row">
<?php echo $form->labelEx($address,"[$i]postCode"); ?>
<?php echo $form->textField($address,"[$i]postCode",array('size'=>60,'maxlength'=>100)); ?>
<?php echo $form->error($address,"[$i]postCode"); ?>
</div>
<div class="row">
<?php echo $form->labelEx($address,"[$i]isCorresppondence"); ?>
<?php echo $form->textField($address,"[$i]isCorresppondence",array('size'=>60,'maxlength'=>100)); ?>
<?php echo $form->error($address,"[$i]isCorresppondence"); ?>
</div>
<?php } ?>
<div class="row buttons">
<?php echo CHtml::submitButton('Continue'); ?>
</div>
<?php $this->endWidget(); ?>
更新:我已检查过服务器的响应,并提供正确的响应。以下是截图:
更新::我设法通过将模型数组传递给errorSummary()函数来纠正点击验证问题,如:
<?php
$error = array();
array_push($error, $model);
foreach ($addresses as $address)
{
array_push($error, $address);
}
echo $form->errorSummary($error); ?>
但是AJAX验证仍然无效。任何人都可以帮助我。
答案 0 :(得分:2)
http://www.yiiframework.com/doc/api/1.1/CActiveForm
基于AJAX的验证有一些限制。首先,它没有 使用文件上传字段。其次,它不应该被用来执行 可能导致服务器端状态更改的验证。第三,事实并非如此 旨在目前使用表格数据输入。
因此,您需要为表格数据编写自定义错误处理程序
//view
$form = $this->beginWidget('CActiveForm', array(
'enableClientValidation' => true,
'clientOptions' => array(
'validateOnChange' => false,
'validateOnType' => false,
'validateOnSubmit' => true,
'beforeValidate' => 'js:formBeforeValidate',
'afterValidate' => 'js:formAfterValidate'
),
));
//some js
function formBeforeValidate (form) {
//clean errors
return true;
}
function formAfterValidate(form, data, hasError) {
if (hasError === true) {
//append errors to input
}
return !hasError;
}
答案 1 :(得分:1)
Yii中没有内置机制来对表格数据进行ajax验证。为此,我使用jquery实现了自定义验证。下面是我用于为表格数据创建自定义ajax验证的代码。
Controller:它分配传递给model属性的值,并返回属性的任何错误。
public function actionValidateData($value,$name)
{
$model = new BusinessPartner;
$model->setAttribute($name, $value);
$model->validate();
echo CHtml::error($model,$name);
Yii::app()->end();
}
Jquery函数进行ajax调用并显示消息。我已将类'businessPartner'添加到模型的所有字段中。
$(document).on('blur','.businessPartner',function(e){
e.preventDefault();
var id= $(this).attr('id');
var name= $(this).attr('rel');
$.ajax({
url:"<?php echo Yii::app()->createUrl('user/validatedata'); ?>",
type: "GET",
data: 'value='+$.trim($(this).val())+'&name='+ name,
success :function(data){
if($.trim(data))
{
if(!$('#'+id).hasClass('error'))
{
$('#'+id).addClass('error');
$('#'+id).prev().addClass('error');
$('#'+id).after(data);
}
}
else
{
if(!$('#'+id).parent().hasClass('success'))
{
$('#'+id).removeClass('error');
$('#'+id).prev().removeClass('error')
$('#'+id).next().remove()
$('#'+id).parent().addClass('success');
}
}
},
error:function(){
},
});
});