Вопрос по php – Yii - динамически менять правила из контроллера

7

Допустим, у меня есть продукт, который может иметь цвет. В зависимости от типа продукта, поле цвета может или не может быть обязательным.

Если цвет всегда требуется, у меня будет следующее в модели продукта

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

Тем не менее, я хочу, чтобы это было динамичным в зависимости от типа продукта.

Должно ли это быть сделано в контроллере? Я хотел бы представить что-то вроде следующего в контроллере:

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

Каков наилучший способ приблизиться к этому?

Спасибо

Если это характерно для типа продукта, то есть модели, это должно быть сделано в модели. Zombaya
Модель не знает продукта, пока не будет выполнена actionOrder (), нет? Adrian Gunawan
Что мне делать в контроллере? Как добавить правило модели в контроллер? Adrian Gunawan
Но то, что вы делаете в вашем контроллере, также правильно, если вы проверяете forminput. Так что, я думаю, вы здесь не ошибаетесь. Zombaya

Ваш Ответ

4   ответа
9
class LoginForm extends CFormModel
{
    public $username;
    public $password;
}

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

Это на самом деле не решает вопрос. Пользователь спрашивает, как обращаться со сценариями, когда некоторые данные требуются в одном, а не в другом, и каков наилучший подход.
4

проверки. Например, правило:

array('colour', 'requiredOnHasColour'),

И затем метод валидатора в том же классе модели:

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

Больше информации:Создайте свое собственное правило проверки

15

Вы можете использовать сценарий. В модели:

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

И в контроллере:

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

Таким образом, требуемый цвет будет подтвержден, когда сценарий моделиhasColour

Это работает для меня. Спасибо! Adrian Gunawan
единственная проблема заключается в том, что он не добавляет звездочку* на этикетке, хотя :(
1

то сценарии могут не удовлетворить ваши потребности. Затем вы можете переопределить метод init и выполнить всю логику, определяющую правила валидации, добавив результаты в массив $ validationRules. И в методе rules () вы просто возвращаете этот массив. Что-то вроде того:

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

Похожие вопросы