渲染部分的 Yii 客户端验证不起作用 [英] Yii ClientSide Validation on Render Partial not Working

查看:22
本文介绍了渲染部分的 Yii 客户端验证不起作用的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我有一个 Yii 表单,它从另一个模型(团队 has_many team_members)调用渲染部分.我想通过ajax调用局部视图以在team/_form中添加成员.除了 ajax 验证(服务器端和客户端)之外的所有工作(调用、显示、保存).如果我提交表单,成员的模型不会验证,即使在客户端,它也不会验证必填字段.

有什么线索吗?

//_form

<?php $form=$this->beginWidget('CActiveForm', array('id'='团队形式','enableAjaxValidation'=>true,'enableClientValidation'=>真,'clientOptions'=>数组('validateOnSubmit'=>真,'validateOnChange'=>真),'htmlOptions' =>数组('enctype' => 'multipart/form-data'),));?>

//控制器

公共函数 actionMember($index){$model = new TeamMember();$this->renderPartial('_member',array('模型'=>$模型,'索引'=>$index),假,真);}公共函数 actionCreate(){$model=新团队;$members = 数组();if(isset($_POST['团队'])){$model->attributes=$_POST['团队'];if(!empty($_POST['TeamMember'])){foreach($_POST['TeamMember'] 作为 $team_member){$mem = new TeamMember();$mem->setAttribute($team_member);if($mem->validate(array('name'))) $members[]=$mem;}}$this->redirect(array('team/create','id'=>$model->id,'#'=>'submit-message'));}$members[]=新团队成员;$this->performAjaxMemberValidation($members);$this->render('create',array('model'=>$model,'members'=>$members));}

//_成员

<div class="row-member<?php echo $index; ?>"><h3>成员<?php echo $index+1;?></h3><div class="row"><?php echo CHtml::activeLabel($model, "[$index]name",array('class'=>'member'));?><?php echo CHtml::activeTextField($model, "[$index]name",array('class'=>'member'));?><?php echo CHtml::error($model, "[$index]name");?>

ProcessOutput 设置为 true.没有骰子.将 renderPartial() 切换到 render().没有骰子.

解决方案

如果你会看CActiveForm::run:

$cs->registerCoreScript('yiiactiveform');//...$cs->registerScript(__CLASS__.'#'.$id,"jQuery('#$id').yiiactiveform($options);");

然后你就会明白你的验证是行不通的,因为你渲染的是部分页面而不是整个页面.这些脚本显示在页面底部.所以你应该通过执行这些脚本来解决这个问题.

渲染部分后,尝试获取应存储在 scipts 数组中的 activeform 脚本:

$this->renderPartial('_member',array('model'=> $model, 'index'=> $index));$script = Yii::app()->clientScript->scripts[CClientScript::POS_READY]['CActiveForm#team-form'];

之后,将其与渲染的 html 一起发送到页面:

echo "<script type='text/javascript'>$script</script>"

还要记住,在您将收到的 html 附加到页面上之前,您应该包含 jquery.yiiactiveform.js,如果您还没有这样做(通过渲染另一个表单,或 registerCoreScript('yiiactiveform')),在页面上调用ajax请求.否则会引发 javascript 错误.

希望这会有所帮助.

抱歉,我不明白您是呈现形式的一部分而不是整体.但是您的验证不会完全解决相同的问题.因为 jQuery('#$id').yiiactiveform($options); 脚本不是为该字段创建的.

I have a Yii form which calls a render partial from another model (team has_many team_members). I want to call via ajax a partial view to add members in team/_form. All works (call, show, save) except for ajax validations (server and client side). If i submit form, member's model isn't validating, even in client side, it's not validating the required fields.

Any clue?

//_form

<?php $form=$this->beginWidget('CActiveForm', array(
    'id'=>'team-form',
        'enableAjaxValidation'=>true,
        'enableClientValidation'=>true,
        'clientOptions'=>array(
            'validateOnSubmit'=>true,
            'validateOnChange'=>true

        ),
        'htmlOptions' => array('enctype' => 'multipart/form-data'),
)); ?>

//Controller

public function actionMember($index)
{
    $model = new TeamMember();
        $this->renderPartial('_member',array(
            'model'=> $model, 'index'=> $index
        )
                ,false,true
                ); 
}  

public function actionCreate()
{
        $model=new Team;
        $members = array();
        if(isset($_POST['Team']))
        {
                $model->attributes=$_POST['Team'];

                if(!empty($_POST['TeamMember'])){
                foreach($_POST['TeamMember'] as $team_member)
                            {
                                $mem = new TeamMember();
                                $mem->setAttribute($team_member);
                                if($mem->validate(array('name'))) $members[]=$mem;
                            }
                }
                        $this->redirect(array('team/create','id'=>$model->id,'#'=>'submit-message'));

        }

        $members[]=new TeamMember;
        $this->performAjaxMemberValidation($members);
        $this->render('create',array(
                'model'=>$model,'members'=>$members
        ));

}

//_member

<div class="row-member<?php echo $index; ?>">
    <h3>Member <?php echo $index+1; ?></h3>
    <div class="row">
    <?php echo CHtml::activeLabel($model, "[$index]name",array('class'=>'member')); ?>
    <?php echo CHtml::activeTextField($model, "[$index]name",array('class'=>'member')); ?>
    <?php echo CHtml::error($model, "[$index]name");?>    
    </div>
</div>

ProcessOutput was set to true. No dice. Switch renderPartial() to render(). No dice.

解决方案

If you will look at the CActiveForm::run:

$cs->registerCoreScript('yiiactiveform');
//...
$cs->registerScript(__CLASS__.'#'.$id,"jQuery('#$id').yiiactiveform($options);");

Then you will understand that you validation will not work, because you render partial and not the whole page. And these scripts show up at the bottom of the page. So you should solve this by execute these scripts.

After you partial is rendered, try to get activeform script which should be stored at the scipts array:

$this->renderPartial('_member',array('model'=> $model, 'index'=> $index));
$script = Yii::app()->clientScript->scripts[CClientScript::POS_READY]['CActiveForm#team-form'];

after, send it with rendered html to page:

echo "<script type='text/javascript'>$script</script>"

Also remember before you will append recieved html on the page you should include jquery.yiiactiveform.js, if you not already did it(by render another form, or registerCoreScript('yiiactiveform')), on the page from calling ajax request. Otherwise javascript error will raised.

Hope this will help.

Edit: Sorry I'm not understood that you are render part of form and not the whole. But you validation will not work exactly with the same issue. Because jQuery('#$id').yiiactiveform($options); script was not created for the field.

这篇关于渲染部分的 Yii 客户端验证不起作用的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

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