Разработка интернет-магазина одежды

Разработка сайта интернет-магазина, управляемого базой данных. Установка 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

Работы в архивах красиво оформлены согласно требованиям ВУЗов и содержат рисунки, диаграммы, формулы и т.д.
PPT, PPTX и PDF-файлы представлены только в архивах.
Рекомендуем скачать работу.