如何验证yii中的表格数据? [英] How to validate tabular data in yii?

查看:23
本文介绍了如何验证yii中的表格数据?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我创建了一个允许用户保存表格数据的表单.我遵循了这个教程.我已经成功地为一个模型添加了多个实例,并且我正在获取帖子中的数据并且它正在得到验证.问题在于错误摘要和 AJAX 验证.

下面是我的控制器代码,我为第二个模型创建了一个数组并将其传递给表单.

$model = new UserAccountDetail;$addresses = array();array_push($addresses, 新用户地址);array_push($addresses, 新用户地址);$this->validateUserAccount($model,$addresses);if(isset($_POST['U​​serAccountDetail']) &&isset($_POST['U​​serAddress'])){$model->attributes = $_POST['U​​serAccountDetail'];$model->validate();$addresses = array();for($i=0;$i<2;$i++){if(isset($_POST['U​​serAddress'][$i])){$address = 新用户地址;$address->attributes = $_POST['U​​serAddress'][$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 验证确实有效,但对于表格数据,错误摘要中未显示消息,但字段以红色突出显示.

我还有什么需要请告诉我.谢谢你的时间.干杯!!!!!!

更新视图文件:

beginWidget('CActiveForm', array('id'='=>'用户帐户详细信息表单','enableAjaxValidation'=>true,));?><?php echo $form->errorSummary($model,$address);?><h2>帐户详细信息 </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 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 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 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 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 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 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 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 class="row"><?php echo $form->labelEx($model,'hearAboutUs');?><?php echo $form->dropDownList($model,'hearAboutUs', $model->getAllHearAbout());?><?php echo $form->error($model,'hearAboutUs');?>

<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 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 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');?>

<?php echo $form->textField($model,'thirdAnswer',array('size'=>60,'maxlength'=>100));?><?php echo $form->error($model,'thirdAnswer');?>

<h2>地址 </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 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 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 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 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 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 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 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 class="row"><?php echo $form->labelEx($address,"[$i]isCorrespondence");?><?php echo $form->textField($address,"[$i]isCorreppondence",array('size'=>60,'maxlength'=>100));?><?php echo $form->error($address,"[$i]isCorrespondence");?>

<?php } ?><div class="行按钮"><?php echo CHtml::submitButton('Continue');?>

<?php $this->endWidget();?>

更新:我检查了服务器的响应,它给出了正确的响应.下面是屏幕截图:

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

errorSummary($error);?>

但是 AJAX 验证仍然不起作用.任何人都可以帮助我.

解决方案

Yii 中没有内置机制来对表格数据进行 ajax 验证.为此,我使用 jquery 实现了自定义验证.下面是我用来为表格数据创建自定义 ajax 验证的代码.

Controller:它分配传递给模型属性的值并返回该属性的任何错误.

公共函数 actionValidateData($value,$name){$model = 新业务伙伴;$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'); ?>",类型:获取",数据:'value='+$.trim($(this).val())+'&name='+ name,成功:功能(数据){if($.trim(data)){if(!$('#'+id).hasClass('error')){$('#'+id).addClass('error');$('#'+id).prev().addClass('error');$('#'+id).after(data);}}别的{if(!$('#'+id).parent().hasClass('success')){$('#'+id).removeClass('error');$('#'+id).prev().removeClass('error')$('#'+id).next().remove()$('#'+id).parent().addClass('success');}}},错误:函数(){},});});

I have created a form which allows user to save tabular data. I have followed this tutorial . I have managed to add multiple instance for a Model and I am getting the data in the post and it is getting validate. The problem is with the error summary and the AJAX validation.

Below is my controller code, I have created an array for the second Model and passed it to the form.

$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));

Below is my ajax validation function:

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();
    }
}

When I run this code the Ajax validation does not work. The onclick validation does work but for the tabular data the messages are not shown in the error summary but the fields are highlighted in red.

I any thing else is required then please let me know. Thanks for your time. Cheers!!!!!

Update View File:

<?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(); ?>

Update : I have checked the response from the server and it is giving the correct response. Below is the screen shot:

Update :: I have managed to correct the on click validation issue by passing the array of models to the errorSummary() function like:

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

But the AJAX validation is still not working. Can any one help me with that.

解决方案

There is no inbuilt mechanism in Yii to ajax validation for tabular data. I implemented custom validation using jquery for this purpose. Below is the code that I used to create a custom ajax validation for tabular data.

Controller: It assigns the value passed to the model attribute and returns any error for the attribute.

public function actionValidateData($value,$name)
{
    $model = new BusinessPartner;
    $model->setAttribute($name, $value);
    $model->validate();
    echo CHtml::error($model,$name);
    Yii::app()->end();
}

Jquery function to make ajax call and show the messages. I have added class 'businessPartner' to all the fields of the model.

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

这篇关于如何验证yii中的表格数据?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
相关文章
PHP最新文章
热门教程
热门工具
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆