Після того, як ми закінчили із моделлю 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.