Разработка интернет-магазина одежды
Разработка сайта интернет-магазина, управляемого базой данных. Установка XAMPP, разделение кода и оформления с помощью Smarty. Начало реализации проекта Goodstore. Создание каталога товаров. Создание модели данных с помощью ALLFUSION ERWIN DATA MODELER.
Рубрика | Программирование, компьютеры и кибернетика |
Вид | дипломная работа |
Язык | русский |
Дата добавления | 20.03.2017 |
Размер файла | 3,9 M |
Отправить свою хорошую работу в базу знаний просто. Используйте форму, расположенную ниже
Студенты, аспиранты, молодые ученые, использующие базу знаний в своей учебе и работе, будут вам очень благодарны.
Обработка ошибок и сообщения о них. Всегда есть вероятность того, что при обработке запроса пользователячто-то пойдет не так. В таких случаях лучше всего централизованно обработатьвозникшую ошибку и выполнить действия, которые нейтрализуют ее эффект.
В контексте рабочего веб-приложения ошибки могут возникать неожиданно поразным причинам, например из-за сбоев программного обеспечения (сбои операционных систем и СУБД, действия вирусов и т.д.) или сбоев аппаратуры.
Поэтому начнем с создания эффективного механизма обработки ошибок в приложении. Создадим класс ErrorHandler, который и будет обрабатывать ошибки.
Добавим в файл include/config.php (листинг 9) следующие переменные конфигурации.
Листинг 9. Добавленные переменные конфигурации
...
// Эти значения должны быть равны true на этапе разработки
define('IS_WARNING_FATAL', true);
define('DEBUGGING', true);
// Типы ошибок, о которых должны составляться сообщения
define('ERROR_TYPES', E_ALL);
// Настройки отправки сообщений администраторам по электронной почте
define('SEND_ERROR_MAIL', false);
define('ADMIN_ERROR_MAIL', 'goodstore.shop@yandex.ru');
define('SENDMAIL_FROM', 'Errors@example.com');
ini_set('sendmail_from', SENDMAIL_FROM);
// По умолчанию мы не записываем сообщения в журнал
define('LOG_ERRORS', false);
define('LOG_ERRORS_FILE', 'c:\\goodstore\\errors_log.txt'); // Windows
/* Общее сообщение об ошибке, которое должно отображаться вместо
подробной информации (если DEBUGGING равно false) */
define('SITE_GENERIC_ERROR_MESSAGE', '<h1>Godstore Error!</h1>');
?>
В папке goodstore создадим вложенную папку business, в этой папке создадим файл error_handler.php (приложение А) и наберем в нем код класса ErrorHandler, который обрабатывает ошибки.
Внесем изменения в файл index.php, чтобы задействовать только что созданный файл error_handler.php и выбрать метод-обработчик ошибок:
...
require_once BUSINESS_DIR . 'error_handler.php';
// Задаемобработчикошибок
ErrorHandler::SetHandler();
. . .
Чтобы протестировать обработчик ошибок, добавим в файл index.php следующие строчки
// Пытаемся загрузить несуществующий файл
require_once 'inexistent_file.php';
Далее загрузим страничку в браузере (рис. 13)
Рисунок 13 - Сообщение об ошибке с последовательностью вызовов функций
Метод обработки ошибок, Handler(), работает следующим образом:
· Он составит подробное сообщение об ошибке.
· Если он сконфигурирован на это, он отправит сообщение администраторусайта по электронной почте.
· Если он сконфигурирован на это, он запишет сообщение в журнал ошибок.
· Если он сконфигурирован на это, он выведет сообщение об ошибке на странице ответа.
· Серьезные ошибки приведут к прекращению выполнения приложения. Менее серьезные ошибки позволят приложению продолжить выполнение.
2.5 Создание каталога товаров
Одна из самых важных частей любого электронного магазина -- это механизм,позволяющий посетителям просматривать предлагаемые товары. Независимо от того, ищет ли посетитель конкретный товар или просматривает все предлагаемые, нужно сделать этот процесс простым и приятным.Для небольшого электронного магазина достаточно рассортировать предлагаемые товары по категориям.
Создадим в phpMyAdmin новую базу данных goodstore. Теперь добавим в базу данных нового пользователя. Уровень данных в приложении будет работать с базой данных, используя идентификатор этого пользователя. Создадим пользователя с именем goodstoreadmin (и такимже паролем). У этого пользователя будет право полного доступа к базе данных
goodstore, но не к другим базам данных.
Во вкладке SQLвведем следующий SQL-запрос (листинг 10):
Листинг 10. Запрос на создание нового пользователя в базе данных
-- Create goodstoreadmin user
GRANT ALL PRIVILEGES ON `goodstore`.*
TO 'goodstoreadmin'@'localhost' IDENTIFIED
BY 'goodstoreadmin'
WITH GRANT OPTION;
После создания базы данных и нового пользователя, можно создавать таблицы.С помощью phpMyAdmin создадим таблицуdepartment (листинг 11), в ней будут храниться данные об отделах и заполним ее данными (листинг 12):
Листинг 11. Создание таблицы department
-- Создаемтаблицуdepartmen
CREATE TABLE `departmen` (
`departmen_id` INT NOT NULL AUTO_INCREMENT,
`name` VARCHAR(100) NOT NULL,
`description` VARCHAR(1000),
PRIMARY KEY (`departmen_id`)
) ENGINE=MyISAM;
Листинг 12. Заполнение данными таблицы department
-- Заполняемданнымитаблицуdepartment
INSERT INTO `departmen` (`departmen_id`, `name`, `description`) VALUES
(1, 'Одежда',
'Верхняя одежда, блузки, брюки, платья, юбки'),
(2, 'Обувь',
'Зимняя, осенняя, летняя'),
(3, 'Аксессуары', 'Сумки, шарфы, шапки');
Эта таблица предназначена для формирования списка отделов и заполненияшаблона Smarty этим списком.
На практике обычно удобнее взаимодействовать с базой данных с помощью набора хранимых процедур (stored procedures)[1, 3 - 5].
Хранимая процедура -- это просто набор операторов SQL, сохраненный под определенным именем, по которому этот набор можно вызывать. Хранимые процедуры в MySQL, аналогично функциям в PHP, могут принимать аргументы и возвращать значения. Пользоватьсяхранимыми процедурами проще -- достаточно указать имя нужной процедуры изадать значения для ее параметров.
При разработке приложения Goodstore будем обращаться к данным исключительно с помощью хранимых процедур, хранящихся в базе данных goodstore.
Синтаксис для создания хранимых процедур имеет вид
DELIMITER $$
CREATE PROCEDURE <name>(<param1 type>, <param2 type> ... )
BEGIN
<code>
END$$
DELIMITER;
Перваяхранимаяпроцедура, будетназыватьсяcatalog_get_departments_list (листинг 13). Она будет возвращать список ID и названий отделов ивызываться методом из уровня логики приложения Goodstore, которому понадобятся эти данные.
Листинг 13. Хранимаяпроцедура catalog_get_departments_list
-- Созданиехранимойпроцедурыcatalog_get_departments_list
CREATE PROCEDURE catalog_get_departments_list()
BEGIN
SELECT department_id, name FROM department ORDER BY department_id;
END$$
Для отображения списка отделов нам понадобится реализовать на уровне логики приложения два класса
· Класс DatabaseHandler будет хранить общую функциональность, отвечающую за доступ к базе данных. Этот класс мы будем в дальнейшем постоянноиспользовать, обращаясь к базе данных, чтобы избежать ошибок и нестыковок, связанных с реализацией одновременно нескольких механизмов доступа к данным.
· Класс Catalog будет содержать функциональность, специфичную для каталога товаров, например метод GetDepartments(), который будет извлекатьиз базы данных список отделов.
2.5.1 Установка соединения с MySQL
SQL-запросы, необходимо будет как-то передавать MySQLдля выполнения. Прежде чем писать код уровня логики приложения, нужно проанализироватьвозможные варианты реализации этого уровня.
Есть два основных подхода к работе с соединениями.
Первый из них -- это последовательность действий, которую нужно выполнятьпри каждом обращении к базе данных:
1. Открываем соединение с базой данных, когда нужно выполнить запрос к ней.
2. Выполняем запрос SQL (или хранимую процедуру) с помощью открытого соединения и получаем результаты выполнения. На этом этапе также нужно обработать ошибки (если таковые возникли).
3. Закрываем соединение с базой данных сразу же после выполнения запроса.
Недостаток -- накладные расходы на частое открытие и закрытие соединений.
Альтернативный подход, будем использовать в Goodstore:
1. Открываем соединение с базой данных, когда нам впервые требуется обратиться к ней для выполнения запроса.
2. Выполняем все необходимые запросы (или хранимые процедуры) через это соединение, не закрывая его. На этом же этапе осуществляется обработка возникших ошибок.
3. Закрываем соединение с базой данных, когда клиент завершает работу.
При использовании этого подхода все операции с базой данных для выполненияодного клиентского запроса (поступающего, когда пользователь открывает новуювеб-страницу на нашем сайте) осуществляются через одно соединение с базой данных -- мы не открываем и не закрываем соединение для каждой операции. Этотподход также допускает использование постоянных соединений для повышенияэффективности.
Теперь можно поговорить о практической реализации выбранного подхода -- открытии и закрытии соединений и выполнении запросов с помощью PHP PDO[1].
Классы PDO позволяют обращаться к различным источникам данных с помощью одного и того же API (Applications Programming Interface -- интерфейса программирования приложений). Использование PHP PDO -- удобный способ взаимодействия с базами данных, и он заметно упрощает нашу жизнь как программистов.
Функциональность класса PDO позволяет устанавливать соединения с серверами MySQL и выполнять SQL-запросы. За открытие соединения отвечает конструктор класса PDO, который в качестве параметров получает строку соединения ссервером базы данных и (необязательно) аргумент, указывающий, будет ли создаваемое соединение постоянным. В строке соединения содержится вся информация, необходимая для установки соединения с сервером MySQL. Объект PDO создается конструктором следующим образом
$dbh = newPDO('mysql:dbname=' . $db_name . ';host=' . $db_host,
$db_user,
$db_pass,
array(PDO::ATTR_PERSISTENT => $persistent));
Как видно из приведенного фрагмента кода, для установки соединенияконструктору нужно передать пять переменных:
· $db_user с именем пользователя
· $db_pass с паролем
· $db_host с именем хоста сервера MySQL
· $db_name с именем базы данных, к которой вы хотите обращаться
· $persistent (true, если мы хотим создать постоянное соединение, илиfalse -- в противном случае)
Чтобы закрыть соединение с базой данных, нужно присвоить переменной $dbhзначение null.
Приведенный ниже фрагмент кода демонстрирует, как можно создать, открытьи закрыть соединение с базой данных MySQL, а также перехватить любые генерируемые при этом исключения.
try
{
// Открываем соединение
$dbh = newPDO('mysql:dbname=' . $db_name . ';host=' . $db_host,
$db_user, $db_pass);
// Закрываемсоединение
$dbh = null;
}
catch (PDOException $e)
{echo 'Connection failed: ' . $e->getMessage();}
Затем перехватываются и обрабатываются исключения, которые могут генерироваться в коде доступа к данным, и передается информация об ошибках.
Первое, что нужно создать, -- это класс DatabaseHandler, в котором будетсосредоточена функциональность, используемая другими механизмами из уровнялогики приложения. Затем еще один класс уровня логики приложения,Catalog, использующий функциональность класса DatabaseHandler для реализациифункциональности, используемой на уровне представления. В классе Catalog будет содержаться метод GetDepartments() (он будет использоваться для генерации списка отделов), а также GetCategories() и некоторые другие.
Добавим имя пользователя и пароль для доступа к базе данных в конец файлаgoodstore/include/config.php(листинг 14).
Листинг 14. Добавление имя пользователя и пароля
// Параметры соединения с базой данных
define('DB_PERSISTENCY', 'true');
define('DB_SERVER', 'localhost');
define('DB_USERNAME', 'goodstoreadmin');
define('DB_PASSWORD', 'goodstoreadmin');
define('DB_DATABASE', 'goodstore');
define('PDO_DSN', 'mysql:host=' . DB_SERVER . ';dbname=' . DB_DATABASE);
Впапке goodstore/business создадимновыйфайлсименем database_handler.php исоздадимвнемкласс DatabaseHandler. На данный момент в классе будут только конструктор (объявленный как private, что делает невозможным создание экземпляров класса) и статический
метод GetHandler(). Этот метод создает новое соединение с базой данных, сохраняет его в переменную-член класса $m_Handler и возвращает объект класса.
Добавим в класс DatabaseHandler несколько методов(приложение А):
· Close() - вызывается,когда понадобится закрыть соединение с базой данных;
· Execute() - используется для выполнения запросов, не возвращающих данные
· GetAll() - позволяет получить все строки, возвращаемые запросом SELECT
· GetRow() - используется для выполнения запросов SELECT, возвращающиходну строку
· GetOne() - похож на GetRow(), но возвращающий только одно значение из запроса SELEC
В папке business создадим файл catalog.php, в котором создадим класс уровня логики приложения,Catalog, использующий функциональность класса DatabaseHandler для реализациифункциональности, используемой на уровне представления (листинг 15)
Листинг 15. Класс Catalog
<?php
// Класс уровня логики приложения для считывания информации
// о каталоге товаров
class Catalog
{
// Получаемсписокотделов
public static function GetDepartments()
{
// Составляем SQL-запрос
$sql = 'CALL catalog_get_departments_list()';
// Выполняем запрос и получаем результаты
return DatabaseHandler::GetAll($sql);
}
}
?>
Чтобы сделать класс DatabaseHandler доступным приложению, файл database_handler.php нужно включить в index.php. Нужно добавить в файлindex.phpследующие строчки
// Загружаемдескрипторбазыданных
require_once BUSINESS_DIR . 'database_handler.php';
// Закрываем соединение с базой данных
DatabaseHandler::Close();
?>
2.5.2 Отображение списка отделов
Итак, все, что осталось сделать, чтобы список отделов отображался на веб-странице, -- это создать уровень представления.
Функциональность уровня представления можно реализовать в виде отдельного компонентного шаблона -- departments_list. Затем просто включить файл этогошаблона -- departments_list.tpl -- в основной шаблон Smarty (templates/store_front.tpl).
Первым шагом нужно добавить в файл goodstore.css в папке goodstore/stylesстили приведенные ниже (листинг 16). Они описывают вид названий отделов в списке, когда они не выбраны пользователем, когда над ними находится указатель мыши и когда они выбраны.
Листинг 16. Стили CSS
div.yui-bdiv.box {
color: #333333;
border: 1px solid #c6e1ec;
margin-top: 15px;
}
div.yui-b div p.box-title {
background: #0590C7;
border-bottom: 2px solid #c6e1ec;
color: #FFFFFF;
display: block;
font-size: 93%;
font-weight: bold;
margin: 1px;
padding: 2px 10px;
}
a {
color: #0590C7;
}
a:hover { color: #ff0000;
}
a.selected {
font-weight: bold;
}
div.yui-b div ul {
margin: 0;
}
div.yui-b div ul li {
border-bottom: 1px solid #fff;
list-style-type: none;
}
div.yui-b div ul li a {
color: #333333;
display: block;
text-decoration: none;
padding: 3px 10px;
}
div.yui-b div ul li a:hover {
background: #c6e1ec;
color: #333333;
}
Добавимвфайлpresentation/application.phpвконструкторклассаApplicationдвестроки. ЭтистрокиконфигурируютпапкисподключаемымифайламиSmarty.
$this->plugins_dir[0] = SMARTY_DIR . 'plugins';
$this->plugins_dir[1] = PRESENTATION_DIR . 'smarty_plugins';
Теперьсоздадимфайлшаблона Smarty длякомпонентногошаблона departments_list. Он должен находиться в папке presentation/templates и называться departments_list.tpl (приложение А).
Этот файл отвечает за генерацию визуального оформления списка отделов.
Создимвпапке presentation папку smarty_plugins. В ней будут хранитьсяподключаемые файлы Smarty.Внутри папки smarty_pluginsсоздадим файл function.load_presentation_object.php и добавим в него следующий код (листинг 17).
Листинг17. Файлfunction.load_presentation_object.php
<?php
// Подключаемые функции из подключаемых файлов должны
// именоваться smarty_имя_типа
function smarty_function_load_presentation_object($params, $smarty)
{
require_once PRESENTATION_DIR . $params['filename'] . '.php';
$className = str_replace(' ', '',
ucfirst(str_replace('_', ' ',
$params['filename'])));
// Создаемобъектпредставления
$obj = new $className();
if (method_exists($obj, 'init'))
{
$obj->init();
}
// Присваиваемпеременнуюшаблона
$smarty->assign($params['assign'], $obj);
}
?>
Впапке presentationсоздадимфайл departments_list.php (приложениеА). Далее необходимо внести изменение в файл index.php, добавить ссылку на класс Catalog из уровня логики приложения:
// Загружаем уровень логики приложения
require_onceBUSINESS_DIR . 'catalog.php';
Теперь можно проверить работу, загрузим в браузере страницу http://localhost/goodstore/index.php (рис. 14)
Рисунок 14 - Сайт Goodstore с динамически генерируемым списком отделов
В итоге получили аккуратную страницу со списком отделов, сгенерированным с помощью шаблона Smarty. Название каждого отдела представляет собой ссылку на страницу этого отдела.
2.6 Создание модели данных с помощью ALLFUSION ERWIN DATA MODELER
AllFusion ERwin Data Modeler - CASE-средство для проектирования и документирования баз данных, которое позволяет создавать, документировать и сопровождать базы данных, хранилища и витрины данных.
AllFusion ERwin Data Modeler (ERwin) позволяет наглядно отображать сложные структуры данных.
Разработаем модель в ERwin Data Modeler 7. Работа с программой начинается с создания новой модели, для которой нужно указать тип и целевую СУБД.
ERwin позволяет создавать логическую, физическую модели и модель, совмещающую логический и физический уровни.
Логический уровень - это абстрактный взгляд на данные, на нем данные представляются так, как выглядят в реальном мире, и могут называться так, как они называются в реальном мире (например "Постоянный клиент" или "Заказ"). Объекты модели, представляемые на логическом уровне, называются сущностями и атрибутами. Логическая модель данных является универсальной и никак не связана с конкретной реализацией СУБД.
Физический уровень зависит от конкретной СУБД. В физической модели содержится информация о всех объектах БД. Физическая модель зависит от конкретной реализации СУБД. Одной и той же логической модели могут соответствовать несколько разных физических моделей.
Для создания на логическом уровне сущностей и связей между ними предназначена панель Toolbox.
После создания сущности ей нужно задать атрибуты. Для этого нужно дважды щелкнуть по ней или в контекстном меню выбрать пункт Attributes (рис. 15).
Рисунок 15 - Окноатрибутов выбранной сущности
После создания сущностей создаются связи между ними. При создании идентифицирующей связи атрибуты, составляющие первичный ключ сущности-родителя, мигрируют в состав первичного ключа сущности-потомка, при создании неидентифицирующей связи - просто в состав атрибутов сущности-потомка.
Получившаяся логическая схема базы данных для проекта Goodstore (рис. 16):
Рисунок 16 - Созданная схема базы данных
Теоретическое описание отношений между таблицами может быть запутанным и непонятным. Чтобы представить себе этиотношения более ясно, можно воспользоваться графическими диаграммами баз данных.
2.7 Создание и заполнение новых таблиц
Для начала нужно создать три новых таблицы для каталога товаров и заполнить их данными
· category
· product
· product_category
Между этими тремя таблицами будут отношения двух часто встречающихся видов -- “один-ко-многим” (one-to-many) и “многие-ко-многим” (many-to-many).
Один-ко-многим - одна запись из какой-то таблицы соответствует нескольким записям из другой таблицы (но не наоборот).
Многие-ко-многим - записи в каждой из таблиц могут соответствовать нескольким записям из другой таблицы.
Хотя отношение “многие-ко-многим” часто встречается в базах данных, егонельзя физически реализовать с помощью только двух таблиц. Поэтому в большинстве РСУБД (включая MySQL) для реализации такого отношения используется дополнительная таблица, которая называется таблицей соединения (junction table)или связующей таблицей (linking table). Она позволяет представить отношение“многие-ко-многим” как два отношения “один-ко-многим”. Например, она позволитсвязать каждый товар с произвольным количеством категорий, а каждую категорию -- с произвольным количеством товаров.
Имя для таблицы соединений можно выбирать произвольно, однако обычно егообразуют, просто соединяя имена двух соединяемых таблиц -- product_category.
С помощью SQL-запросов создадим таблицы product (приложение Б), category (приложение Б) и product_category (приложение Б). Далее их нужно заполнить данными, воспользуемся интерфейсом phpMyAdmin (рис. 17).
Рисунок 17 - Заполненная таблица product
Для реализации отношений “многие-ко-многим” используется вспомогательная таблица, которая называется таблицей соединений. В данном случае она называется product_category. В ней содержатся пары значенийproduct_id и category_id, связывающие определенные товары и категории.
Создание хранимых процедур
Теперь можно приступить к созданию хранимых процедур (приложение Б), образующих уровень данных нашего приложения. Сначала создадим хранимые процедуры, извлекающие информацию об отделах и категориях.Затем мы перейдем к хранимым процедурам, работающим с товарами. Непосредственно запрашивают данные о товарах только четыре процедуры, но мы создадим еще три для реализации постраничного отображения списков товаров:
· catalog_count_products_in_category
· catalog_get_products_in_category
· catalog_count_products_on_department
· catalog_get_products_on_department
· catalog_count_products_on_catalog
· catalog_get_products_on_catalog
· catalog_get_product_details
· catalog_get_product_locations
Имя каждой процедуры кратко описывает ее назначение. Это упростит дальнейшуюотладку.Создадим эти процедуры с помощью вкладки SQL в phpMyAdmin,задавая в качестве разделителя символы $$.
Добавим на уровень логики приложения несколько методов,предназначенных для вызова только что созданных нами хранимых процедур в класс Catalog (расположенным в файлеbusiness/catalog.php) (приложение А)
· GetDepartmentDetails()
· GetCategoriesInDepartment()
· GetCategoryDetails()
· HowManyPages()
· GetProductsInCategory()
· GetProductsOnDepartment()
· GetProductsOnCatalog()
· GetProductDetails()
· GetProductLocations()
Преждечемнаписатьметодыуровнялогикиприложения, нужнообновитьсодержимоефайла include/config.php, добавиввнегоконстанты SHORT_PRODUCT_DESCRIPTION_LENGTH и PRODUCTS_PER_PAGE.
// Задаем параметры, используемые при генерации списков товаров
define('SHORT_PRODUCT_DESCRIPTION_LENGTH', 150);
define('PRODUCTS_PER_PAGE', 4);
…
Кроме того, нужно внести изменения в файл index.php.
<?php
// Активизируемсеанс
session_start()
…
Константа SHORT_PRODUCT_DESCRIPTION_LENGTH указывает, сколько символовиз описания товара можно отображать в списке товаров.Константа PRODUCTS_PER_PAGE задает максимальное количество товаров, которое можно отображать на одной странице списка.
2.8 Отображение информации об отделе и категориях
Добавим в файл стилей goodstore.css из папки styles два следующих стиля. Они понадобятся для отображения названия отдела и его описания.
.title {
border-left: 15px solid #0590C7;
padding-left: 10px;
}
.description {
font-style: italic;
}
Создадим файл шаблона с именем blank.tpl в папке presentation/templates и поместите в этот файл строку
{* Smarty blank page *}
Добавим файл шаблона с именем department.tpl (листинг 18) в папку presentation/templates и поместим в него следующий код
Листинг 18. Файл шаблона
{* department.tpl *}
{load_presentation_objectfilename="department" assign="obj"}
<h1 class="title">{$obj->mName}</h1>
<p class="description">{$obj->mDescription}</p>
Placelistofproductshere
Два элемента объекта представления, $obj->mName и $obj->mDescription,содержат название и описание выбранного отдела.
Создадим объект представления Department в файле department.php (приложение).
Теперь необходимомодифицировать файлы presentation/templates/store_front.tpl (приложение А) и presentation/store_front.php (приложение А), добавив в них несколько строчек программы, чтобы только что созданныйкомпонентный шаблон загружался, когда в строке запроса присутствует параметр DepatmentId.
Загрузим страницу в браузере, для проверки работы программы (рис. 18).
Произведем аналогичные действия для отображения информации о категории: создадим файлы categories_list.tpl (приложение А) и categories_list.php (приложение А), модифицируем файл store_front.tpl, добавив необходимые строчки.
Рисунок 18 - Информация о выбранном отделе
Загрузим страничку в браузере, должны отобразиться категории и информация о них (рис. 19).
Рисунок 19 - Информация о выбранной категории
Когда посетитель выбирает отдел из списка, отображается список категорийэтого отдела. Чтобы список категорий мог отображаться, созданный шаблонSmarty categories_list содержит раздел, перебирающий элементы списка категорий. В этом разделе содержатся ссылки наindex.php, но они будут создавать запросы с параметром CategoryId, сообщая, накакой категории щелкнул посетитель.
2.9 Отображение списка товаров и содержимого главной страницы
Для того, что бы на сайте интернет-магазина отображались товары, понадобятся фото этих товаров. Для этого в папке goodstoreсоздадим папку product_images и поместим в нее все необходимые изображения, а так же в базе данных в таблице productукажем названия этих изображений.
Добавим в файл goodstore.css, находящийся в папке styles, следующие стили (листинг 19).
Листинг 19. Стили CSSдля отображения списка товаров
.product-list tbody tr td {
border: none;
padding: 0;
width: 50%;
}
.product-list tbody tr td p img {
border: 2px solid #c6e1ec;
float: right;
margin: 0 10px;
vertical-align: top;
}
.product-title {
border-left: 10px solid #0590C7;
padding-left: 5px;
}
.section {
display: block;
}
.price {
font-weight: bold;
}
.old-price { color: #ff0000;
font-weight: normal;
text-decoration: line-through;
}
Впапке presentation/templates создадимновыйфайлдизайн-шаблона Smarty сименем products_list.tpl (приложениеА). Для шаблона products_list.tpl создадим объект представления, файл с именем products_list.php (приложение А).
Создадимфайлpresentation/link.php (приложение А)идобавьтевнего класс Linkи методToCategory() (листинг 20)
Листинг 20. Метод ToCategory()
public static function ToCategory($departmentId, $categoryId)
{
$link = 'index.php?DepartmentId=' . $departmentId .
'&CategoryId=' . $categoryId;
return self::Build($link);self::Build($link);
}
Вставимвкласс Link новыеметоды ToDepartment(), ToProduct(), добавимпараметр $Page икодподдержкистраницвметоды ToDepartment() и ToCategory().
Загрузим страницу в браузере и выберем одну из категорий (рис. 20).
Рисунок 20 - Отображение списка товаров
Кроме общей информации о веб-сайте, можно отображать на главной странице информацию о некоторых рекламируемых товарах. Попробуем реализовать это.
Для начала создадим файл дизайн-шаблона Smarty. Этофайлсименем first_page_contents.tpl впапке presentation/templates. Поместимвнегоследующийкод (листинг 21).
Листинг 21. Файл дизайн-шаблона для главной страницы
{* first_page_contents.tpl *}
<p class="description">
Добро пожаловать на сайт магазина женской одежды GoodStore!
<pclass="description">
По всем интересующим Вас вопросам, а так же вопросам
доставки и оплаты обращаться по электронному адресу администратора:
goodstore.shop@yandex.ru или по телефону 8-938-444-68-12
</p>
</p>
<p class="description">
Мы надеемся, вам понравится
наш ассортимент товаров!
Сейчас действуют скидки на зимние коллекции.
</p>
{include file="products_list.tpl"}
Внесемизменениявфайлыstore_front.tpl, products_list.phpиlink.php. Далееоткроемпроектвбраузере (рис. 21).
Рисунок 21 - Главная страница с рекламируемыми товарами
Собственно список товаров по-прежнему отображается с помощью компонентного шаблона products_list. Но теперь он загружается не из файла department.tpl, а из нового файла шаблона -- first_page_contents.tpl.
Атрибуты товаров
Для реализации атрибутов товаров (цвет, размер), создадим три таблицы (attribute, attribute_value и product_attribute) и хранимую процедуруcatalog_get_product_attributes. В таблице attribute будут храниться названия атрибутов.Таблица attribute_value хранит возможные значения атрибутов для каждойгруппы атрибутов. Между таблицами attribute и attribute_value установлено отношение “один-ко-многим”.Таблица product_attribute обеспечивает выполнение отношения “многие-ко-многим” между таблицами product и attribute_value.
Код уровня логики приложения, отвечающий за поддержку атрибутов товаров,весьма компактен -- нам всего лишь нужно вызвать хранимую процедуру catalog_get_product_attributes. Модифицируем для этого класс Catalog в файле business/catalog.php.
Реализация поддержки атрибутов на уровне представления потребует созданияновых элементов управления, которые позволят посетителям выбирать значенияэтих атрибутов.
Добавимнеобходимыйкодвфайлpresentation\templates\products_list.tpl (приложение А). Далее добавим две строчки в файл presentation/products_list.php (приложение А)
$this->mProducts[$i]['attributes'] =
Catalog::GetProductAttributes($this->mProducts[$i]['product_id']);
Модифицируемфайлpresentation/templates/product.tpl (приложение А), добавленный код генерирует списокзначений атрибутов для страницы со сведениями о товаре.
Добавим следующие строчки в метод init() класса Product в файле presentation/product.php (приложение А)
$this->mProduct['attributes'] =
Catalog::GetProductAttributes($this->mProduct['product_id']);
Добавим в файл styles/goodstore.css следующий стиль:
.attributes {
clear: both;
display: block;
padding-top: 5px;
}
Откроем в браузере страницу http://localhost/goodstore/ и посмотрим,как выглядят атрибуты товаров на страницах сайта (рис. 22).
Рисунок 22 - Страница товаров с атрибутами
Теперь каталог позволит посетителямвыбрать размер и цвет товара. Поскольку данные об атрибутах хранятся в базе данных, мы можем добавлять собственные атрибуты изначения для них.
2.10 Интеграция корзины и прием платежей
Чтобы принимать платежи, нужно добавить на сайт два важных элемента: кнопки “Добавить в корзину” для добавления товара в корзину (по одной для каждого товара) и кнопку “Показать корзину” для просмотра корзины (по одной на страницу). PayPal позволяет
легко реализовать оба данных элемента.
В файл config.php из папки includeдобавим следующие объявления констант (листинг 22).
Листинг 22. Объявления констант для PayPal
// КонфигурацияPayPal
define('PAYPAL_URL', 'https://www.paypal.com/cgi-bin/webscr');
define('PAYPAL_EMAIL', 'goodstore.shop@yandex.ru');
define('PAYPAL_CURRENCY_CODE', 'USD');
define('PAYPAL_RETURN_URL', 'http://localhost/goodstore');
define('PAYPAL_CANCEL_RETURN_URL', 'http://localhost/goodstore');
Добавим в файл products_list.php (приложение А) следующие строчки
// Генерируемссылку Add to Cart
$this->mProducts[$i]['link_to_add_product'] =
Link::ToAddProduct($this->mProducts[$i]['product_id']);
Изменим файл products_list.tpl (приложение А), добавив в него необходимый код. В файле presentation/link.php (приложение А) модифицируем начало метода CheckRequest().
Добавим в файлы product.php , product.tpl и store_front.tpl необходимый код. В класс StoreFront в файле presentation/store_front.phpдобавимкод, создающий ссылки на PayPal, ссылки для возврата в магазин и правильной работы корзины и платежей.
В файл styles/goodstore.css следующие стили:
div.yui-b div form.add-product-form
{
margin: 0;
padding: 0;
}
.add-product-form p
{
margin: 0;
padding: 0 0 10px 0;
}
.view-cart
{
padding: 10px;
text-align: center; }
Рисунок 23 - Страница Goodstore с кнопками Добавить в корзину и Показать корзину
ЗагрузимсайтGoodstoreи посмотрим результат. На рис.23 изображен сайт с добавленными кнопками: Добавить в корзину и Показать корзину. На рис.24 изображена корзина покупателя с добавленным товаром.
Рисунок 24 - Корзина покупателя с добавленным товаром
После щелчка на кнопке “Добавить в корзину” веб-браузер пользователя получит перенаправление с кодом HTTP 302 на ссылку “Добавить в корзину”в PayPal. Эта ссылка будет вести на страницу корзины покупателя.
2.11 Администрирование каталога
У реального сайта должны быть механизмы добавления в базу данных новых товаров и редактирования данных об уже существующих товарах. Поэтому необходимо создать интерфейс администратора. Хотя посетители сайта никогда его не увидят, он необходим для успешной работы веб-сайта.
2.11.1 Отделы и категории
Чтобы предотвратить несанкционированный доступ к интерфейсу администратора, начнем с создания формы для ввода идентификатора пользователя и пароля и разрешим доступ к интерфейсу администратора только пользователям с заданными идентификаторами и паролями.
Далее нужно будет создать административную часть сайта (часто ее называют панелью управления (control panel)). Главная страница этой части будет содержаться в файле admin.php (приложение А), с которым будет связан шаблон (store_admin.php (приложение А)).Кроме того, понадобятся шаблон главного меню (admin_menu.tpl (приложение А)), используемогодля навигации в административной части, шаблон, отвечающий за аутентификацию (admin_login (приложение А)), и два компонентных шаблона для администрирования каталога (admin_departments.tpl (приложение А)иadmin_categories.tpl (приложение А)).
Добавимвфайлыfirst_page_contents.tpl (приложение А) иfirst_page_contents.php (приложение А) код, который необходим для добавления на главную страницу ссылки, ведущей на страницу администрирования (рис. 25).
Рисунок 25 - Страница входа на административную часть сайта
Для реализации администрирования отделов на уровне логики представления создадим файлы admin_departments.tpl (приложение А) и admin_departments.php (приложение А),модифицируем файлы link.php иstore_admin.php, чтобы обеспечить загрузку только что созданного компонентного
шаблона admin_departments.
Добавьте код в класс Catalogвфайлеbusiness/catalog.php.
С помощью phpMyAdmin создадим четыре хранимые процедуры:
· catalog_get_departments()
· catalog_add_department()
· catalog_update_department()
· catalog_delete_department()
Работа страницы администрирования отделов представлена на рис. 26.
Рисунок 26 - Страница администрирования отделов
Администрирование категорий основано на тех же концепциях и механизмах, что и администрирование отделов. Создадим файл шаблона admin_categories.tpl (приложение А) затем файл admin_categories.php (приложение А), изменим файл link.php и добавим в конец класса Link следующий метод (листинг 23).
Листинг 23. Метод ToDepartmentCategoriesAdmin()
// Создает ссылку на страницу администрирования категорий
public static function ToDepartmentCategoriesAdmin($departmentId)
{
$link = 'Page=Categories&DepartmentId=' . $departmentId;
return self::ToAdmin($link);
}
Откроемфайл business/catalog.php идобавимвкласс Catalog новыеметоды. Модифицируем метод init() класса StoreAdmin в файле presentation/store_admin.php длязагрузкиновогокомпонентногошаблона. А также создадим необходимые хранимые процедуры. Результат представлен на рис.27.
Рисунок 27 - Страница администрирования категорий
Код, добавленный в приложение, образует сразу несколько компонентных шаблонов и поддерживающие их работу методы и хранимые процедуры.
2.11.2 Товары и атрибуты
Теперь на сайте есть возможность редактировать информацию об отделах и категориях. Далее разработаем механизмы для выполнения таких же операций с товарами и атрибутами.
Создадим страницу управления атрибутами товаров. Она будет доступна по ссылке PRODUCT ATTRIBUTES ADMIN в менюадминистрирования.
Начнем с создания компонентного шаблона admin_attributes, состоящий из файлов admin_attributes.tpl (приложение А) и admin_attributes.php (приложение А). Этот шаблон реализует страницу редактирования названий атрибутов (рис. 28).Создадим компонентный шаблон admin_attribute_values, состоящий из файлов admin_attribute_values.tpl (приложение А)иadmin_attribute_values.php (приложение А). Этотшаблонреализуетстраницу редактирования значений атрибутов (рис. 29).
Добавили ссылки на новые элементы в шаблон admin_menu (содержащий ссылки на все административные страницы сайта) и поместим в класс Link новые методы для генерации ссылок.
Написали код уровня логики приложения и хранимые процедуры для базы данных, обеспечивающие добавление, удаление и редактирование атрибутов и их значений.
Перейдем к администрированию товаров. Для начала создадим базовую функциональность администрирования товаров в шаблоне Smarty admin_products (этотшаблон состоит из файлов admin_products.tpl (приложение А) и admin_products.php (приложение А)). Создадим ссылку на новую страницу из шаблона store_admin. Реализуем работающие с товарами служебные методы уровня логики приложения и хранимые процедуры в базе данных.
Рисунок 28 - Страница редактирования названий атрибутов
Рисунок 29 - Страница редактирования значений атрибутов
Загрузим раздел администрирования в браузере и щелкнем на кнопке “Редактировать продукт” (рис. 30).
Рисунок 30 - Редактирование товаров
Теперь можно перейти к администрированию описаний товаров. Создадимфайлadmin_product_details.tpl (приложение А), добавим в файлbusiness/catalog.phpэлемент $mProductDisplayOptions (листинг 24) в класс Catalog
Листинг 24. Элемент $mProductDisplayOptions
// Определяетместаотображениятовара
public static $mProductDisplayOptions = array ('Default',//0
'On Catalog', // 1
'On Department', // 2
'On Both'); // 3
Создадимвпапке presentation файл admin_product_details.php (приложениеА), вфайлеlink.php добавимвконецкласса Link следующийметод (листинг 25).
Листинг 25. Метод ToProductAdmin()
// Создает ссылку на страницу администрирования информации о товарах
public static function ToProductAdmin($departmentId, $categoryId,
$productId)
{
$link = 'Page=ProductDetails&DepartmentId=' . $departmentId .
'&CategoryId=' . $categoryId . '&ProductId=' . $productId;
return self::ToAdmin($link);
}
Модифицируемметодinit() классаStoreAdminвфайлеstore_admin.phpдлязагрузкишаблона admin_product_details , добавивследующиестрочки:elseif ($admin_page == 'ProductDetails')
$this->mContentsCell = 'admin_product_details.tpl';
На уровне логики приложения добавим в класс Catalog в файле business/catalog.php следующие методы:
· UpdateProduct -- для обновления сведений о товаре
· DeleteProduct -- для полного удаления товара из каталога
· RemoveProductFromCategory -- для удаления товара из категории
· GetCategories -- для получения полного списка категорий из каталога
· GetProductInfo -- для получения сведений о товаре
· GetCategoriesForProduct -- для получения списка категорий, к которым относится заданный товар
· SetProductDisplayOption -- для задания режима отображения товара
· AssignProductToCategory -- для зачисления товара в категорию
· MoveProductToCategory -- для перемещения товара в другую категорию
· GetAttributesNotAssignedToProduct -- для получения из таблицы attribute_values всех значений атрибутов, не назначенных ни одному товару
· AssignAttributeValueToProduct -- для присвоения значения атрибута товару
· RemoveProductAttributeValue -- для удаления связи между товаром и значением атрибута из таблицы product_attribute
· SetImage1 -- для изменения имени файла с изображением для заданного товара
· SetThumbnail -- для изменения имени файла с уменьшенным изображением
На уровне данныхнужно создать хранимые процедуры, используемые толькочто созданными методами уровня логики приложения (приложение Б).
· catalog_update_product()
· catalog_delete_product()
· catalog_remove_product_from_category()
· catalog_get_categories()
· catalog_get_product_info()
· catalog_get_categories_for_product()
· catalog_set_product_display_option()
· catalog_assign_product_to_category()
· catalog_move_product_to_category()
· catalog_get_attributes_not_assigned_to_product()
· catalog_assign_attribute_value_to_product()
· catalog_remove_product_attribute_value()
· catalog_set_image()
· catalog_set_thumbnail()
Теперь можно загрузить страницу администрирования товаров в браузере и перейти к редактированию описания товара (рис. 31).
Рисунок 31 - Редактирование описания товара
Теперь администратор сайта сможет изменять изображения товаров, редактировать их описания, задавать цены, удалять товары из отдельных категорий или из каталога в целом и управлять атрибутами товаров.
На данный момент сайт снабжен всеми необходимыми инструментами администрирования каталога.
В результате проделанной работы во второй главе, можно сделать выводы о том, что был разработан сайт интернет-магазина с использованием технологий описанных в первой главе, создана база данных, добавлен полностью работающий каталог товаров, атрибуты, корзина и прием платежей, а так же страница администрирования.
Заключение
В ходе выполнения работы была достигнута основная цель - разработан интернет-магазин.
Были изучены основные принципы и инструменты построения интернет-магазина:
· в качестве web-серверабыл выбран сервер XAMPP, так как в его состав входят необходимые инструменты для разработки интернет-магазина, установка XAMPPбыстрая и не сложная, удобный интерфейс и надежная работа;
· для создания базы данных, хранящей необходимую информацию для функционирования интернет-магазина, была выбрана СУБД MySQL. MySQL отличатся хорошей скоростью работы, надежностью, гибкостью и при этом распространяется совершенно бесплатно;
· в качестве языка программирования веб-приложений, был выбран PHP, предоставляющий возможность создания веб-страниц, управляемых базами данных, и поддерживающий СУБД MySQL.
Поставленные задачи выполнены в полной мере, проведен анализ и выбраны интернет-технологии для разработки интернет-магазина, разработан сайт интернет-магазина, управляемого базой данных.
Разработанный интернет-магазин был протестирован локально. Полученные результаты соответствовали ожидаемым. Были сделаны проверки возможных ошибок, недочетов - система функционирует надежно, без сбоев.
В процессе работы над проектом были получены практические навыки в исследовании предметной области, описания проектного решения, построения моделей.
Список использованных источников
1. Дари К., Баланеску Э. PHP и MySQL: создание интернет-магазина: Пер. с англ.-- М.: Издательский дом“Вильямс”, 2011. -- 640с.
2. Савельева Н.В. Язык программирования РНР. -- М.: Интернет Университет Информационных Технологий, 2015. -- 211с.
3. Веллинг Л., Томсон Л. MySQL. Учебное пособие: Пер. с англ. -- М.: Издательский дом“Вильямс”, 2015. -- 304с.
4. Гольцман В. MySQL 5.0. Библиотека программиста. -- Санкт-Петербург, 2010. -- 253с.
5. Фиайли К.SQL: Пер. с англ. -- М.: ДМК Пресс, 2003. - 456 с.
6. Комолова Н., ЯковлеваЕ. HTML: Самоучитель. 2-е изд. -- СПб.: Питер, 2011. -- 288 с.
7. Полонская Е. Язык HTML. Самоучитель. : -- М.: Издательский дом “Вильямс”, 2003.-- 320с.
8. Сидерхолм Д. CSS3 для веб-дизайнеров. -- Манн, Иванов и Фербер, 2012. -- 125с.
9. Иванов И. SEO: Поисковая Оптимизация от А до Я. -- Самоиздательство, 2012. -- 587с.
Приложение А
Листинги файлов программ
Файл store_front.tpl
{* smarty *}
{config_load file="site.conf"}
{load_presentation_object filename="store_front" assign="obj"}
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html>
<head>
<title>{#site_title#}</title>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
<link type="text/css" rel="stylesheet"
href="{$obj->mSiteUrl}styles/goodstore.css" />
</head>
<body>
<div id="doc" class="yui-t2">
<div id="bd">
<div id="yui-main">
<div class="yui-b">
<div id="header" class="yui-g">
<a href="{$obj->mSiteUrl}">
<img src="{$obj->mSiteUrl}images/logo.tif" alt="goodstore logo" />
</a>
</div>
<div id="contents" class="yui-g">
{include file=$obj->mContentsCell}
</div>
</div>
</div>
<div class="yui-b">
{include file="departments_list.tpl"}
{include file=$obj->mCategoriesCell}
<div class="view-cart">
<form target="_self" method="post"
action="{$smarty.const.PAYPAL_URL}">
<input type="hidden" name="cmd" value="_cart" />
<input type="hidden" name="business"
value="{$smarty.const.PAYPAL_EMAIL}" />
<input type="hidden" name="display" value="1" />
<input type="hidden" name="shopping_url"
value="{$obj->mPayPalContinueShoppingLink}" />
<input type="hidden" name="return"
value="{$smarty.const.PAYPAL_RETURN_URL}" />
<input type="hidden" name="cancel_return"
value="{$smarty.const.PAYPAL_CANCEL_RETURN_URL}" />
<input type="submit" name="view_cart" value="Показатькорзину" />
</form>
</div>
</div>
</div>
</div>
</body>
</html>
Файлgoodstore.css
@import "reset-min.css";
@import "base-min.css";
@import "fonts-min.css";
@import "grids-min.css";
body {
font-size: 85%;
font-family: "century gothic";}
.yui-t2, #bd, #yui-main {
z-index: -5;}
.yui-b, .yui-g {
z-index: auto;}
#header {
margin-top: 15px;
text-align: right;}
.error_box {
background-color: #ffffcc;
border: 1px solid #dc143c;
color: #DC143C;
margin: 0 auto;
overflow: auto;
padding: 5px;
position: relative;
text-align: left;
width: 90%;
z-index: 5;}
div.yui-b div.box {
color: #333333;
border: 1px solid #c6e1ec;
margin-top: 15px;
}
div.yui-b div p.box-title {
background: #0590C7;
border-bottom: 2px solid #c6e1ec;
color: #FFFFFF;
display: block;
font-size: 93%;
font-weight: bold;
margin: 1px;
padding: 2px 10px;}
a {
color: #0590C7;
}
a:hover {
color: #ff0000;
}
a.selected {
font-weight: bold;
}
div.yui-b div ul {
margin: 0;
}
div.yui-b div ul li {
border-bottom: 1px solid #fff;
list-style-type: none;
}
div.yui-b div ul li a {
color: #333333;
display: block;
text-decoration: none;
padding: 3px 10px;
}
div.yui-b div ul li a:hover {
background: #c6e1ec;
color: #333333;
}
.title {
border-left: 15px solid #0590C7;
padding-left: 10px;
}
.description {
font-style: century gothic;
}
.product-list tbody tr td {
border: none;
padding: 0;
width: 50%;
}
.product-list tbody tr td p img {
border: 2px solid #c6e1ec;
float: right;
margin: 0 10px;
vertical-align: top;
}
.product-title {
border-left: 10px solid #0590C7;
padding-left: 5px;
}
.section {
display: block;
}
.price {
font-weight: bold;
}
.old-price {
color: #ff0000;
font-weight: normal;
text-decoration: line-through;
}
.product-image {
border: 2px solid #c6e1ec;
}
ol {
margin: 0px;
padding: 0px 0px 0px 5px;
}
ol li {
color: #0590C7;
list-style-type: none;
margin: 0px;
padding: 5px 0px;
}
.attributes {
clear: both;
display: block;
padding-top: 5px;
}
div.yui-b div form {
padding: 5px 10px;
}
input, select, textarea {
font-family: "century gothic";
font-size: 85%;
}
div.yui-b div form.add-product-form
{
margin: 0;
padding: 0;
}
.add-product-form p
{
margin: 0;
padding: 0 0 10px 0;
}
.view-cart
{
padding: 10px;
text-align: center;
}
.login {
color: #333333;
display: block;
border: 1px solid #c6e1ec;
margin: 50px auto;
width: 325px;
}
.login form p {
padding: 0 10px;
}
label {
display: block;
}
.error {
color: #ff0000;
font-size: 85%;
font-family: "century gothic";
}
.login-title {
background: #0590c7;
border-bottom: 2px solid #c6e1ec;
color: #ffffff;
display: block;
font-size: 93%;
font-family: "century gothic";
margin: 1px;
padding: 2px 10px;
}
.no-items-found {
color: #ff0000;
}
table.tss-table {
width: 100%;
}
table.tss-table th {
background: #0590c7;;
border: none;
border-bottom: 3px solid #c6e1ec;
color: #ffffff;
text-align: left;
}
table.tss-table td {
border: none;
border-bottom: 1px solid #0590c7;
}
.words {
color: #ff0000;
}.borderless-table {
width: 100%;
}
.borderless-table td {
border: none;
padding-left: 0;
}
.bold-text {
font-size: 93%;
font-weight: century gothic;}
Файлconfig.php
<?php
// вSITE_ROOTсодержитсяполныйпутькпапкеgoodstore
define('SITE_ROOT', dirname(dirname(__FILE__)));
// Папки приложения
define('PRESENTATION_DIR', SITE_ROOT . '/presentation/');
define('BUSINESS_DIR', SITE_ROOT . '/business/');
// Настройки, необходимые для конфигурирования Smarty
define('SMARTY_DIR', SITE_ROOT . '/libs/smarty/');
define('TEMPLATE_DIR', PRESENTATION_DIR . 'templates');
define('COMPILE_DIR', PRESENTATION_DIR . 'templates_c');
define('CONFIG_DIR', SITE_ROOT . '/include/configs');
// Эти значения должны быть равны true на этапе разработки
define('IS_WARNING_FATAL', true);
define('DEBUGGING', true);
// Типы ошибок, о которых должны составляться сообщения
define('ERROR_TYPES', E_ALL);
// Настройки отправки сообщений администраторам по электронной почте
define('SEND_ERROR_MAIL', false);
define('ADMIN_ERROR_MAIL', 'goodstore.shop@yandex.ru ');
define('SENDMAIL_FROM', 'Errors@example.com');
ini_set('sendmail_from', SENDMAIL_FROM);
// По умолчанию мы не записываем сообщения в журнал
define('LOG_ERRORS', false);
define('LOG_ERRORS_FILE', 'c:\\xampp\\htdocs\\goodstore\\errors_log.txt'); // Windows
// define('LOG_ERRORS_FILE', '/home/username/goodstore/errors.log'); // Linux
// Параметры соединения с базой данных
define('DB_PERSISTENCY', 'true');
define('DB_SERVER', 'localhost');
define('DB_USERNAME', 'goodstoreadmin');
define('DB_PASSWORD', 'goodstoreadmin');
define('DB_DATABASE', 'goodstore');
define('PDO_DSN', 'mysql:host=' . DB_SERVER . ';dbname=' . DB_DATABASE);
/* Общее сообщение об ошибке, которое должно отображаться вместо
подробной информации (если DEBUGGING равно false) */
define('SITE_GENERIC_ERROR_MESSAGE', '<h1>Good Store Error!</h1>');
// Порт HTTP-сервера (можно пропустить, если используется порт 80)
define('HTTP_SERVER_PORT', '80');
/* Имя виртуальной директории, в которой располагается сайт, например:
'/goodstore/' если сайт работает из папки
http://www.example.com/goodstore/
'/' если сайт работает из папки http://www.example.com/ */
define('VIRTUAL_LOCATION', '/goodstore/');
// Задаем параметры, используемые при генерации списков товаров
define('SHORT_PRODUCT_DESCRIPTION_LENGTH', 150);
define('PRODUCTS_PER_PAGE', 4);
// Конфигурация PayPal
define('PAYPAL_URL', 'https://www.paypal.com/cgi-bin/webscr');
define('PAYPAL_EMAIL', 'goodstore.shop@yandex.ru');
define('PAYPAL_CURRENCY_CODE', 'USD');
define('PAYPAL_RETURN_URL', 'http://localhost/goodstore');
define('PAYPAL_CANCEL_RETURN_URL', 'http://localhost/goodstore');
// Если эта константа не установлена в no, доступ к
// страницам администрирования
//возможен только с помощью SSL
define('USE_SSL', 'yes');
// Идентификатор и пароль администратора
define('ADMIN_USERNAME', 'goodstore');
define('ADMIN_PASSWORD', 'goodstore');
?>
Файл application.php
<?php
// Ссылканабиблиотеку Smarty
require_once SMARTY_DIR . 'Smarty.class.php';
/* Класс, расширяющий Smarty, используется для обработки и
отображенияфайлов Smarty */
class Application extends Smarty
{
// Конструкторкласса
public function __construct()
{
// Вызовконструктора Smarty
parent::Smarty();
// Меняемпапкишаблоновпоумолчанию
$this->template_dir = TEMPLATE_DIR;
$this->compile_dir = COMPILE_DIR;
$this->config_dir = CONFIG_DIR;
$this->plugins_dir[0] = SMARTY_DIR . 'plugins';
$this->plugins_dir[1] = PRESENTATION_DIR . 'smarty_plugins';
}
}
?>
Файл index.php
<?php
// Активизируем сеанс
//session_start()
// Подключаем служебные файлы
require_once 'include/config.php';
require_once BUSINESS_DIR . 'error_handler.php';
//Задаем обработчик ошибок
ErrorHandler::SetHandler();
// Загружаем шаблон страницы приложения
require_once PRESENTATION_DIR . 'application.php';
require_once PRESENTATION_DIR . 'link.php';
//Загружаем дескриптор базы данных
require_once BUSINESS_DIR . 'database_handler.php';
Подобные документы
CRM-системы: разновидности, проблемы реализации, их преимущества и недостатки. Критические характеристики CRM-систем для работы через Интернет (WEB-CRM). Разработка содержания и структуры WEB-сайта интренет-магазина "Vinil", создание схемы и базы данных.
курсовая работа [2,6 M], добавлен 19.05.2013Разработка интернет-магазина для реального заказчика. Проведение анализа и выбор интернет-технологий для разработки интернет-магазина. Проектирование предметной области. Разработка динамических web-страниц интернет-магазина, управляемых базой данных.
дипломная работа [1,7 M], добавлен 08.06.2013Изучение возможностей AllFusion ERwin Data Modeler и проектирование реляционной базы данных (БД) "Санатория" на основе методологии IDEF1x. Определение предметной области, основных сущностей базы, их первичных ключей и атрибутов и связи между ними.
лабораторная работа [197,5 K], добавлен 10.11.2009Понятие интернет-магазина, его виды и особенности организации. Создание графического контента для наполнения сайта-каталога, его логической и физической структуры. Понятие, объекты и происхождение авторского права, его регистрация и средства защиты.
дипломная работа [2,2 M], добавлен 22.08.2015Разработка интернет-магазина мужской и женской одежды и аксессуаров. Требования к техническим характеристикам сайта (трафик, надежность, безопасность). Выбор методов сопровождения интернет-магазина. Подключение интернет-магазина к платежным системам.
отчет по практике [2,9 M], добавлен 01.05.2015Применение серверной платформы Denwer и с CMS Opencart при создании сайта интернет-магазина электроники. Установка и настройка Denwer и Opencart. Русификация сайта на Opencart, создание системы отображения цен в рублях. Разработка функционала сайта.
практическая работа [985,3 K], добавлен 04.08.2015Теоретические и практические основы Web-программирования. Проблемы и перспективы Интернет-магазинов. Типы данных, используемые в PHP. Работа с базой данных. Особенности встраивания РНР кода. Схема работы Интернет-магазина. Язык Web-программирования РНР.
курсовая работа [3,8 M], добавлен 27.12.2012Создание базы данных для автоматизации электронного магазина по продаже шин в терминале ER моделирования. Построение логической и концептуальной модели базы данных. Её реализация в интерактивной среде Интернет. Расчет экономической эффективности магазина.
курсовая работа [4,5 M], добавлен 10.10.2012Анализ сравнения интернет-магазина и электронного магазина. Проектирование структуры web-сайта. Обработка заказа. Основное понятие языка php. Средства безопасности системного уровня приложения. Разработка структуры базы данных и структуры web-сайта.
курсовая работа [1,4 M], добавлен 31.03.2014Разработка и написание программного обеспечения для интернет-магазина по продаже свежих овощей в режиме "online". Функциональные требования, схема данных. Главная страница сайта, корзина, регистрация пользователя. Описание классов и файлов программы.
курсовая работа [1,2 M], добавлен 18.04.2013