2015-12-17 13 views
6

Tôi không thể phân loại tại sao cài đặt giá trị mặc định không hoạt động đối với tôi.Đặt giá trị kiểu mặc định tùy thuộc vào một trường hợp

Đây là bộ điều khiển của tôi:

class QueryController extends ActiveController 

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

tôi không ghi đè lên các phương pháp mặc định createAction.

mẫu:

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

Khi tôi tạo ra một mục mới thông qua một bộ điều khiển Nghỉ ngơi, cần thiết isApi = true theo mặc định, nhưng nó không hoạt động theo cách như vậy. Làm thế nào tôi có thể gán một giá trị mô hình mặc định tùy thuộc vào kịch bản?

+3

Giá trị mặc định trong quy tắc mô hình được áp dụng khi trường trống. Tôi không nghĩ rằng nó điền vào các lĩnh vực. –

+0

@ck_arjun, được rồi, vậy tôi nên đăng nó qua biểu mẫu và đặt nó như một '$ this-> isApi = '' 'Tôi có đúng không? –

Trả lời

1

Bạn nên trao đổi quy tắc này:
[['isApi'], 'default', 'value'=> false]
[['isApi'], 'default', 'value'=> true, 'on' => 'restCreate']

Bạn phải làm điều này vì DefaultValueValidator appling một lần duy nhất cho lĩnh vực duy nhất. Trình xác thực này chỉ chạy nếu giá trị của trường trống. Có kiểm tra này: \yii\validators\DefaultValueValidator::validateAttribute()

Trình xác thực chạy mô hình từng cái một. [['isApi'], 'default', 'value'=> false] đặt giá trị cho trường thành false. [['isApi'], 'default', 'value'=> true, 'on' => 'restCreate'] thấy giá trị đó không trống và bỏ qua.

+1

Brilliant! Nó hoạt động. Cảm ơn rất nhiều. –

0

Trong hành động của bạn:

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

Không cần thiết phải thực hiện theo cách như vậy. Thiết lập các thuộc tính công khai 'public $ createScenario = 'restCreate'; public $ updateScenario = 'restUpdate'; 'là đủ. –

+0

sau đó nó sẽ được áp dụng trên tất cả các hành động và bạn không thể mặc định giá trị chính xác. –

1

Yii chỉ sử dụng các lĩnh vực từ kịch bản hiện hành. Theo mặc định, nó được đặt trong \yii\base\Model::SCENARIO_DEFAULT (default). Kịch bản mặc định chứa tất cả các trường từ quy tắc mà không có thuộc tính on.

Nếu bạn muốn sử dụng kịch bản tùy chỉnh, bạn phải đặt nó. Bạn có thể thực hiện việc này theo hai cách:

  1. Bằng hàm tạo.
    $model = new Query(['scenario'=>'restCreate']);

  2. Bằng cách thiết lập.
    $model = new Query();
    $mosel->setScenario('restCreate');

Xem this link để biết thêm thông tin về kịch bản.

P.S. Thực hành tốt là sử dụng hằng số làm tên kịch bản. Nó giúp bạn làm cho ít sai lầm hơn trong tên của kịch bản. Ví dụ:

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

cảm ơn vì các ví dụ của bạn, tôi đã đọc phần tài liệu này trước khi đăng bài ở đây.Kể từ khi bộ điều khiển của tôi 'kéo dài ActiveController' có được xác định trước properties' công cộng $ createScenario' và '$ updateScenario' cho phép để thiết lập kịch bản trong điều khiển của tôi bu này code' công cộng $ createScenario = 'restCreate'; công cộng $ updateScenario = 'restUpdate'; 'Http://www.yiiframework.com/doc-2.0/yii-rest-activecontroller.html#$createScenario-detail –

+0

@IvanNosyrev May Inglish từ giường VERI. Tôi không hoàn toàn hiểu, bạn có một câu hỏi cho một số trái? Hay bạn chỉ giải thích tại sao bạn không sử dụng hằng số? –

+0

câu hỏi vẫn giống như trong một chủ đề. Câu hỏi đặt ra không phải là về liên tục, và không phải là về kịch bản như thế nào zasettit. Câu hỏi đặt ra là trường không chấp nhận giá trị mặc định từ các quy tắc. –

Các vấn đề liên quan