Керування записами Створення та редагування, Створення блогу за допомогою Yii 1
1. Налаштування правил доступу ¶
Перше, що ми запланували, — налаштування прав доступу. Код, згенерований за допомогою yiic, нам не підійде.
Необхідно змінити метод accessRules() у файлі /wwwroot/blog/protected/controllers/PostController.php наступним чином:
Описані вище правила дозволяють всім користувачам виконувати дії list та show. Аутентифікованим – будь-які дії, включаючи admin. Всім іншим користувачам заборонено. Варто зазначити, що правила використовуються в порядку їх опису. Перше правило, що спрацювало, визначає, давати доступ або не давати. Наприклад, якщо поточний користувач є власником системи і намагається зайти на сторінку створення запису, буде застосовано друге правило і доступ буде дозволено.
2. Виправлення у діях create та update ¶
Операції create та update досить схожі. В обох випадках потрібно вивести HTML форму для збору даних, які користувач вводить. Також потрібна валідація та збереження даних у БД. Головна відмінність у тому, що при update форма заповнюватиметься даними про редагований запис. Тому yiic генерує вкладене відображення /wwwroot/blog/protected/views/post/_form.php , яке включається як у відображення create , так і відображення update для виведення HTML форми.
Для початку змінимо файл _form.php таким чином, щоб форма збирала лише потрібні нам дані: title, content та status. Для перших двох атрибутів використовуємо текстові поля. Для status — список з усіма можливими станами запису:
Підказка: Для отримання станів можна замість Post::model()->statusOptions використовувати Post::model()->getStatusOptions() . Це можливо оскільки Post є компонентом, що даєможливість використовувати властивості, визначені як методи (гетери).
Далі змінимо клас Post таким чином, щоб він автоматично виставляв деякі атрибути (такі як createTime і authorId ) безпосередньо перед збереженням запису в БД. Перекриємо метод beforeValidate() :
Так як ми хочемо зберегти теги запису в таблицю Tag, нам знадобиться додати до класу Post метод, який буде викликатися автоматично після збереження запису:
Спочатку видаляємо всі записи, пов'язані з даною з таблиці PostTag. Потім вставляємо нові теги в таблицю Tag і додаємо відповідний запис PostTag . Логіка в даному випадку трохи складна, тому замість використання ActiveRecord ми пишемо вирази SQL і виконуємо їх безпосередньо через з'єднання з БД.
Підказка: Хорошим тоном є відділення бізнес-логіки, такий як beforeValidate() і afterSave() , описані вище та розміщення її в моделях, а не в контролерах.