2015-09-19 11 views
5

Vedo nella pagina del modello Yii2 (http://www.yiiframework.com/doc-2.0/yii-base-model.html), nella sezione "campi" che è possibile impostare "" diversi elenchi di campi in base ad alcune informazioni di contesto. Ad esempio, a seconda di $ scenario o del privilegio dell'applicazione corrente utente, puoi restituire diversi set di campi visibili o filtrare alcuni campi. "Yii2: Posso utilizzare scenari per specificare diversi set di campi del modello per diverse azioni?

Tuttavia, la documentazione degli scenari (http://www.yiiframework.com/doc-2.0/guide-structure-models.html#scenarios) indica che gli scenari servono per creare un contesto diverso per la convalida degli attributi del modello.

Sto utilizzando l'API Restful Yii2, dove devo utilizzare le azioni predefinite (actionIndex, actionView, ...) per ottenere dati dal modello e mostrare come risultati API. So che posso ignorare questi metodi (http://www.yiiframework.com/doc-2.0/guide-rest-controllers.html#extending-active-controller), ma come posso dire in questi metodi di utilizzare diversi set di campi (a seconda dei diversi scenari)?

Quello che mi serve è l'output di field1, field2, field3 per actionIndex (elenco di elementi), ma voglio output field1, field2, field3, field4 per actionView (elenco di articoli).

+0

Non sono sicuro, non ho mai usato il resto API ... Derivate dalla classe del modello, introducete scenari (e forse regole) e quindi sovrascrivete i campi()? Nel controller, quindi, è necessario impostare lo scenario sul modello in ogni azione (ad esempio, è necessario sovrascrivere le implementazioni predefinite). Nei campi è quindi possibile decidere quali attributi devono essere abilitati per la chiamata implicita aArray(). In ogni caso, funziona comunque per te? – robsch

risposta

0

Lo fai nel tuo modello.

L'implementazione REST predefinita in Yii2 includerà solo gli attributi restituiti dal metodo fields(). Per impostazione predefinita, quel metodo restituisce tutti gli attributi. Pertanto, si definisce in questo modo:

class MyModel extends ActiveRecord 
{ 
    //... 
    public function fields() 
    { 
     switch ($this->scenario) { 
      case 'my_scenario_1': 
       return ['field1', 'field2']; 
      case 'my_scenario_2': 
       return ['field3', 'field4']; 
     } 
    } 
} 

Inoltre, è necessario il metodo scenarios() a vostra disposizione, che restituisce tutti gli attributi attivi per un determinato scenario.

Non dimenticare di impostare lo scenario dei modelli nel controller.

0

questa è la mia soluzione per questo problema, utilizzando Yii :: $ app() opere

public function fields() 
{ 
    if(Yii::$app->controller->action->uniqueId == 'controller/action'){ 
     return ['field_1','field_2','field_3','field_4']; 
    }else{ 
     return ['field_1','field_3']; 
    } 
} 

speranza per voi

1

Secondo questa guida: http://www.yiiframework.com/doc-2.0/guide-structure-models.html#scenarios

primo set per gli scenari in il tuo modello Esempio:

const SCENARIO_LESS = 'index'; 
const SCENARIO_MORE = 'view'; 

public function scenarios() 
{ 
    return [ 
     self::SCENARIO_LESS => ['field1', 'field2'], 
     self::SCENARIO_MORE => ['field1', 'field2', 'field3'], 
    ]; 
} 

ora nella vostra azione (s) è sufficiente impostare lo scenario come questo:

// scenario is set through configuration 
public function actionIndex() 
{ 
    $model = new User(['scenario' => User::SCENARIO_LESS]); 
    ... 
} 
... 
public function actionView() 
{ 
    $model = new User(['scenario' => User::SCENARIO_MORE]); 
    ... 
} 

che dovrebbe farlo.

Problemi correlati