2015-12-17 14 views
6

Nie mogę wyjaśnić, dlaczego ustawienie domyślnej wartości nie działa dla mnie.Ustawianie domyślnej wartości modelu w zależności od scenariusza

Oto mój kontroler:

class QueryController extends ActiveController 

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

nie zastąpić domyślny createAction metody.

Model:

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; 
    } 

Podczas tworzenia nowego wpisu za pomocą sterownika spoczynku, należy ustawić isApi = true domyślnie, ale to nie działa w taki sposób. Jak przypisać domyślne wartości modelu w zależności od scenariusza?

+3

Wartości domyślne w regule modelu są stosowane, gdy pole jest puste. Nie sądzę, żeby wypełniał pola. –

+0

@ck_arjun, dobrze, więc powinienem opublikować go w formularzu i ustawić go jako '$ this-> isApi = '' 'Mam rację? –

Odpowiedz

1

Należy zamienić tej reguły:
[['isApi'], 'default', 'value'=> false]
[['isApi'], 'default', 'value'=> true, 'on' => 'restCreate']

Musisz to zrobić, ponieważ DefaultValueValidator appling tylko jeden raz dla jednego pola. Ten walidator działa tylko wtedy, gdy wartość pola jest pusta. Jest to czek: \yii\validators\DefaultValueValidator::validateAttribute()

Model uruchamia walidatory jeden po drugim. [['isApi'], 'default', 'value'=> false] ustawia wartość dla pola na false. [['isApi'], 'default', 'value'=> true, 'on' => 'restCreate'] zobacz, że wartość nie jest pusta i pominięta.

+1

Genialny! Działa. Wielkie dzięki. –

0

W swoim działaniu:

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

Nie trzeba tego robić w taki sposób. Ustawianie właściwości publicznych 'public $ createScenario = 'restCreate'; public $ updateScenario = 'restUpdate'; 'powinno wystarczyć. –

+0

następnie zastosuje się do wszystkich działań i nie można ustawić wartości domyślnej jako dokładnej. –

1

Yii używa tylko pola z obecnej sytuacji. Domyślnie ustawia się w \yii\base\Model::SCENARIO_DEFAULT(). Scenariusz domyślny zawiera wszystkie pola z reguł bez atrybutu on.

Jeśli chcesz użyć niestandardowego scenariusza, musisz go ustawić. Możesz to zrobić na dwa sposoby:

  1. Konstruktor.
    $model = new Query(['scenario'=>'restCreate']);

  2. Seterem.
    $model = new Query();
    $mosel->setScenario('restCreate');

Zobacz this link Więcej informacji na temat scenariuszy.

P.S. Dobra praktyka polega na użyciu stałych jako nazw scenariuszy. Pomaga zmniejszyć liczbę błędów w nazwach scenariuszy. Na przykład:

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

dziękuję za twoje przykłady, przeczytałem tę część dokumentacji przed opublikowaniem tutaj.Ponieważ mój kontroler 'rozciąga ActiveController' są predefiniowane properties' publicznego $ createScenario' i' $ updateScenario' który pozwala ustawić scenariusz w moim kontrolera bu to code' publicznego $ createScenario = „restCreate”; publicznego $ updateScenario = 'restUpdate'; 'Http://www.yiiframework.com/doc-2.0/yii-rest-activecontroller.html#$createScenario-detail –

+0

@IvanNosyrev Może Inglish z Veri łóżku. Nie do końca rozumiem, masz pytanie na lewo? A może wyjaśniłeś, dlaczego nie używasz stałych? –

+0

pytanie pozostały takie same, jak u osobnika. Pytanie nie dotyczy stałej, a nie tego, jak scenariusz zasettit. Pytanie brzmi, że pole nie akceptuje wartości domyślnej z reguł. –

Powiązane problemy