我有一个与 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/