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

मॉडल नियम में डिफ़ॉल्ट मान लागू किया जाता है। मुझे नहीं लगता कि यह खेतों को prefills। –

+0

@ck_arjun, ठीक है तो मैं यह फार्म के माध्यम से पोस्ट करते हैं और लगता है कि यह निर्धारित करना चाहिए एक '$ this-> 'ISAPI ='' मैं सही हूँ? –

उत्तर

1

आप इस नियम को स्वैप करना चाहिए:
[['isApi'], 'default', 'value'=> false]
[['isApi'], 'default', 'value'=> true, 'on' => 'restCreate']

आप इस वजह DefaultValueValidator Appling एकल क्षेत्र के लिए केवल एक बार करना चाहिए। यह वैधकर्ता केवल तभी चलाया जाता है जब फ़ील्ड का मान खाली हो। यह जांच है: \yii\validators\DefaultValueValidator::validateAttribute()

मॉडल मान्यताओं को एक-एक करके चलाता है। [['isApi'], 'default', 'value'=> false] सेट false को क्षेत्र के लिए महत्व देते हैं। [['isApi'], 'default', 'value'=> true, 'on' => 'restCreate'] देखें कि मान खाली नहीं है और छोड़ दिया गया है। जब मैदान खाली है

+1

शानदार! यह काम करता है। बहुत बहुत धन्यवाद। –

0

अपनी कार्रवाई में:

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

इसे इस तरह से करना जरूरी नहीं है। सार्वजनिक गुणों को सेट करना 'सार्वजनिक $ createScenario =' restCreate '; सार्वजनिक $ अद्यतनसेनारियो = 'restUpdate'; 'पर्याप्त होना चाहिए। –

+0

तो यह सभी क्रियाओं पर लागू होगा और आप डिफ़ॉल्ट मान सटीक नहीं कर सकते हैं। –

1

Yii मौजूदा परिदृश्य से केवल क्षेत्रों का उपयोग करता है। डिफ़ॉल्ट रूप से यह \yii\base\Model::SCENARIO_DEFAULT (default) में सेट होता है। डिफ़ॉल्ट परिदृश्य में on विशेषता के बिना नियमों से सभी फ़ील्ड शामिल हैं।

यदि आप कस्टम परिदृश्य का उपयोग करना चाहते हैं, तो आपको इसे सेट करना होगा। आप इसे दो तरीकों से कर सकते हैं:

  1. निर्माता द्वारा।
    $model = new Query(['scenario'=>'restCreate']);

  2. सेटर द्वारा।
    $model = new Query();
    $mosel->setScenario('restCreate');

परिदृश्यों के बारे में अधिक जानकारी के लिए this link देखें।

पीएस अच्छा अभ्यास परिदृश्य नाम के रूप में स्थिरांक का उपयोग कर रहा है। यह आपको परिदृश्यों के नामों में कम गलतियों को करने में मदद करता है। उदाहरण के लिए:

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

अपने उदाहरण के लिए धन्यवाद, मैं यहाँ पोस्ट करने से पहले documenation के इस भाग पढ़ा है।चूंकि मेरे नियंत्रक 'ActiveController' फैली वहाँ पूर्वनिर्धारित सार्वजनिक properties' $ createScenario' और' $ updateScenario' जो मेरे नियंत्रक में परिदृश्य स्थापित करने के लिए बू इस code' सार्वजनिक $ createScenario = 'restCreate' की अनुमति देता है कर रहे हैं; सार्वजनिक $ updateScenario = 'restUpdate'; 'Http://www.yiiframework.com/doc-2.0/yii-rest-activecontroller.html#$createScenario-detail –

+0

@IvanNosyrev Veri बिस्तर से Inglish सकता है। मैं काफी अपने प्रश्न कुछ छोड़ दिया समझ में नहीं आता? या फिर आप को समझाया गया है क्यों स्थिरांक का उपयोग नहीं करते? –

+0

सवाल एक विषय में के रूप में ही बने रहे। सवाल निरंतर के बारे में है, और नहीं के बारे में कैसे zasettit परिदृश्य नहीं है। सवाल है कि क्षेत्र के नियमों का डिफ़ॉल्ट मान को स्वीकार नहीं करता है। –

संबंधित मुद्दे