CValidator и его свойство "on"

Толи я сегодня пьян, толи… одно из двух.

в модели пишу:


    public function rules()

    {

        return array(

            array('email','email'),

            array('email','unique','on'=>'create'),

            array('login','unique','on'=>array('create')),

            array('verifyCode', 'captcha', 'allowEmpty'=>!Yii::app()->user->isGuest),

        );

    }

так вот, только прописываю свойство "on" (в любой интерпретации и в качестве строки и в качестве массива), проверка на уникальность перестает работать, что грустно.

Где я не прав?

Версия Yii - 1.0.11

А в контроллере перед валидацией $this->scenario = "create" указываешь?

нет, а надо?

и что такое этот сценарий? зачем? только для валидации?

в хелпе об этом свойстве контроллера "0".

Так уж ноль? :rolleyes: (только это свойство модели, а не контроллера).

http://www.yiiframework.com/doc/api/CModel#scenario-detail

При различных сценариях будут применяться соответствующие правила валидации, а те, что без "on" - во всех случаях.

Зачем нужно? Ну самое простое - использовать специальные (дополнительные) правила валидации для незарегестрированных пользователей, установив "on" => "guest".

так $this->scenario в контроллере или моделе надо указывать?

как и следовало ожидать $this->scenario в контроллере выдает ошибку

[b]

[/b]

применение в модели




public function beforeValidate(){

        if($this->isNewRecord){

            $this->scenario='create';

        }

...



тоже результата не дает

В контроллере перед $model->validate()


$model->scenario = 'create'

в модели в @on@ соответственно "create" пишешь. В beforeValidate я б это не пихал т.к. тогда для всего контроллера будет считаться что ты используешь этот сценарий. а ошибка у тебя потому что scenario это атрибут модели, а не контроллера

т.е. в контроллере будет вот так:




$model = new ModelName();

$model->attributes = $_POST['...'];

...

$model->scenario = "create";

if ($model->validate()) {

    $model->save();

}

Вот с API:

array(‘login’,‘unique’,‘on’=>array(‘create’))

и еще замечание: ‘on’=>строка (если сценариев несколько, то нужно разделить их запятыми).

Кстати для атрибута scenario кажется сетер есть какой то.

Тока по быстрому в апи найти не получилось.

Спасибо! работает.

в 1.1 точно так же?

Это как раз таки в 1.1.x и ввели. А вот в 1.0.х сценарий указывается в методе validate

но у меня 1.0.11 и все ок :slight_smile:

Скорее всего ошибка в API. Сам смотри, для 1.0.х пишется что сценарий можно указывать в validate методе:

А для 1.1.х версии, уже через переменную scenario, т.к. в методе validate этот парраметр вырезали:

Кстати по поводу сетера как я и говорил, можна не напрямую в $this->scenario забивать название сценария, а использовать метод $model->setScenario() (http://www.yiiframework.com/doc/api/CModel#setScenario-detail)

$this->scenario и не “забивает” название сценария напрямую :) Неявно вызывается сеттер, как и должно быть в тру ООП.

Ну да, похоже единственное место, где “подсказано”, что “on” может быть и массивом :)

http://www.yiiframework.com/doc/api/CModel#rules-detail - тут строка

http://www.yiiframework.com/doc/api/CValidator - даже здесь строка! но ниже уже массив…

Код CValidator дает ответ:




if(isset($params['on']))

{

    if(is_array($params['on']))

        $on=$params['on'];

    else

        $on=preg_split('/[\s,]+/',$params['on'],-1,PREG_SPLIT_NO_EMPTY);

}

else

    $on=array();



Но это я так, чтобы удовлетворить своё любопытство и незнание…

в тру ООП все равно красивее использовать уже сеттер а не запоминать названия всех атрибутов в голове. т.к. они в будущем могут меняться, а имена сеттера обычно оставляют :)

Да. Но Yii при таком обращении (->scenario = ‘abc’) ищет метод с именем setScenario. А уж в том методе может быть написано всё, что угодно, например $this->_scenarioooo = $value;

В общем, пора завязывать с обсуждением геттеров и сеттеров:) (а по-правильному, они свойствами зовутся).

по-правильному это тупо методы :) заканчиваем :)