Один из принципов ОО-программирования "Лучше использовать композицию, чем наследование". Воплотить этот принцип в жизнь нам помогают поведения (Behaviors).
Попробую объяснить проще, при наследовании дочерний класс получает открытые и защищенные методы родителя. Это здорово, но есть несколько недостатков. Родительский класс разрастается, некоторым детям совершенно не нужны методы и свойства родителя.
Поведения позволяют избавится от этих недостатков и добавлять к различным классам новые методы. Делается это достаточно просто - с помошью поведений мы делаем архитектуру приложения более гибкой и избавляемся от дублирования кода.
В фреймворке yii есть готовая реализация поведения - CTimestampBehavior (это поведение используется в моделях наших продуктов)
Используя это поведение мы можем указать атрибуты, которые отвечают за дату обновления и дату создания. После чего поведение будет записывать необходимые данные в эти поля, избавляя нас от написания кода для этих атрибутов в каждой модели в отдельности.
Чтобы понять как это происходит глянем в код класса CTimestampBehavior:
Т.к. данный класс поведения наследуется от CActiveRecordBehavior, он реализует набор методов для обработки событий жизненного цикла ActiveRecord. В данном случае используется метод beforSave. Самое интересное в этом коде $this->getOwner() - это "магический" метод, позволяющий получить модель к которой мы "подцепили" данное поведение, т.е можно работать со свойствами и методами этой модели.
Сделаем для наших пользователей в ORE возможность загрузки аватара.
Воспользуемся готовым поведением fileimagearbehavior. Скачиваем данное поведение и распаковываем его в папку protected\components\behaviors\FileARBehavior. Создаем директорию для пользовательских аваторок uploads/users, выставляем на нее права - 777
Теперь нам нужно подключить это великолепное поведение к модели User, которая находится по адресу - /protected/models/User.php. Добавляем следующее строчки в класс User:
Читаем комментарии в коде, думаю там все понятно. Теперь нужно добавить правило для данного поля в метод rules():
С моделью мы разобрались. Теперь добавим изменения в форму в личном кабинете пользователя, файл - /protected/modules/usercpanel/views/_info.php В самом начале добавляем htmlOptions:
Добавляем поле, в котором пользоваетль будет выбирать картинку:
В вышеприведенном коде, чтобы получить ссылку на картинку, пользуемся методом нашего поведния $avaSmallUrl = $model->avaImgBehavior->getFileUrl('ava_small'); и если картинка есть, то выводим ее в профиле. Добавим аватарку большего размера на страницу личного кабинета, в файле /protected/modules/usercpanel/views/index.php после заголовка h1 допишем:
Чтобы аватарка была видна не только самому пользователю, добавим ее на страницу объявления, рядом с "Телефон владельца" - /protected/modules/apartments/views/_view.php после строки c if(param('useShowUserInfo')) добавим вывод аватарки пользователя -
Итак, воспользовавшись готовым поведением мы добавили для каждого пользователя возможность загружать аватар. При этом не пришлось добавлять новое поле в базе данных. А при удалении пользователя поведение само удалит принадлежащие ему аватарки.