php - cjuidialog 模式窗口上的验证

标签 php jquery mysql ajax yii

我有一个与 wiki 上发布的类似的解决方案 here

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

知道我在这里缺少什么吗?我在操作和 View 上“打开”了 ajax 验证。

这是我的一些代码:

模型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);
                }
    }

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

最后是 _formDialog.php 的一部分

    <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>

有什么想法吗?在此示例中,我希望此处也需要已按规则要求设置的“名称”。请注意,在 gii 生成的默认增删改查文件上,这是可以正常工作的。我正在尝试实现一个带有模式窗口的向导,以在填充向导时添加新的项目。

更清楚地说,我想避免提交模式窗口,以便在点击模式窗口上的提交按钮之前要求填写必填字段。

最佳答案

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

$("#institutionDialog").dialog("close");

在单击 ajaxSubmitButton 时始终执行,无论表单的验证状态如何。

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

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

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):

<?php echo 
    CHtml::ajaxSubmitButton(
        // ... old code
        array(
            'dataType'=>'json',
            'success'=>'function(data) {
                if(data != null && data.status == "success") {
                    $("#User_institutionid").append(data.data);
                    $("#institutionDialog").dialog("close");
                }

            }'),
        // ... old code
    ); 
?>

关于php - cjuidialog 模式窗口上的验证,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13583921/

相关文章:

mysql - 同步不同数据库的 2 个表 - MySQL

php - php 死掉后 Bootstrap 下拉列表停止工作

jQuery UI slider 从数据属性设置值

javascript - 为什么我的所有按钮的下拉内容都相同

php - 如何将自相似子对象(深层对象保存)保存到数据库中?

php - 在 IF 语句中取两个不同值的变量

php - 如何处理 PHP 中奇怪的 float 舍入

php - 从包中引用 Eloquent 模型

使用 glob 排除 index.php 的 PHP 代码

javascript - 带有字典参数的 Jquery post to Action