После того, как мы закончили с моделью 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
.
Found a typo or you think this page needs improvement?
Edit it on github !
Signup or Login in order to comment.