Behavior, как получить данные из поведения?

Общие вопросы по использованию фреймворка. Если не знаете как что-то сделать и это про Yii, вам сюда.
Ответить
skit
Сообщения: 135
Зарегистрирован: 2012.10.08, 12:50
Откуда: Сибирь
Контактная информация:

Behavior, как получить данные из поведения?

Сообщение skit »

Здравствуйте,
делаю загрузку файлов по рецепту http://yiiframework.ru/doc/cookbook/ru/ ... .fat.model, там приводится пример использования поведения. Я загружаю файл, всё хорошо, но теперь мне нужно переименовать его, уже после сохранения записи и файла.
В UploadableFileBehavior я попробовал добавить метод afterSave выдало ошибку. В самой модели метод перекрылся, теперь для переименования файла, согласно условиям, мне нужны данные файла, размер и тип. Я уже получал их в поведении, можно ли как-то к ним обратиться вновь из модели?

модель Category.php

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

    public function behaviors(){
        return array(
            // наше поведение для работы с файлом
            'uploadableFile'=>array(
                'class'=>'application.components.UploadableFileBehavior',
            ),
        );
    }

    public function afterSave(){
// здесь я хочу получить размер и тип файла
}
UploadableFileBehavior

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


    public function beforeSave($event){

        if(in_array($this->owner->scenario,$this->scenarios) &&
            ($file=CUploadedFile::getInstance($this->owner,$this->attributeName))){ // тут я уже получил все данные

...
    }
Спасибо.
Аватара пользователя
iAchilles
Сообщения: 41
Зарегистрирован: 2014.09.11, 19:44

Re: Behavior, как получить данные из поведения?

Сообщение iAchilles »

Чтобы работать с событиями ActiveRecord в поведениях, необходимо:
a) Если класс поведения расширяет CBehavior, определить в методе CBehavior::events() список событий, которые вы хотите слушать:

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

class UploadableFileBehavior extends CBehavior
{
     public function events()
     {
          return array('onAfterSave' => 'afterSaveHandler')
     }

     public function afterSaveHandler($event)
     {
          //type your code here
     }
}
б) Еще проще - класс поведения расширяет CActiveRecordBehavior, тогда и события определять не нужно,

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

class UploadableFileBehavior extends CActiveRecordBehavior
{

     public function afterSave($event)
     {
          //type your code here
     }

}

P.S. Обратиться к свойствам и методам поведения из модели, можно через ссылку на экземпляр поведения

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

$this->behaviorName->behaviorMethod();
skit
Сообщения: 135
Зарегистрирован: 2012.10.08, 12:50
Откуда: Сибирь
Контактная информация:

Re: Behavior, как получить данные из поведения?

Сообщение skit »

Большое спасибо, за развернутый ответ! все получилось
Ответить