Наше приложение будет базироваться на базе пакета CMS. Создать приложение можно двумя способами:
Модифицируем немного файл shop/setup.php:
<?php [...] //Подключим наиболее популярные файлы lmb_require('limb/web_app/src/controller/lmbController.class.php'); lmb_require('limb/active_record/src/lmbActiveRecord.class.php');
lmbController и lmbActiveRecord самые часто используемые классы в нашем приложении. lmb_require() использует отложенную загрузку классов, так что сильного влияния на производительность эти две строки не будут иметь.
А так же создадим файл setup.override.php, для упрощения разработки и отладки:
lmb_env_setor('LIMB_APP_MODE', 'devel');
Проанализировав требования к нашему приложению, можно сделать вывод, что нам потребуется хранить в базе данных следующие сущности:
Все сущности мы будем реализовывать при помощи класса lmbActiveRecord пакета ACTIVE_RECORD. Напомним, что условием использования ACTIVE_RECORD является наличие автоинкременстного поля id в таблице.
Таблица product:
CREATE TABLE `product` ( `id` INT(11) 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; CREATE TABLE `user` ( `id` INT(11) 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, `address` text, PRIMARY KEY (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8; CREATE TABLE `order` ( `id` INT(11) NOT NULL AUTO_INCREMENT, `user_id` INT(11) NOT NULL DEFAULT '0', `date` INT(11) 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; CREATE TABLE `order_line` ( `id` INT(11) NOT NULL AUTO_INCREMENT, `order_id` INT(11) NOT NULL DEFAULT '0', `product_id` INT(11) 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.
Если вы выбрали копию готового примера магазина, то SQL-код структуры базы данных можно найти в файле shop/init/db.mysql.
Не забудьте настроить параметры подключения к БД в файле shop/settings/db.conf.php.
Создайте папку shop/www/product_images/. В этой папке мы будем хранить изображения для наших товаров.
Убедитесь, что веб-сервер имеет права на чтение и запись в эту папку.
Также скопируйте файл shop/www/images/no_image.gif в соответствующую папку своего проекта. Это изображение будет использоваться для товаров, у которых не будет изображения.
Теперь добавим в shop/setup.php переменную окружения PRODUCT_IMAGES_DIR, в которой будем хранить абсолютный путь до папки с изображениями:
[...] lmb_env_setor('PRODUCT_IMAGES_DIR', dirname(__FILE__) . '/www/product_images/'); [...]
Мы начнем наше приложение с панели управления на базе пакета CMS. Для панели управления все базовые шаблоны и контроллеры уже созданы при создании базового приложения.
Надеемся, что MACRO-теги {{wrap}} и {{slot}} вам уже знакомы по первому примеру. Вы также можете подробнее прочитать про композицию MACRO-шаблонов чтобы вспомнить, как в MACRO шаблоны собираются в единое целое из различных частей.
Теперь создадим шаблон для главной фронтальной страницы нашего приложения.
Файл shop/template/main_page/display.phtml:
<? $this->title = 'Main page'; ?>
{{wrap with="front_page_layout.phtml" into="content_zone"}}
Welcome to our bookstore!
{{/wrap}}
И основной шаблон, который будет базой для всех страниц магазина.
Файл shop/template/front_page_layout.phtml:
<html> <head> <title>{$#title} :: Limb3 shop example application on {{macro}}</title> <meta http-equiv='Content-Type' content='text/html; charset=utf-8'/> <link rel=stylesheet type="text/css" href="http://bits.limb-project.com/shop/styles/main.css"/> </head> <body> <div id="header"> <div class="center"> <img src="http://bits.limb-project.com/shop/images/logo.limb.gif" width='384' height='46' alt='logo.limb' id='logo'/> <div id="limb_links"><a href="http://limb-project.com">limb-project.com</a> | <a href="http://bits.limb-project.com">bits.limb-project.com</a></div> </div> </div> <div id="center"> <div id="wrapper" > <div id="container"> <div id="content"> <h1>{$#title}</h1> {{slot id='content_zone'/}} </div> </div> <div id="sidebar"> <div id="navigation"> <ul> <li><a href="/product/">Products</a></li> <li><a href="/cart/">Your Cart</a></li> <li><a href="/user/login">Login</a></li> </ul> </div> <dl id="profile"> <dt>Profile</dt> <dd> Not yet implemented. </dd> </dl> </div> </div> </div> </body> </html>
Область, которая лежит в <dl id='profile'> мы пока оставили пустой. Профилем пользователя мы займемся на шаге 4.
Далее мы очищаем кеш в папке shop/var/ и пробуем зайти на страницу http://your_shop_example_domain/admin/ (логин admin, пароль secret) и http://your_shop_example_domain/.
Создадим также шаблон красиво отображающий 404 ошибку (страница не найдена):
Файл shop/template/not_found.phtml:
<? $this->title = 'Not found'; ?> {{wrap with="front_page_layout.phtml" in="content_zone"}} <b>Error 404.</b> <p>Page not found.</p> {{/wrap}}
Шаблон not_found.phtml используется по-умолчанию контроллером NotFoundController (который можно найти в папке limb/web_app/src/controller/).
Попробуйте зайти на несущесвующую страницу, например /no_such_page, и вы увидите как отработает именно этот шаблон (возможно вам придется еще раз почистить кеш shop/var/).
Следующий шаг - Шаг3. Пользователи, и все, что с ними связано.
Обсуждение