2016-12-18 9 views
1

私はすべてのリリースがリストされているプロモーション作成フォームにプロモーションを作成するユーザー向けに複数のミュージック・リリースを用意しています。ここでは、私はプロモーションフォームのモデルでいくつかの入力のすべてのルールを定義します。yii2で動的に生成されるチェックボックスのルールを定義します

フォームを保存するときに少なくとも1つのリリースがユーザーによって選択されているが、チェックボックスが動的に作成されているために機能していないかどうかを確認したい。

モデルで、そのフィールドのための私のフォームコード

foreach ($releaseInfo as $releases) { 
        if (!is_null($releases->releaseSongs)) { 
         echo "<fieldset><legend>". \yii\helpers\Html::activeCheckbox($model,'selected_releases[]',['id'=>'release_'.$releases->id,'onclick'=>'$("#songs_'.$releases->id.'").toggle()','label'=>false])."&nbsp;".$releases->name."</legend>"; 
    foreach ($releases->releaseSongs as $k => $v) { 
    echo "<div id='songs_".$releases->id."' style='display:none'>"; 
    echo "<div>"; 
          echo $v->song->name 
    echo "</div>"; 
    echo "</div>"; 
} 
} 
} 

    echo "</fieldset>"; 

私のルール

['selected_releases','required','on'=>['catalog','catalog_update'],'requiredValue'=>1, 
       'when'=>function($model){return ($model->scenario == self::SCENARIO_CATALOG_BASED || $model->scenario == self::SCENARIO_CATALOG_BASED_UPDATE);}, 
       'whenClient'=>'function(attribute,value){return ("'.$this->scenario.'"=="'.self::SCENARIO_CATALOG_BASED.'" || "'.$this->scenario.'"=="'.self::SCENARIO_CATALOG_BASED_UPDATE.'")}', 
         'message'=>'You must select atleast one release' 
       ], 

私は自分のフォームを送信する際掲載入力変数は、この

[selected_releases] => Array 
     (
      [0] => 0 
      [1] => 0 
     ) 

requiredValueでのように見えますselected_releasesが値の配列であるため、ルールは機能しませんいつも言っている私はそれが

OR

iはカスタム検証メソッドを作成しなければならないのチェックボックスの少なくとも1つslectionをチェックするような方法でルールの requiredValueパラメータオプションを使用する方法shoule

You must select atleast one release

+0

私は少し混乱しています。だから、それはクライアント側だけではなく、全体的にしか機能しませんか? –

+0

フィールドに必要な値が1に設定されているため、フィールド名として 'selected_fields []'と定義されているため、ユーザーは自分のプロモーション用に選択できる複数のリリースが存在する可能性がありますフィールド 'selected_releases'にはポストの値の配列が設定されています。バリデーターは値が1である必要があるため、常に少なくとも1つのリリースを選択する必要があります。現在はバリデーターのカスタム関数を使用しています。 –

+0

私は本当にそれに感謝しています、私はカスタムバリデーションメソッドを使ってそれを行いました。 –

答えて

0

を検証するときに私は私の検証ルールが

['selected_releases','checkreleaseSelection' 
       ,'on'=>['catalog','catalog_update'], 
       'when'=>function($model){return ($model->scenario == self::SCENARIO_CATALOG_BASED || $model->scenario == self::SCENARIO_CATALOG_BASED_UPDATE);}, 
       'whenClient'=>'function(attribute,value){return ("'.$this->scenario.'"=="'.self::SCENARIO_CATALOG_BASED.'" || "'.$this->scenario.'"=="'.self::SCENARIO_CATALOG_BASED_UPDATE.'")}' 
       ], 
を次のようになり、この目的のためにカスタム検証メソッドを使用し、それを呼び出します

カスタムメソッド

public function checkreleaseSelection(){ 
     $error=true; 
     foreach($this->selected_releases as $selection){ 
      if($selection){ 
       $error=false; 
      } 
     } 
     if($error){ 
      $this->addError('selected_releases','You must select atleast one of your releases to continue'); 
     } 
    } 
+0

それは動作していませんか? –

+0

これは今動作していて、完璧に動作しています。元の1は、私が '' requiredValue '=> 1、 'を使用したところで動作しませんでした。 –