2

私はここのウィキに投稿されたのと同様の解決策を持ってい ます

しかし、検証ルールを期待どおりに機能させることができません。送信ボタンをクリックすると、モーダルウィンドウが閉じ、すべての必須フィールドに入力しないと何も保存されません。

私がここで欠けているものについて何か考えはありますか?アクションとビューで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ファイルでは、これは正常に機能していることに注意してください。そして、私はモーダルウィンドウを備えたウィザードを実装して、ウィザードの入力中に新しいitenを追加しようとしています。

より明確にするために、モーダルウィンドウの送信ボタンを押す前に必須フィールドに入力するように求められるように、モーダルウィンドウの送信は避けたいと思います。

4

1 に答える 1

2

ここでの問題はsuccess、検証の成功ではなく、ajax呼び出しに従ってダイアログを閉じていることです。つまり、次の行です。

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

ajaxSubmitButtonフォームの検証状態に関係なく、クリックすると常に実行されます。

検証に成功したときにのみダイアログを閉じるにはsuccess、jquery ajaxのコールバック関数と、コントローラーアクションでのフォームの処理方法を変更する必要があります。

まず、モデルが正常に検証されたかどうかを検出する必要があります。コントローラアクションでこれを行うには、検証ステータスを示す追加のフィールドを渡します。

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
    ); 
?>
于 2012-11-27T17:17:35.807 に答える