2015-12-17 8 views
6

デフォルト値の設定が機能しないのはなぜですか?シナリオによってデフォルトのモデル値を設定する

class QueryController extends ActiveController 

{ 
    public $modelClass = 'app\models\Query'; 
    public $createScenario = 'restCreate'; 
    public $updateScenario = 'restUpdate'; 

私はデフォルトcreateActionメソッドをオーバーライドしない:

は、ここに私のコントローラです。

モデル:私は残りのコントローラを介して新しいエントリを作成すると、

class Query extends ActiveRecord 
{public function rules() 
{ 
    return [ 
     [['userId', 'name', 'created', 'isOneTime', 'isArchived', 'settings', 'engine'], 'required'], 
     [['userId'], 'integer'], 
     [['name', 'settings', 'schedule'], 'string'], 
     [['created', 'lastUpdate'], 'safe'], 
     [['isOneTime', 'isArchived', 'isApi', 'valid'], 'boolean'], 
     [['state', 'engine'], 'string', 'max' => 160], 
     [['isApi'], 'default', 'value'=> false], 
     [['isApi'], 'default', 'value'=> true, 'on' => 'restCreate'] 
    ]; 
} 
public function scenarios() 
    { 
      $scenarios = parent::scenarios(); 
      $scenarios['restCreate'] = ['name', 'state', 'isApi', 'isOneTime', 'settings', 'schedule']; 
      $scenarios['restUpdate'] = ['name', 'state', 'isOneTime', 'settings', 'schedule' ]; 
     return $scenarios; 
    } 

それがデフォルトでisApi = trueを設定する必要がありますが、それは、このような方法では動作しません。シナリオに応じてデフォルトのモデル値を割り当てるにはどうすればよいですか?

+3

フィールドが空の場合、モデルルールのデフォルト値が適用されます。私はそれがフィールドをあらかじめ埋めるとは思わない。 –

+0

@ck_arjun、大丈夫ですので、フォームに投稿し、 '$ this-> isApi = '''のように設定してください。 –

答えて

1

あなたはこのルールを交換する必要があります
[['isApi'], 'default', 'value'=> false]
[['isApi'], 'default', 'value'=> true, 'on' => 'restCreate']

あなたはDefaultValueValidatorは、単一のフィールドのために一つだけの時間をアプリングので、これを行う必要があります。このバリデーターは、フィールドの値が空の場合にのみ実行されます。このチェックがあります:\yii\validators\DefaultValueValidator::validateAttribute()

モデルはバリデーターを1つずつ実行します。 [['isApi'], 'default', 'value'=> false]は、フィールドの値をfalseに設定します。 [['isApi'], 'default', 'value'=> true, 'on' => 'restCreate']その値が空でスキップされていないことを確認してください。

+1

Brilliant!それは動作します。ありがとう。 –

0
あなたのアクションで

public function ActionCreate(){ 
$model->scenario = 'restCreate';// it will set your scenario first . 
//remaining code for write here 
} 
+0

このようにする必要はありません。パブリックプロパティの設定 'public $ createScenario = 'restCreate'; public $ updateScenario = 'restUpdate'; 'で十分です。 –

+0

これはすべてのアクションに適用され、デフォルト値を正確にすることはできません。 –

1

Yiiは現在のシナリオからのフィールドのみを使用しています。デフォルトでは\yii\base\Model::SCENARIO_DEFAULTdefault)に設定されています。デフォルトのシナリオには、on属性のないルールのすべてのフィールドが含まれます。

カスタムシナリオを使用する場合は、設定する必要があります。コンストラクタによって

  1. :あなたは、2つの方法でこれを行うことができます。
    $model = new Query(['scenario'=>'restCreate']);

  2. セッターによって。
    $model = new Query();
    $mosel->setScenario('restCreate');

シナリオの詳細については、this linkを参照してください。

P.S.シナリオ名として定数を使用することをお勧めします。シナリオ名の間違いを少なくするのに役立ちます。たとえば:

class Query extends ActiveRecord { 
    const SCENARIO_REST_CREATE = 'restCreate'; 
    const SCENARIO_REST_UPDATE = 'restUpdate'; 

    public function scenarios() 
    { 
     $scenarios = parent::scenarios(); 
     $scenarios[static::SCENARIO_REST_CREATE ] = [/*...*/]; 
     $scenarios[static::SCENARIO_REST_UPDATE ] = [/*...*/]; 
     return $scenarios; 
    } 
} 
+0

あなたの例をありがとう、私はここで記事を投稿する前にこの部分を読んでいます。私のコントローラは 'ActiveController'を拡張しているので、これは公共$ createScenario =「restCreate」をcode'府私のコントローラでシナリオを設定することができます事前に定義されたパブリックproperties'ます$ createScenario'と' $ updateScenario'があります。 公共$ updateScenario = 'restUpdate'; 'Http://www.yiiframework.com/doc-2.0/yii-rest-activecontroller.html#$createScenario-detail –

+0

@IvanNosyrevはベリコード床からinglish可能性があります。私はかなり理解していない、あなたはいくつかの左に質問がありますか?あるいは、定数を使わない理由を説明しましたか? –

+0

質問が対象の場合と同じままでした。問題は定数に関するものではなく、シナリオをどのように設定するかではありません。問題は、フィールドがルールのデフォルト値を受け入れないことです。 –

関連する問題