Разные действия на afterSave()

Общие вопросы по использованию фреймворка. Если не знаете как что-то сделать и это про Yii, вам сюда.
Ответить
Nihisil
Сообщения: 118
Зарегистрирован: 2010.08.05, 06:39

Разные действия на afterSave()

Сообщение Nihisil »

У меня в модели категории есть метод:

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

public function afterSave() {
        if (!$this->isNewRecord) {
            $products = Product::model()->findAllByAttributes(array('categoryId' => $this->id));
            foreach ($products as $product) {
                $product->сategoryId = $this->id;
                $product->categoryUrl = $this->url;
                $product->categoryName = $this->name;
                $product->save();
            }
        }
        return parent::afterSave();
    }
 
Можно ли как-нибудь сделать средставми yii, чтобы этот метод вызывался только в определенном случае? Например при вызове экшена /category/edit/id/1? А когда будем сохранять категорию из других экшенов, этот метод будем обходить стороной.
Аватара пользователя
slavcodev
Сообщения: 3134
Зарегистрирован: 2009.04.02, 21:42
Откуда: Valencia
Контактная информация:

Re: Разные действия на afterSave()

Сообщение slavcodev »

Почему нет? В методе можно проверять Yii::app()->controller->action->id
Хотя это не совсем правильно.
Правильнее навешивать событие в контроллере.
Жду Yii 3!
byteasdf
Сообщения: 99
Зарегистрирован: 2010.09.15, 09:01

Re: Разные действия на afterSave()

Сообщение byteasdf »

Самое простое, это оформить этот метод как событие и прицеплять его только в нужных действиях.
Оформляем событие:

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

public function afterSaveEvent($event) { // создаем функцию-обработчик события
    $sender = $event->sender; // получаем экземпляр класса, который был сохранен
    if (!$sender->isNewRecord) {
        $products = Product::model()->findAllByAttributes(array('categoryId' => $sender->id));
        foreach ($products as $product) {
            $product->сategoryId = $this->id;
            $product->categoryUrl = $this->url;
            $product->categoryName = $this->name;
            $product->save();
        }
    }
}
 
В действии, где необходимо срабатывание этого события:

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

$model = new Model(); // или любое другое действие получающее экземпляр модели
$model->onAfterSave = array($model,'afterSaveEvent'); // подключаем событие
$model->save(); // после сохранения модели событие выполнится.
 
Во всех остальных действиях это событие выполнятся не будет.
Последний раз редактировалось byteasdf 2011.04.14, 09:32, всего редактировалось 1 раз.
Аватара пользователя
slavcodev
Сообщения: 3134
Зарегистрирован: 2009.04.02, 21:42
Откуда: Valencia
Контактная информация:

Re: Разные действия на afterSave()

Сообщение slavcodev »

byteasdf писал(а):Самое простое, это оформить этот метод как событие и прицеплять его только в нужных действиях.
Это к тому же самое правильное решение по отношению к MVC
Жду Yii 3!
Аватара пользователя
yii
Сообщения: 122
Зарегистрирован: 2010.04.29, 10:40

Re: Разные действия на afterSave()

Сообщение yii »

может я немного не в тему, но зачем вот эта строчка:

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

$product->сategoryId = $this->id; 
Nihisil
Сообщения: 118
Зарегистрирован: 2010.08.05, 06:39

Re: Разные действия на afterSave()

Сообщение Nihisil »

byteasdf писал(а):Самое простое, это оформить этот метод как событие и прицеплять его только в нужных действиях.
Оформляем событие:

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

public function afterSaveEvent($event) { // создаем функцию-обработчик события
    $sender = $event->sender; // получаем экземпляр класса, который был сохранен
    if (!$sender->isNewRecord) {
        $products = Product::model()->findAllByAttributes(array('categoryId' => $sender->id));
        foreach ($products as $product) {
            $product->сategoryId = $this->id;
            $product->categoryUrl = $this->url;
            $product->categoryName = $this->name;
            $product->save();
        }
    }
}
 
В действии, где необходимо срабатывание этого события:

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

$model = new Model(); // или любое другое действие получающее экземпляр модели
$model->onAfterSave = array($model,'afterSaveEvent'); // подключаем событие
$model->save(); // после сохранения модели событие выполнится.
 
Во всех остальных действиях это событие выполнятся не будет.
Спасибо за ответ
Nihisil
Сообщения: 118
Зарегистрирован: 2010.08.05, 06:39

Re: Разные действия на afterSave()

Сообщение Nihisil »

yii писал(а):может я немного не в тему, но зачем вот эта строчка:

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

$product->сategoryId = $this->id; 
Да, это тут лишнее
Ответить