Создание и редактирование записей
После того, как мы закончили с моделью Post, займёмся контроллером
PostController и его отображениями. В данном разделе мы настроим правила
доступа операций CRUD. Затем изменим код, отвечающий за создание(create) и
обновление(update).
Настройка правил доступа
Первое, что мы запланировали — настройка
прав доступа. Код,
сгенерированный при помощи gii нам не подойдёт.
Необходимо изменить метод accessRules() в файле
/wwwroot/blog/protected/controllers/PostController.php следующим образом:
public function accessRules() { return array( array('allow', // позволим всем пользователям выполнять действия 'list' и 'show' 'actions'=>array('index', 'view'), 'users'=>array('*'), ), array('allow', // позволим аутентифицированным пользователям выполнять любые действия 'users'=>array('@'), ), array('deny', // остальным запретим всё 'users'=>array('*'), ), ); }
Описанные выше правила разрешают всем пользователям выполнять действия
index и view. Аутентифицированным — любые действия, включая admin.
Всем остальным пользователям запрещено всё. Стоит отметить, что правила
применяются в порядке их описания. Первое сработавшее правило определяет,
давать доступ или не давать. К примеру, если текущий пользователь является
владельцем системы и пытается зайти на страницу создания записи, будет применено
второе правило и доступ будет разрешён.
Правки в действиях create и update
Операции create и update довольно похожи. В обоих случаях требуется
вывести HTML форму для сбора данных, вводимых пользователем. Также требуется
валидация и сохранение данных в БД. Главное отличие в том, что при update
форма будет заполняться данными о редактируемой записи. По этой причине gii
генерирует вложенное отображение /wwwroot/blog/protected/views/post/_form.php,
которое включается как в отображение create, так и отображение update для
вывода HTML формы.
Для начала изменим файл _form.php таким образом, чтобы форма собирала только
нужные нам данные: title, content, tags и status. Для первых трёх атрибутов мы
используем текстовые поля. Для status — выпадающий список со всеми возможными
состояниями записи:
echo $form->dropDownList($model,'status',Lookup::items('PostStatus'));
В приведённом коде для получения списка статусов используется вызов Lookup::items('PostStatus').
Далее изменим класс Post таким образом, чтобы он автоматически выставлял
некоторые атрибуты (такие, как create_time и author_id) непосредственно перед
сохранением записи в БД. Перекроем метод beforeSave():
protected function beforeSave() { if(parent::beforeSave()) { if($this->isNewRecord) { $this->create_time=$this->update_time=time(); $this->author_id=Yii::app()->user->id; } else $this->update_time=time(); return true; } else return false; }
При сохранении записи мы хотим также обновить информацию о частоте использования
тегов в таблице tbl_tag. Мы можем реализовать это в методе afterSave(),
который автоматически вызывается после успешного сохранения записи в БД.
protected function afterSave() { parent::afterSave(); Tag::model()->updateFrequency($this->_oldTags, $this->tags); } private $_oldTags; protected function afterFind() { parent::afterFind(); $this->_oldTags=$this->tags; }
Так как необходимо определить, менял ли пользователь теги при редактировании
записи, нам понадобятся старые теги. Для этого мы реализуем метод
afterFind(), который записывает старые теги в свойство _oldTags. Метод
afterFind() вызывается автоматически при заполнении модели AR данными, полученными
из БД.
Здесь мы не будем детально рассматривать метод Tag::updateFrequency().
Заинтересованные читатели могут ознакомиться с ним в файле
/wwwroot/yii/demos/blog/protected/models/Tag.php.