2016-12-20 9 views
1

フォームにユーザー名フィールドを使用していますが、私は以下のようにルールを設定します。yii2条件付き検証がサーバ側で動作していませんか?

['username', 'required','when' => function($model) { 
      return $model->pin == true; 
     }], 

(すなわち)プロパティピンはその時だけ私は、ユーザー名フィールドが必要な必要なのはクライアント側で正常に動作しているが、サーバー側でこの検証falisが、私のコードで何が間違っている真実になったとき。

UPDATE:

コントローラコード

public function actionTest() 
{ 
    $model = new Test(); 
    if ($model->load(Yii::$app->request->post()) && $model->customValidation()) { 
     if($model->validate()) 
     { 
      // 
     } 
    } 
    return $this->render('testView', [ 
    'model' => $model, 
    ]); 
} 

モデル

public $username; 
public $pin = false; 
public function rules() 
{ 
return [ 
    ['username', 'required','message' => 'You must enter username','when'  => function($model) { 
     return $model->pin == true; 
    }], 
]; 
} 
public function customValidation() 
{ 
if() 
{ 
    $this->pin = true; 
    return false; 
} 
else 
{ 
    return true; 
} 
} 

ビュー

if($model->pin) 
{ 
<?= $form->field($model, 'username')->textInput(); ?> 
} 
+0

あなたがいますそれはサーバー側で失敗することを確認しますか?クライアント側ではないのですか?それが書かれている方法は、それがクライアント側で動作すべきでないことを示します。 – Bizley

+0

はい、私はfirebugを開いてフィールドIDを変更するとその時には動作しないと確信しています – praba

+0

'customValidation()'メソッドは機能しますか?空の 'if()'がエラーで終了します... – Bizley

答えて

1

あなたが上で動作するように、このためwhenClientを追加する必要がありますクライアント側:

[ 
    'username', 'required', 
    'when' => function ($model) { 
     return $model->pin == true; 
    }, 
    'whenClient' => "function (attribute, value) { 
     // JS condition here 
    }" 
], 

ここで、JSの条件は、取得したDOM構造によって異なります。ピンプロパティがID pinでcheckboxedされている場合たとえば、これが使用できます

'whenClient' => "function (attribute, value) { 
    return $('#pin').is(':checked'); 
}" 

UPDATE:
あなただけのモデルでpinプロパティを設定する場合は、そのような検証ルールを変更することができます。

public function rules() 
{ 
    $rules = [ 
     // other validation rules 
    ]; 
    if ($this->pin) { 
     $rules[] = ['username', 'required']; 
    } 
    return $rules; 
} 
+0

答えていただきありがとうございますが、問題はフォームフィールドにないプロパティピンです。モデル内でのみ使用されています – praba

+0

動的に変更されているか、一度モデルに設定されるとビューに渡されますか? – Bizley

+0

私はpublic $ pin = falseのように最初に初期化しています。 – praba