2012-05-01 29 views
7

Giả sử tôi có một sản phẩm có thể có màu. Tùy thuộc vào loại sản phẩm, trường màu có thể hoặc không thể được yêu cầu.Yii - tự động thay đổi các quy tắc từ bộ điều khiển

Nếu màu sắc luôn được yêu cầu, tôi sẽ có những điều sau đây trong mô hình sản phẩm

public function rules() 
{ 
    return array(
     array('colour', 'required') 
    ); 
} 

Tuy nhiên, tôi muốn đây là động tùy thuộc vào loại sản phẩm.

Điều này có nên được thực hiện trong bộ điều khiển không? Tôi sẽ tưởng tượng có một cái gì đó như sau trong bộ điều khiển:

public function actionOrder() { 
    // .... 
    if ($product->HasColour) { 
     // set the colour validation to be required 
    } else { 
     // set the colour validation to be not required 
    } 
} 

Cách tốt nhất để tiếp cận điều này là gì?

Cảm ơn

+0

Nếu nó cụ thể cho một loại sản phẩm, do đó mô hình nên được thực hiện trong mô hình. – Zombaya

+0

Nhưng những gì bạn đang làm trong bộ điều khiển của bạn cũng chính xác, nếu forminput xác thực của bạn. Vì vậy, tôi đoán bạn không phạm sai lầm ở đây. – Zombaya

+0

Mô hình không biết sản phẩm cho đến khi actionOrder() được thực thi, phải không? –

Trả lời

15

Bạn có thể sử dụng kịch bản. Trong mô hình:

class Model extends CActiveRecord { 
    // .... 
    public function rules() { 
     return array(
      array('colour', 'required', 'on' => 'hasColour') 
     ); 
    } 
    // .... 
} 

Và trong bộ điều khiển:

public function actionOrder() { 
    // .... 
    $model = new Product(); 
    if ($product->HasColour) { 
     $model->setScenario('hasColour'); 
    } 
} 

Vì vậy, màu sắc theo yêu cầu sẽ được xác nhận khi kịch bản của mô hình là hasColour

+1

Điều này phù hợp với tôi. Cảm ơn! –

+0

chỉ có vấn đề là nó không thêm dấu hoa thị '*' tại nhãn tho: ( – user2636556

4

Một cách tiếp cận là sử dụng một quy tắc xác nhận tùy chỉnh. Ví dụ, các quy tắc:

array('colour', 'requiredOnHasColour'), 

Và sau đó phương pháp validator trong lớp mô hình tương tự:

public function requiredOnHasColour($attribute, $params) { 
    if ($this->hasColour && $this->$attribute == null) 
     $this->addError($attribute, 'Colour is required.'); 
} 

Thông tin thêm: Create your own validation rule

8
class LoginForm extends CFormModel 
{ 
    public $username; 
    public $password; 
} 

$form = new LoginForm(); 
$form->validatorList->add(
    CValidator::createValidator('required', $form, 'username, password') 
); 

Bây giờ $ form có hai trường bắt buộc.

+0

Điều này không thực sự giải quyết câu hỏi. Người dùng hỏi cách xử lý các tình huống trong đó một số dữ liệu được yêu cầu trong một nhưng không phải trong một và cách tiếp cận tốt nhất để thực hiện là gì. – Ren

0

Nếu bạn muốn thực hiện logic phức tạp hơn, thì các tình huống có thể không thỏa mãn nhu cầu của bạn. Sau đó, bạn có thể ghi đè lên phương thức init và thực hiện tất cả logic xác định các quy tắc xác nhận trên đó, thêm các kết quả vào mảng $ validationRules. Và phương thức rules() bạn chỉ trả về mảng đó. Một cái gì đó như thế:

class Person extends CActiveRecord 
{ 
    public function init(){ 
     if(TRUE){ 
      $this->validationRules[] = array('first_name','required'); 
      $this->validationRules[] = array('last_name','required'); 
     } 

    } 

    public $validationRules = array(
     array('email', 'required'), 
     array('email, email1, email2, email3', 'email', 'message'=>'Email format is invalid'), 
     array('email, address, email1, email2, email3', 'length', 'max'=>255), 

    ); 

    public function rules() 
    { 
     return $this->validationRules; 
    } 
} 
Các vấn đề liên quan