1

ここで私のシナリオは、チェックボックスがオフの場合、対応するフィールドが無効になり、無効なフィールドの場合、クライアントの検証はここで実行されるべきではありません。父の姓、名のように...これらのフィールドでは、クライアントの検証を実行しないでください。そのチェックボックスをもう一度オンにすると、クライアントの検証が実行されます

ここで私の問題は、チェックボックスのチェックを外し、クライアント側の検証が行われており、フォームが送信されていないことです。このシナリオで誰かが私を助けることができます. ここに私のサンプルコードがあります

<?php echo $form->checkBox($modelFamilyFather, '[1]type',   array('id'=>'type', 'checked'=>'checked','onChange' => "
    if(this.value==checked)
    {

         $('#" . CHtml::activeId($modelFamilyFather, '[1]firstname') .
    "').removeAttr('disabled','disabled');

            $('#" . CHtml::activeId($modelFamilyFather,
    '[1]lastName') . "').removeAttr('disabled','disabled');



         $('#" . CHtml::activeId($modelFamilyFather, '[1]occupation') .
    "').removeAttr('disabled','disabled');

    $('#" . CHtml::activeId($modelFamilyFather, '[1]averageMonthlyIncome') .
    "').removeAttr('disabled','disabled');

    }

    else {
        $('#" . CHtml::activeId($modelFamilyFather, '[1]firstname') .
    "').attr('disabled','disabled');

            $('#" . CHtml::activeId($modelFamilyFather,
    '[1]lastName') . "').attr('disabled','disabled');



         $('#" . CHtml::activeId($modelFamilyFather, '[1]occupation') .
    "').attr('disabled','disabled');

    $('#" . CHtml::activeId($modelFamilyFather, '[1]averageMonthlyIncome') .
    "').attr('disabled','disabled');

    }



    "))." <label for='Father'>Has a Father</label>";

    ?>
4

1 に答える 1

5

シナリオを使用してこれを行うことができます。

$modelFamilyFather の検証規則を変更して、'on' => 'hasFather' を含めます。例:

array('firstname, lastName, occupation, averageMonthlyIncome', 'required', 'on' => 'hasFather'),

これにより、「hasFather」シナリオのみのルールがアクティブになります。

次に、コントローラーの performAjaxValidation メソッドを編集して、チェックボックスの値が変更されたときのシナリオを変更します。

フォーム、チェックボックス(「タイプ」と呼ばれますか?)、またはモデルの名前がわからないため、以下の「your-form-name」と「checkBoxName」を置き換える必要があります。

protected function performAjaxValidation($model)
{
    if(isset($_POST['ajax']) && $_POST['ajax']==='your-form-name')
    {
        if($_POST['ModelFamilyFather']['checkBoxName'] == 1){
            $model->scenario = 'hasFather';
        }
        echo CActiveForm::validate($model);
        Yii::app()->end();
    }
}

次に、フォームから入力を取得するメソッドも編集する必要があります。繰り返しますが、名前やコードのその部分がどのように見えるかはわかりませんが、次のようなことをする必要があります:

if(isset($_POST['ModelFamilyFather']))
{
    $model->attributes=$_POST['ModelFamilyFather'];
    if($model->checkBoxName == 1)
        $model->scenario = 'hasFather';
    if($model->save())
        $this->redirect(array('view','id'=>$model->id));
}

「ModelFamilyFather」をモデルの名前に置き換え、checkboxName をチェックボックスの名前に置き換えます。

あなたが確認する必要がある他の3つのこと:

  1. モデルにチェックボックスの属性があることを確認してください。そうでない場合は、作成する必要があります。
  2. チェックボックスのデフォルト値を 0 に設定します。したがって、コントローラーで、モデルをフォームに送信する前に、 $model->checkBoxName = 0; を追加します。
  3. フォームに 'enableAjaxValidation'=>true, 'enableClientValidation' => true, があることを確認してください。

独自のモデル、属性、およびチェックボックスを使用してこれをローカルでテストしたところ、機能しました。

于 2013-01-30T19:18:23.837 に答える