2012-11-27 30 views
2

我有一個類似類似的解決方案在wiki上 here驗證上cjuidialog模態窗口

張貼,但我無法讓我的預期工作的驗證規則。當我點擊提交按鈕時,模式窗口關閉,如果我沒有填寫所有必填字段,則不會保存任何內容。

任何想法,我在這裏失蹤?我對動作和視圖都進行了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生成的默認crud文件工作正常。我試圖用模式窗口來實現一個嚮導,以在填充嚮導時添加新的itens。

爲了更清楚一點,我想避免提交模態窗口,以便在模態窗口上點擊提交按鈕之前要求填寫必填字段。

回答

2

這裏的問題是,你是根據Ajax調用,而不是驗證的成功的success關閉對話框,即行:

$("#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):

<?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 
    ); 
?> 
+1

謝謝非常感謝你的幫助。我是新的這種方法,你對我很清楚。謝謝。這解決了我的問題。 – WebDevPT

+1

沒問題,很高興我能幫上忙。 –