Указание scenario при создании экземпляра AR, через find.
Указание scenario при создании экземпляра AR, через find.
Можно ли указать сценарий при создании экземпляра класса путем $post=Post::model()->findByPk(10)?
Необходимо при последующем “рендере” иметь дополнительное свойство, которого в таблице нет. (только при определенном сценарии).
Метод afterConstruct(), используется только при создании с помощью оператора New, метод afterFind() будет запускаться сразу же, не зависимо от сценария.
Подскажите, как можно реализовать это красиво, без дополнительного метода в модуле и последующего вызове в конструкторе аля $post->mymetod()
Спасибо.
Необходимо при последующем “рендере” иметь дополнительное свойство, которого в таблице нет. (только при определенном сценарии).
Метод afterConstruct(), используется только при создании с помощью оператора New, метод afterFind() будет запускаться сразу же, не зависимо от сценария.
Подскажите, как можно реализовать это красиво, без дополнительного метода в модуле и последующего вызове в конструкторе аля $post->mymetod()
Спасибо.
Re: Указание scenario при создании экземпляра AR, через find
ну как раз наверное в afterFind() и устанавливать нужный сценарий.
Re: Указание scenario при создании экземпляра AR, через find
собственно в том и вопрос как переопределить scenario до запуска afterFind()RusAlex писал(а):ну как раз наверное в afterFind() и устанавливать нужный сценарий.
Re: Указание scenario при создании экземпляра AR, через find
можно же обьявить как обычное свойство класса. и использовать его, либо не использовать. или можно завести геттер и сеттер этого свойства. и причем здесь scenario, оно относится ведь к валидации модели ?
RTFM !
Re: Указание scenario при создании экземпляра AR, через find
Если вам необходимо выставить сценарий до выборки, используйте метод beforeFind
Код: Выделить всё
protected function beforeFind()
{
$this->setScenario("someScenario");
parent::beforeFind();
}
Re: Указание scenario при создании экземпляра AR, через find
Прошу прощение, за то, что ввожу в заблуждение. Только что проверил, установка сценария в beforeFind ни коим образом не влияет на результат, т.к. ядро фреймворка переопределяет сценарий на update. Если же проводить установку в методе afterFind
то все проходит нормально
Код: Выделить всё
protected function afterFind()
{
$this->setScenario("someScenario2");
parent::afterFind();
}
Re: Указание scenario при создании экземпляра AR, через find
можно, но хотелось бы что б это свойство выполнялось автоматически, а не через контролер...because писал(а):можно же обьявить как обычное свойство класса. и использовать его, либо не использовать.
а где написано что scenario можно использовать только при валидации модели? (если я его буду использовать к примеру в afterSave() это будет не правильно?)because писал(а):и причем здесь scenario, оно относится ведь к валидации модели
тогда данный сценарий будет выполняться всегда, при каждом создании объекта путем $post=Post::model()->findByPk(10), этого мне не надо..MaxHero писал(а):Если же проводить установку в методе afterFind
спасибо.
Re: Указание scenario при создании экземпляра AR, через find
ну в afterFind можно какие-то условия добавить, при которых ваш сценарий должен включаться
Re: Указание scenario при создании экземпляра AR, через find
В таком случае, можем немного схитрить и сделать обертку над методом 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")
Re: Указание scenario при создании экземпляра AR, через find
собственно это то что нужно, кто то не понятно почему не сделали похожей метод по умолчанию, что б так не исголяться...MaxHero писал(а):В таком случае, можем немного схитрить и сделать обертку над методом findByPk
или это я опять заморочился с этой моделью, пихаю все в нее, а в контролере не одной лишней строчки вызова метода модели...
может прав был товарищ писавшей выше, что сценарий грамотнее использовать только при валидации модели?
ни как не получается четко разграничить функции и действия модели и контролера..
в любом случае спасибо.
Re: Указание scenario при создании экземпляра AR, через find
Я соглашусь с тем, что не стоит подобным образом использовать сценарии. Все таки основное назначение сценариев - это различное поведение моделей при валидации. Даже если данный код будете сопровождать в последствии только Вы, то все равно есть вероятность быть забытым факт оборачивания стандартного метода, что в последствии может привести к необъяснимым багам.
Если у модели дополнительное поле появляется при условии, что другое поле имеет определенное значение, то я бы сделал примерно так
Таким образом, реализовал бы динамическое read-only дополнительное поле
Если у модели дополнительное поле появляется при условии, что другое поле имеет определенное значение, то я бы сделал примерно так
Код: Выделить всё
public function getProperty()
{
if($this->object != "someObject")
{
throw new SomeException();
}
return "property";
}
Re: Указание scenario при создании экземпляра AR, через find
да именно это мне и нужно!MaxHero писал(а):Если у модели дополнительное поле появляется при условии, что другое поле имеет определенное значение, то я бы сделал примерно так
то есть сам метод getProperty() разместить в модели, а вызывать его из контролера путем $model->getProperty() ?
Re: Указание scenario при создании экземпляра AR, через find
Да, именно так. А кроме того, т.к. модель является наследником класса CComponent, который реализует геттеры/сеттеры, то мы вообще можем в контроллере писать $model->property
- tiron_alexey
- Сообщения: 13
- Зарегистрирован: 2010.07.13, 16:17
- Откуда: Одесса
- Контактная информация:
Re: Указание scenario при создании экземпляра AR, через find
$post=Post::model()->findByPk(10)
$post->scenario = 'yourscenario';
Чем не устраивает такой способ указания сценария?
$post->scenario = 'yourscenario';
Чем не устраивает такой способ указания сценария?
Re: Указание scenario при создании экземпляра AR, через find
тем что при вашем подходе следующий метод напишет "update" , а не 'yourscenario'$post=Post::model()->findByPk(10)
$post->scenario = 'yourscenario';
Чем не устраивает такой способ указания сценария?
Код: Выделить всё
protected function afterFind() {
echo $this->scenario ;
}
- lancecoder
- Сообщения: 2532
- Зарегистрирован: 2012.06.26, 17:16
Re: Указание scenario при создании экземпляра AR, через find
потому чт овы сначала ищите а потом задаете сценарий все логично