Php cjuidialog模态窗口的验证

Php cjuidialog模态窗口的验证,php,jquery,mysql,ajax,yii,Php,Jquery,Mysql,Ajax,Yii,我有一个类似于维基上发布的解决方案 但我无法让我的验证规则按预期工作。当我点击submit按钮时,模式窗口关闭,如果我没有填写所有必填字段,则不会保存任何内容 你知道我错过了什么吗?我对动作和视图进行了ajax验证 以下是我的一些代码: model Institution.php public function actionAddnew() { $model=new Institution; // Ajax Validation enabled

我有一个类似于维基上发布的解决方案

但我无法让我的验证规则按预期工作。当我点击submit按钮时,模式窗口关闭,如果我没有填写所有必填字段,则不会保存任何内容

你知道我错过了什么吗?我对动作和视图进行了ajax验证

以下是我的一些代码:

model Institution.php

        public function actionAddnew() {
        $model=new Institution;
        // Ajax Validation enabled
        $this->performAjaxValidation($model);
                $flag=true;
        if(isset($_POST['Institution']))
        {       $flag=false;
            $model->attributes=$_POST['Institution'];

            if($model->save()) {
                //Return an <option> and select it
                            echo CHtml::tag('option',array (
                                'value'=>$model->id,
                                'selected'=>true
                            ),CHtml::encode($model->name),true);
                        }
                }
                if($flag) {
                    Yii::app()->clientScript->scriptMap['jquery.js'] = false;
                    $this->renderPartial('createDialog',array('model'=>$model,),false,true);
                }
    }
公共函数actionAddnew(){
$model=新机构;
//启用Ajax验证
$this->performAjaxValidation($model);
$flag=true;
如果(isset($_POST['Institution']))
{$flag=false;
$model->attributes=$_POST['Institution'];
如果($model->save()){
//返回一个参数并选择它
echo CHtml::标记('option',数组(
“值”=>$model->id,
'所选'=>true
),CHtml::encode($model->name),true);
}
}
如果($flag){
Yii::app()->clientScript->scriptMap['jquery.js']=false;
$this->renderPartial('createDialog',array('model'=>$model,),false,true);
}
}
文件createDialog.php

<?php 
$this->beginWidget('zii.widgets.jui.CJuiDialog',array(
                'id'=>'institutionDialog',
                'options'=>array(
                    'title'=>Yii::t('institution','Institution'),
                    'autoOpen'=>true,
                    'modal'=>'true',
                    'width'=>'auto',
                    'height'=>'auto',
                ),
                ));
echo $this->renderPartial('_formDialog', array('model'=>$model)); ?>
<?php $this->endWidget('zii.widgets.jui.CJuiDialog');?>
    <div class="form" id="institutionDialogForm">

<?php $form=$this->beginWidget('CActiveForm', array(
    'id'=>'institution-form',
    'enableAjaxValidation'=>true,
)); 
?>

    <?php echo $form->errorSummary($model); ?>


    <div class="row">
        <?php echo $form->labelEx($model,'name'); ?>
        <?php echo $form->textField($model,'name',array('size'=>60,'maxlength'=>255)); ?>
        <?php echo $form->error($model,'name'); ?>
    </div>

....
    <div class="row buttons">
        <?php echo CHtml::ajaxSubmitButton(Yii::t('institution','Create'),CHtml::normalizeUrl(array('institution/addnew','render'=>false)),array('success'=>'js: function(data) {
                        $("#User_institutionid").append(data);
                        $("#institutionDialog").dialog("close");
                    }'),array('id'=>'closeInstitutionDialog')); ?>
    </div>

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

</div>

最后是一篇来自_formDialog.php的文章

<?php 
$this->beginWidget('zii.widgets.jui.CJuiDialog',array(
                'id'=>'institutionDialog',
                'options'=>array(
                    'title'=>Yii::t('institution','Institution'),
                    'autoOpen'=>true,
                    'modal'=>'true',
                    'width'=>'auto',
                    'height'=>'auto',
                ),
                ));
echo $this->renderPartial('_formDialog', array('model'=>$model)); ?>
<?php $this->endWidget('zii.widgets.jui.CJuiDialog');?>
    <div class="form" id="institutionDialogForm">

<?php $form=$this->beginWidget('CActiveForm', array(
    'id'=>'institution-form',
    'enableAjaxValidation'=>true,
)); 
?>

    <?php echo $form->errorSummary($model); ?>


    <div class="row">
        <?php echo $form->labelEx($model,'name'); ?>
        <?php echo $form->textField($model,'name',array('size'=>60,'maxlength'=>255)); ?>
        <?php echo $form->error($model,'name'); ?>
    </div>

....
    <div class="row buttons">
        <?php echo CHtml::ajaxSubmitButton(Yii::t('institution','Create'),CHtml::normalizeUrl(array('institution/addnew','render'=>false)),array('success'=>'js: function(data) {
                        $("#User_institutionid").append(data);
                        $("#institutionDialog").dialog("close");
                    }'),array('id'=>'closeInstitutionDialog')); ?>
    </div>

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

</div>

....

这里的问题是,您是根据ajax调用的
成功
关闭对话框,而不是根据验证的成功,即行:

$("#institutionDialog").dialog("close");
始终在单击
ajaxSubmitButton
时执行,而不管表单的验证状态如何

要仅在验证成功通过时关闭对话框,必须更改jquery ajax的
success
回调函数,以及在控制器操作中处理表单的方式

首先,您必须检测模型是否已成功验证。要在控制器操作中执行此操作,请传递一个指示验证状态的附加字段:

if($model->save()) {
    echo CJSON::encode(
        array(
            'data' => CHtml::tag('option',array (
                          'value'=>$model->id,
                          'selected'=>true
                          ), CHtml::encode($model->name),true),
            'status'=>'success'
        )
    );
}
然后更改
ajaxSubmitButton
的ajax选项(即
success
回调和
dataType
):


非常感谢您的帮助。我对这种方法很陌生,你对我说得很清楚。非常感谢。这解决了我的问题。