====== Шаг2. Запуск приложения. База данных. Базовые шаблоны ====== ===== Запуск проекта ===== Мы предполагаем, что вы уже знакомы с процедурой создания каркаса приложения на базе пакета WEB_APP. Краткие шаги: * Скопируйте содержимое из папки limb/web_app/examples/empty_app в директорию с вашим приложением, например shop/. * Настройте веб-сервер на работу в этот папкой. В качестве корневой директории укажите shop/www/ * Убедитесь, что веб-сервер имеет права на запись в папку var, которая находится в корне вашего приложения, то есть shop/var/ * Убедитесь, что путь где находится limb есть в настроечной переменной php include_path. Если вы ставите Limb3 через PEAR, то ничего делать не нужно. * Попробуйте зайти на страницу проекта. Вы должны увидеть страницу с надписью “Default main page.” Если это так, значит все настроено нормально. * Создайте пустую базу данных, скажем, limb_shop_example * Настройте файл shop/settings/db.conf.php, а именно, укажите название вашей базы данных в параметре **database**, логин и пароль подключения к базе данных. ===== Часто используемые классы. Файл common.php проекта ===== Модифицируем немного файл shop/setup.php: Создадим файл **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

{$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

{$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-м шаге вам будет уже знакомо по первому примеру.