- Начало
- Начальное прототипирование
- Управление записями
- Управление комментариями
- Портлеты
- Последние штрихи
Генерация каркаса
Create, read, update и delete (CRUD) — четыре основных операции, при помощи которых можно управлять объектами данных. Так как реализация CRUD является типичной задачей для любого веб-приложения, для автоматизации можно воспользоваться специальными инструментами для генерации кода Gii (также известным как скаффолдинг).
Примечание: Gii доступен начиная с версии 1.1.2. До этого мы бы использовали yiic shell.
Далее мы опишем как использовать данный инструмент для реализации операций CRUD записей и комментариев нашего блога.
Установка Gii
Для начала необходимо установить Gii. Открываем файл
/wwwroot/blog/protected/config/main.php и добавляем следующее:
return array( ...... 'import'=>array( 'application.models.*', 'application.components.*', ), 'modules'=>array( 'gii'=>array( 'class'=>'system.gii.GiiModule', 'password'=>'ваш пароль', ), ), );
Код выше включает модуль с именем gii, который позволяет нам использовать
Gii по следующему URL:
http://www.example.com/blog/index.php?r=gii
Будет запрошен пароль, который мы указали в
/wwwroot/blog/protected/config/main.php. После этого будет показана страница
со всеми доступными инструментами генерации кода.
Примечание: Код, приведённый выше не должен попасть на сервер. Инструменты для генерации кода должны использоваться только при разработке.
Создание моделей
Для начала нам необходимо создать классы моделей для каждой из таблиц в БД. Эти классы позволят нам работать с БД в стиле ООП, что будет показано далее в данном руководстве.
Запускаем Model Generator. На странице вводим tbl_user (имя таблицы,
хранящей пользователей) в поле Table Name, tbl_ в поле Table Prefix и нажимаем кнопку Preview.
Будет показана таблица, ссылки в которой позволят просмотреть код, который мы
собираемся сгенерировать. Если всё в порядке, можно нажимать Generate. При этом
код будет сохранён в файл.
Информация: Так как генератору кода необходимо сохранить код в файлы, процесс должен иметь права на создание и изменение соответствующих файлов. Проще всего дать процессу права на запись во всю директорию
/wwwroot/blog. Стоит отметить, что это требуется сделать только на машине разработчика при использованииGii.
Повторим те же действия для всех остальных таблиц БД, включая
tbl_post, tbl_comment, tbl_tag и tbl_lookup.
Подсказка: Также мы можем ввести '*' в поле
Table Name. Так мы сгенерируем модели для каждой таблицы БД за один раз.
На данном этапе у нас будут созданы следующие файлы:
models/User.phpсодержит классUser, который наследуется от CActiveRecord и может использоваться для обращения к таблицеtbl_user;models/Post.phpсодержит классPost, который наследуется от CActiveRecord и может использоваться для обращения к таблицеtbl_post;models/Tag.phpсодержит классTag, который наследуется от CActiveRecord и может использоваться для обращения к таблицеtbl_tag;models/Comment.phpсодержит классComment, который наследуется от CActiveRecord и может использоваться для обращения к таблицеtbl_comment;models/Lookup.phpсодержит классLookup, который наследуется от CActiveRecord и может использоваться для обращения к таблицеtbl_lookup.
Реализация операций CRUD
После того, как были созданы классы модели, мы можем использовать Crud Generator
для генерации кода операций CRUD для них. Сделаем это для моделей Post и Comment.
На странице Crud Generator введём Post (имя модели записи блога, которую мы
создали ранее) в поле Model Class и нажмём Preview, а затем Generate.
Повторим эти же действия для модели Comment.
Рассмотрим сгенерированные файлы в /wwwroot/blog/protected. Для удобства
сгруппируем их в файлы контроллеров и
файлы представлений:
файлы контроллеров:
Controllers/PostController.phpсодержит классPostController, который является контроллером, отвечающим за все операции CRUD для записей;Controllers/CommentController.phpсодержит классCommentController, который является контроллером, отвечающим за все операции CRUD для комментариев;
файлы представлений:
views/post/create.php— файл представления, который показывает HTML-форму для создания записи;views/post/update.php— файл представления, который показывает HTML-форму для обновления записи;views/post/view.php— файл представления, который отображает подробную информацию записи;views/post/index.php— файл представления, который отображает список записей;views/post/admin.php— файл представления, который отображает записи в таблице с административными командами.views/post/_form.php— частичный файл представления, используемый вviews/post/create.phpиviews/post/update.php. Он отображает HTML-форму для сбора информации о записи.views/post/_view.php— частичный файл представления, используемый вviews/post/index.php. Он отображает краткий вид отдельной записи.views/post/_search.php— файл представления, используемый вviews/post/admin.php. Используется для формы поиска.- Подобный набор файлов представлений также сгенерирован для комментариев.
Тестирование
Мы можем проверить работу сгенерированного кода, используя следующие URL:
http://www.example.com/blog/index.php?r=post http://www.example.com/blog/index.php?r=comment
Стоит отметить, что возможности по управлению записями и комментариями полностью
независимы. Также, при создании новой записи или комментария необходимо вводить
такие данные, как author_id и create_time, что в реальном приложении должно
делаться автоматически. Не беспокойтесь, мы исправим эти проблемы далее.
На данный момент прототип уже содержит большинство возможностей, необходимых
нашему блогу.
Чтобы лучше понять, как используются файлы выше, рассмотрим, что происходит при отображении списка записей:
- Пользователь запрашивает URL
http://www.example.com/blog/index.php?r=post; - Входной скрипт выполняется Web-сервером и инициализирует экземпляр приложения для обработки запроса;
- Приложение создает экземпляр класса
PostControllerи выполняет его; - Экземпляр класса
PostControllerвыполняет действиеindex(методactionIndex()). Отметим, чтоindexявляется действием по умолчанию и используется в случае, если пользователь не указал действие в URL; - Метод
actionIndex()делает запрос к базе данных для получения списка последних записей; - Метод
actionIndex()генерирует представлениеindexс данными записей.
