2012-05-01 15 views
7

Załóżmy, że mam produkt, który może mieć kolor. W zależności od rodzaju produktu pole koloru może być wymagane lub nie.Yii - dynamicznie zmieniaj reguły ze sterownika

Jeśli zawsze jest wymagany kolor, chciałbym mieć następujące parametry w modelu produktu

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

Jednakże chcę to być dynamiczny w zależności od rodzaju produktu.

Czy należy to zrobić w kontrolerze? Wyobrażam sobie posiadanie czegoś w kontrolerach:

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

Jaki jest najlepszy sposób podejścia do tego?

Dzięki

+0

Jeśli jest specyficzne dla rodzaju produktu, a więc modelu, który należy wykonać w modelu. – Zombaya

+0

Ale to, co robisz w kontrolerze, jest również poprawne, jeśli walidujesz forminarność. Sądzę, że nie popełniasz tutaj błędów. – Zombaya

+0

Model nie zna produktu, dopóki nie zostanie wykonane działanie actionOrder(), nie? –

Odpowiedz

15

Możesz użyć scenariusza. W modelu

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

iw sterowniku:

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

Tak, wymagany kolor zostanie zatwierdzone, gdy scenariusz modelki jest hasColour

+1

To działa dla mnie. Dzięki! –

+0

Jedynym problemem jest to, że nie dodaje gwiazdki "*" na etykiecie tho :( – user2636556

4

Jednym ze sposobów jest użycie niestandardową regułę sprawdzania poprawności. Na przykład zasada:

array('colour', 'requiredOnHasColour'), 

I wtedy metoda walidator w tej samej klasie modelu:

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

Więcej informacji: 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') 
); 

Teraz $ forma ma dwa wymagane pola.

+0

To tak naprawdę nie odpowiada na pytanie. Użytkownik pyta, jak obsługiwać scenariusze, w których niektóre dane są wymagane w jednym, ale nie w innym i jakie jest najlepsze podejście. – Ren

0

Jeśli chcesz wykonać bardziej skomplikowaną logikę, scenariusze mogą nie zaspokoić Twoich potrzeb. Następnie możesz przesłonić metodę init i wykonać całą logikę definiującą reguły sprawdzania poprawności, dodając wyniki do tablicy $ validationRules. A w metodzie rules() właśnie zwracasz tę tablicę. Coś w tym stylu:

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; 
    } 
} 
Powiązane problemy