Указание scenario при создании экземпляра AR, через find.

Общие вопросы по использованию фреймворка. Если не знаете как что-то сделать и это про Yii, вам сюда.
Ответить
kostyan
Сообщения: 66
Зарегистрирован: 2011.08.23, 11:46

Указание scenario при создании экземпляра AR, через find.

Сообщение kostyan »

Можно ли указать сценарий при создании экземпляра класса путем $post=Post::model()->findByPk(10)?
Необходимо при последующем “рендере” иметь дополнительное свойство, которого в таблице нет. (только при определенном сценарии).
Метод afterConstruct(), используется только при создании с помощью оператора New, метод afterFind() будет запускаться сразу же, не зависимо от сценария.
Подскажите, как можно реализовать это красиво, без дополнительного метода в модуле и последующего вызове в конструкторе аля $post->mymetod()

Спасибо.
Аватара пользователя
RusAlex
Сообщения: 324
Зарегистрирован: 2010.08.29, 15:30

Re: Указание scenario при создании экземпляра AR, через find

Сообщение RusAlex »

ну как раз наверное в afterFind() и устанавливать нужный сценарий.
kostyan
Сообщения: 66
Зарегистрирован: 2011.08.23, 11:46

Re: Указание scenario при создании экземпляра AR, через find

Сообщение kostyan »

RusAlex писал(а):ну как раз наверное в afterFind() и устанавливать нужный сценарий.
собственно в том и вопрос как переопределить scenario до запуска afterFind()
Аватара пользователя
because
Сообщения: 689
Зарегистрирован: 2010.09.30, 22:01

Re: Указание scenario при создании экземпляра AR, через find

Сообщение because »

можно же обьявить как обычное свойство класса. и использовать его, либо не использовать. или можно завести геттер и сеттер этого свойства. и причем здесь scenario, оно относится ведь к валидации модели ?
RTFM !
Аватара пользователя
MaxHero
Сообщения: 144
Зарегистрирован: 2011.09.12, 04:34
Откуда: Украина, Киев

Re: Указание scenario при создании экземпляра AR, через find

Сообщение MaxHero »

Если вам необходимо выставить сценарий до выборки, используйте метод beforeFind

Код: Выделить всё

protected function beforeFind()
{
    $this->setScenario("someScenario");
    parent::beforeFind();
}
 
Аватара пользователя
MaxHero
Сообщения: 144
Зарегистрирован: 2011.09.12, 04:34
Откуда: Украина, Киев

Re: Указание scenario при создании экземпляра AR, через find

Сообщение MaxHero »

Прошу прощение, за то, что ввожу в заблуждение. Только что проверил, установка сценария в beforeFind ни коим образом не влияет на результат, т.к. ядро фреймворка переопределяет сценарий на update. Если же проводить установку в методе afterFind

Код: Выделить всё

protected function afterFind()
{
    $this->setScenario("someScenario2");
    parent::afterFind();
}
 
то все проходит нормально
kostyan
Сообщения: 66
Зарегистрирован: 2011.08.23, 11:46

Re: Указание scenario при создании экземпляра AR, через find

Сообщение kostyan »

because писал(а):можно же обьявить как обычное свойство класса. и использовать его, либо не использовать.
можно, но хотелось бы что б это свойство выполнялось автоматически, а не через контролер...
because писал(а):и причем здесь scenario, оно относится ведь к валидации модели
а где написано что scenario можно использовать только при валидации модели? (если я его буду использовать к примеру в afterSave() это будет не правильно?)
MaxHero писал(а):Если же проводить установку в методе afterFind
тогда данный сценарий будет выполняться всегда, при каждом создании объекта путем $post=Post::model()->findByPk(10), этого мне не надо..

спасибо.
Аватара пользователя
RusAlex
Сообщения: 324
Зарегистрирован: 2010.08.29, 15:30

Re: Указание scenario при создании экземпляра AR, через find

Сообщение RusAlex »

ну в afterFind можно какие-то условия добавить, при которых ваш сценарий должен включаться
Аватара пользователя
MaxHero
Сообщения: 144
Зарегистрирован: 2011.09.12, 04:34
Откуда: Украина, Киев

Re: Указание scenario при создании экземпляра AR, через find

Сообщение MaxHero »

В таком случае, можем немного схитрить и сделать обертку над методом findByPk

Код: Выделить всё

public function findByPk($pk, $scenario = false)
{
    $result = parent::findByPk($pk);
        
    if($scenario)
    {
        $result->setScenario($scenario);
    }
        
    return $result;
}
 
И проводить выборку следующим образом

Код: Выделить всё

$post=Post::model()->findByPk(10, "someScenario")
 
Но это возможно, только если у нас нет выборок вида

Код: Выделить всё

$post=Post::model()->findByPk(10, "author_id = 30")
 
kostyan
Сообщения: 66
Зарегистрирован: 2011.08.23, 11:46

Re: Указание scenario при создании экземпляра AR, через find

Сообщение kostyan »

MaxHero писал(а):В таком случае, можем немного схитрить и сделать обертку над методом findByPk
собственно это то что нужно, кто то не понятно почему не сделали похожей метод по умолчанию, что б так не исголяться...
или это я опять заморочился с этой моделью, пихаю все в нее, а в контролере не одной лишней строчки вызова метода модели...
может прав был товарищ писавшей выше, что сценарий грамотнее использовать только при валидации модели?
ни как не получается четко разграничить функции и действия модели и контролера..
в любом случае спасибо.
Аватара пользователя
MaxHero
Сообщения: 144
Зарегистрирован: 2011.09.12, 04:34
Откуда: Украина, Киев

Re: Указание scenario при создании экземпляра AR, через find

Сообщение MaxHero »

Я соглашусь с тем, что не стоит подобным образом использовать сценарии. Все таки основное назначение сценариев - это различное поведение моделей при валидации. Даже если данный код будете сопровождать в последствии только Вы, то все равно есть вероятность быть забытым факт оборачивания стандартного метода, что в последствии может привести к необъяснимым багам.

Если у модели дополнительное поле появляется при условии, что другое поле имеет определенное значение, то я бы сделал примерно так

Код: Выделить всё

public function getProperty()
{
    if($this->object != "someObject")
    {
        throw new SomeException();
    }
    
    return "property";
}
 
Таким образом, реализовал бы динамическое read-only дополнительное поле
kostyan
Сообщения: 66
Зарегистрирован: 2011.08.23, 11:46

Re: Указание scenario при создании экземпляра AR, через find

Сообщение kostyan »

MaxHero писал(а):Если у модели дополнительное поле появляется при условии, что другое поле имеет определенное значение, то я бы сделал примерно так
да именно это мне и нужно!
то есть сам метод getProperty() разместить в модели, а вызывать его из контролера путем $model->getProperty() ?
Аватара пользователя
MaxHero
Сообщения: 144
Зарегистрирован: 2011.09.12, 04:34
Откуда: Украина, Киев

Re: Указание scenario при создании экземпляра AR, через find

Сообщение MaxHero »

Да, именно так. А кроме того, т.к. модель является наследником класса CComponent, который реализует геттеры/сеттеры, то мы вообще можем в контроллере писать $model->property
Аватара пользователя
tiron_alexey
Сообщения: 13
Зарегистрирован: 2010.07.13, 16:17
Откуда: Одесса
Контактная информация:

Re: Указание scenario при создании экземпляра AR, через find

Сообщение tiron_alexey »

$post=Post::model()->findByPk(10)
$post->scenario = 'yourscenario';
Чем не устраивает такой способ указания сценария?
zohei
Сообщения: 20
Зарегистрирован: 2012.04.30, 21:02
Откуда: vrn
Контактная информация:

Re: Указание scenario при создании экземпляра AR, через find

Сообщение zohei »

$post=Post::model()->findByPk(10)
$post->scenario = 'yourscenario';
Чем не устраивает такой способ указания сценария?
тем что при вашем подходе следующий метод напишет "update" , а не 'yourscenario'

Код: Выделить всё

protected function afterFind() {
        echo $this->scenario ; 
} 
Аватара пользователя
lancecoder
Сообщения: 2532
Зарегистрирован: 2012.06.26, 17:16

Re: Указание scenario при создании экземпляра AR, через find

Сообщение lancecoder »

потому чт овы сначала ищите а потом задаете сценарий все логично
Ответить