0 follower

Створення та редагування записів

Після того, як ми закінчили із моделлю Post, займемося контролером PostController і його відображеннями. У даному розділі ми налаштуємо правила доступу операцій CRUD. Потім змінимо код, відповідальний за створення (create) та оновлення (update).

1. Налаштування правил доступу

Перше, що ми запланували - налаштування прав доступу. Код, згенерований за допомогою 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. Всім іншим користувачам заборонено все. Варто відзначити, що правила застосовуються у порядку їх опису. Перше правило, що спрацювало, визначає, давати доступ або не давати. Наприклад, якщо поточний користувач є власником системи та намагається зайти на сторінку створення запису, буде застосовано друге правило і доступ буде дозволений.

2. Правки у діях create та update

Операції create та update досить схожі. У обох випадках необхідно вивести HTML форму для збору даних, що вводяться користувачем. Також потрібна валідація та збереження даних у БД. Головна відмінність у тому, що при update форма буде заповнюватися даними запису, що редагується. З цієї причини gii генерує вкладене відображення /wwwroot/blog/protected/views/post/_form.php, яке включається як у відображення 'create', так і відображення 'update' для виводу HTML форми.

Для початку змінимо файл _form.php таким чином, щоб форма збирала тільки потрібні нам дані: title, content, tags та status. Для перших трьох атрибутів ми використовуємо текстові поля. Для status - випадаючий список з усіма можливими станами запису:

<?php 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 !