如何在yii中验证表格数据?

时间:2013-12-06 08:32:16

标签: php yii

我创建了一个允许用户保存表格数据的表单。我遵循了这个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(); ?>

更新:我已检查过服务器的响应,并提供正确的响应。以下是截图: enter image description here

更新::我设法通过将模型数组传递给errorSummary()函数来纠正点击验证问题,如:

<?php 
$error = array();
array_push($error, $model);
foreach ($addresses as $address)
{
    array_push($error, $address);
}
echo $form->errorSummary($error); ?>

但是AJAX验证仍然无效。任何人都可以帮助我。

2 个答案:

答案 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(){
        },
    });
});