Создадим файл **common.inc.php**. Его мы будем использовать для подключения наиболее часто используемых классов.
Файл shop/common.inc.php:
Это самые часто используемые классы в нашем приложении. lmb_require() использует отложенную загрузку классов, так что сильного влияния на производительность эти две строки не будут иметь.
===== База данных =====
Проанализировав требования к нашему приложению, можно сделать вывод, что нам потребуется хранить в базе данных следующие сущности:
* Товары - таблица **product**.
* Зарегистрированные пользователи - таблица **user**.
* Заказы - таблица **order**.
* Позиции заказов - таблица **order_line**.
Все сущности мы будем реализовывать при помощи класса lmbActiveRecord пакета ACTIVE_RECORD. Напомним, что условием использования ACTIVE_RECORD является наличие автоинкременстного поля **id** в таблице.
Таблица **product**:
CREATE TABLE `product` (
`id` bigint(20) NOT NULL auto_increment,
`title` varchar(255) default NULL,
`description` text,
`is_available` tinyint(1) default NULL,
`price` float default NULL,
`image_name` varchar(255) default NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8
Таблица **user**:
CREATE TABLE `user` (
`id` bigint(20) NOT NULL auto_increment,
`name` varchar(255) default NULL,
`login` varchar(30) default NULL,
`hashed_password` varchar(32) default NULL,
`email` varchar(255) default NULL,
`is_admin` tinyint(1) default NULL,
`address` text,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8
Мы собираемся хранить всех наших пользователей в одной таблице. Наша система прав предполагается также очень простой, поэтому поля **is_admin** вполне хватит. Поле **address** будет использоваться для автоподстановки адреса доставки при отправке заказов покупателями.
Таблица **order**:
CREATE TABLE `order` (
`id` bigint(20) NOT NULL auto_increment,
`user_id` bigint(20) NOT NULL default '0',
`date` bigint(20) NOT NULL default '0',
`summ` float default NULL,
`status` int(11) default NULL,
`address` varchar(255) default NULL,
PRIMARY KEY (`id`),
KEY `user_id` (`user_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8
Таблица **order_line**:
CREATE TABLE `order_line` (
`id` bigint(20) NOT NULL auto_increment,
`order_id` bigint(20) NOT NULL default '0',
`product_id` bigint(20) default NULL,
`quantity` int(11) default NULL,
`price` int(11) default NULL,
PRIMARY KEY (`id`),
KEY `order_id` (`order_id`),
KEY `product_id` (`product_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8
Нам необходимо сохранить цену товара на момент покупки, поэтому таблица order_line имеет поле **price**.
Если вы выбрали копию готового примера с svn.limb-project.com/limb/3.x/examples/shop или с PEAR канала, тогда SQL-код структуры базы данных можно найти в файле shop/init/db.mysql
===== Папка для хранения изображений товаров =====
Создайте папку shop/www/product_images/. В этой папке мы будем хранить изображения для наших товаров.
Убедитесь, что веб-сервер имеет права на чтение и запись в эту папку.
Также скопируйте файл shop/www/images/no_image.gif в соответствующую папку своего проекта. Это изображение будет использоваться для товаров, у которых не будет изображения.
Теперь поправьте содержимое файла shop/setup.php следующим образом:
[...]
set_include_path(dirname(__FILE__) . PATH_SEPARATOR . get_include_path());
@define('LIMB_VAR_DIR', dirname(__FILE__) . '/var/');
@define('PRODUCT_IMAGES_DIR', dirname(__FILE__) . '/www/product_images/');
require_once('limb/core/common.inc.php');
[...]
Константа PRODUCT_IMAGES_DIR хранит абсолютный путь до папки с изображениями.
===== Базовые шаблоны =====
Мы начнем наше приложение с панели управления.
Для панели управления создадим также отдельный контроллер, AdminController (shop/src/controller/AdminController.class.php):
Создадим шаблоны для главной страницы панели управления, а также основной шаблон, который будет базой (базовый шаблон - враппер) для всех страниц панели управления.
Файл shop/template/admin/display.html:
Wellcome to Shop Example control panel!
Файл shop/template/admin_page.html
{$title} :: Limb shop example application
Limb Shop Example
control panel
{$title}
При помощи тега в шаблоне shop/template/admin/display.html мы установили заголовок страницы.
Мы позволили себе сразу же немного приукрасить наши шаблоны. Необходимые стили и изображения можно найти в папках shop/www/styles/ и shop/www/images/ готового приложения.
Надеемся, что WACT-теги [[limb3:ru:packages:wact:tags:core_tags:core_wrap_tag|]] и [[limb3:ru:packages:wact:tags:core_tags:core_placeholder_tag|]] вам уже знакомы по первому примеру. Вы также можете подробнее прочитать [[limb3:ru:packages:wact:template_composition|про композицию WACT-шаблонов]] чтобы вспомнить, как в WACT шаблоны собираются в единое целое из различных частей.
Область, которая лежит в мы пока оставили пустой. Профайлом пользователя мы займемся на шаге 4.
Теперь создадим шаблон для главной фронтальной страницы нашего приложения.
Файл shop/template/main_page/display.html:
Welcome to our bookstore!
Файл shop/template/page.html:
{$title} :: Limb shop example application
Limb Shop Example
front page
{$title}
Разница между page.html и admin_page.html у нас назначительная, но все равно решили сделать их отдельными файлами, так как различия будут добавляться по мере развития проекта. Также мы будем использовать одинаковые вспомогательные шаблоны:
* отображение ошибок валидации форм
* пейджер для отображения многостраничных списков
===== Первый взгляд на проект =====
Далее мы очишаем кеш в папке shop/var/ и пробуем зайти на страницу http://your_shop_example_domain/admin/ (далее просто /admin)
{{{limb3:ru:tutorials:shop:admin_display.png}}}
... и http://your_shop_example_domain/
Создадим также шаблон красиво отображающий 404 ошибку (страница не найдена):
Файл shop/template/not_found.html:
Error 404.
Page not found.
Шаблон not_found.html используется по-умолчанию контроллером NotFoundController (который можно найти в папке limb/web_app/src/controller/).
Попробуйте зайти на несущесвующую страницу, например /no_such_page, и вы увидите как отработает именно этот шаблон (возможно вам придется еще раз почистить кеш shop/var/).
===== Далее =====
Следующий шаг - [[.step3|"Шаг3. Создание и отображение списка товаров для администраторов"]]. Мы создадим для администраторов сайта список товаров с разделением на страницы, сделаем формы для создания нового товара и редактирования старых, реализуем действие для удаления товаров.
Большинство того, что будет сделано на 3-м шаге вам будет уже знакомо по первому примеру.