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

Разработка сайта интернет-магазина, управляемого базой данных. Установка XAMPP, разделение кода и оформления с помощью Smarty. Начало реализации проекта Goodstore. Создание каталога товаров. Создание модели данных с помощью ALLFUSION ERWIN DATA MODELER.

Рубрика Программирование, компьютеры и кибернетика
Вид дипломная работа
Язык русский
Дата добавления 20.03.2017
Размер файла 3,9 M

Отправить свою хорошую работу в базу знаний просто. Используйте форму, расположенную ниже

Студенты, аспиранты, молодые ученые, использующие базу знаний в своей учебе и работе, будут вам очень благодарны.

// Загружаем уровень логики приложения

require_once BUSINESS_DIR . 'catalog.php';

// Загружаем файл шаблонов Smarty

$application = new Application();

// Отображаем страницу

$application->display('store_front.tpl');

// Закрываем соединение с базой данных

DatabaseHandler::Close();

// Пытаемся загрузить несуществующий файл

//require_once 'inexistent_file.php';

?>

Файл error_handler.php

<?php

classErrorHandler

{

// Закрытый конструктор, не позволяющий непосредственно

// создавать объекты класса

privatefunction __construct()

{

}

/* Выбираем метод ErrorHandler::Handler в качестве метода обработки ошибок */

public static function SetHandler($errTypes = ERROR_TYPES)

{

return set_error_handler(array ('ErrorHandler', 'Handler'), $errTypes);

}

// Метод обработки ошибок

public static function Handler($errNo, $errStr, $errFile, $errLine)

{

/* Первые два элемента массива трассировки нам неинтересны:

- ErrorHandler.GetBacktrace

- ErrorHandler.Handler */

$backtrace = ErrorHandler::GetBacktrace(2);

// Сообщения об ошибках, которые будут выводиться, отправляться по

// электронной почте или записываться в журнал

$error_message = "\nERRNO: $errNo\nTEXT: $errStr" .

"\nLOCATION: $errFile, line " .

"$errLine, at " . date('F j, Y, g:i a') .

"\nShowing backtrace:\n$backtrace\n\n";

// Отправляем сообщения об ошибках, если SEND_ERROR_MAIL равно true

if (SEND_ERROR_MAIL == true)

error_log($error_message, 1, ADMIN_ERROR_MAIL, "From: " .

SENDMAIL_FROM . "\r\nTo: " . ADMIN_ERROR_MAIL);

// Записываем сообщения в журнал, если LOG_ERRORS равно true

if (LOG_ERRORS == true)

error_log($error_message, 3, LOG_ERRORS_FILE);

/* Выполнение не прекращается при предупреждениях,

если IS_WARNING_FATAL равно false. Ошибки E_NOTICE и E_USER_NOTICE

тоже не приводят к прекращению выполнения */

if (($errNo == E_WARNING && IS_WARNING_FATAL == false) ||

($errNo == E_NOTICE || $errNo == E_USER_NOTICE))

// Если ошибка не фатальная...

{

// Выводим сообщение, только если DEBUGGING равно true

if (DEBUGGING == true)

echo '<div class="error_box"><pre>' . $error_message . '</pre></div>';

}

else

// Если ошибка фатальная...

{

// Выводим сообщение об ошибке

if (DEBUGGING == true)

echo '<div class="error_box"><pre>'. $error_message . '</pre></div>';

else

echo SITE_GENERIC_ERROR_MESSAGE;

// Останавливаем обработку запроса

exit();

}

}

// Составляем список вызовов

public static function GetBacktrace($irrelevantFirstEntries)

{

$s = '';

$MAXSTRLEN = 64;

$trace_array = debug_backtrace();

for ($i = 0; $i < $irrelevantFirstEntries; $i++)

array_shift($trace_array);

$tabs = sizeof($trace_array) - 1;

foreach ($trace_array as $arr)

{

$tabs -= 1;

if (isset ($arr['class']))

$s .= $arr['class'] . '.';

$args = array ();

if (!empty ($arr['args']))

foreach ($arr['args']as $v)

{

if (is_null($v))

$args[] = 'null';

elseif (is_array($v))

$args[] = 'Array[' . sizeof($v) . ']';

elseif (is_object($v))

$args[] = 'Object: ' . get_class($v);

elseif (is_bool($v))

$args[] = $v ? 'true' : 'false';

else

{

$v = (string)@$v;

$str = htmlspecialchars(substr($v, 0, $MAXSTRLEN));

if (strlen($v) > $MAXSTRLEN)

$str .= '...';

$args[] = '"' . $str . '"';

}

}

$s .= $arr['function'] . '(' . implode(', ', $args) . ')';

$line = (isset ($arr['line']) ? $arr['line']: 'unknown');

$file = (isset ($arr['file']) ? $arr['file']: 'unknown');

$s .= sprintf(' # line %4d, file: %s', $line, $file);

$s .= "\n";

}

return $s;

}

}

?>

Файлdatabase_handler.php

<?php

// Класс, предоставляющий базовую функциональность доступа к данным

classDatabaseHandler

{

// Переменная для хранения экземпляра класса PDO

privatestatic $_mHandler;

// private-конструктор, не позволяющий напрямую создавать объекты класса

privatefunction __construct()

{

}

// Возвращает проинициализированный дескриптор базы данных

privatestaticfunctionGetHandler()

{

// Создаем соединение с базой данных, только если его еще нет

if (!isset(self::$_mHandler))

{

// Выполняем код, перехватывая потенциальные исключения

try

{

// Создаем новый экземпляр класса PDO

self::$_mHandler =

new PDO(PDO_DSN, DB_USERNAME, DB_PASSWORD,

array(PDO::ATTR_PERSISTENT => DB_PERSISTENCY));

// Настраиваем PDO на генерацию исключений

self::$_mHandler->setAttribute(PDO::ATTR_ERRMODE,

PDO::ERRMODE_EXCEPTION);

}

catch (PDOException $e)

{

// Закрываем дескриптор и генерируем ошибку

self::Close();

trigger_error($e->getMessage(), E_USER_ERROR);

}

}

// Возвращаем дескриптор базы данных

return self::$_mHandler;

}

// Очищаем экземпляр класса PDO

public static function Close()

{

self::$_mHandler = null;

}

// Метод-обертка для PDOStatement::execute()

public static function Execute($sqlQuery, $params = null)

{

// Пытаемся выполнить SQL-запрос или хранимую процедуру

try

{

// Получаем дескриптор базы данных

$database_handler = self::GetHandler();

// Подготавливаем запрос к выполнению

$statement_handler = $database_handler->prepare($sqlQuery);

// Выполняем запрос

$statement_handler->execute($params);

}

// Генерируем ошибку, если при выполнении SQL-запроса возникло исключение

catch(PDOException $e)

{

// Закрываем дескриптор базы данных и генерируем ошибку

self::Close();

trigger_error($e->getMessage(), E_USER_ERROR);

}

}

// Метод-обертка для PDOStatement::fetchAll()

public static function GetAll($sqlQuery, $params = null,

$fetchStyle = PDO::FETCH_ASSOC)

{

// Инициализируем возвращаемое значение в null

$result = null;

// Пытаемся выполнить SQL-запрос или хранимую процедуру

try

{

// Получаем дескриптор базы данных

$database_handler = self::GetHandler();

// Подготавливаем запрос к выполнению

$statement_handler = $database_handler->prepare($sqlQuery);

// Выполняем запрос

$statement_handler->execute($params);

// Получаем результат

$result = $statement_handler->fetchAll($fetchStyle);

}

// Генерируем ошибку, если при выполнении SQL-запроса возникло исключение

catch(PDOException $e)

{

// Закрываем дескриптор базы данных и генерируем ошибку

self::Close();

trigger_error($e->getMessage(), E_USER_ERROR);}

// Возвращаем результаты запроса

return $result;

}

// Метод-обертка для PDOStatement::fetch()

public static function GetRow($sqlQuery, $params = null,

$fetchStyle = PDO::FETCH_ASSOC)

{

// Инициализируем возвращаемое значение

$result = null;

// Пытаемся выполнить SQL-запрос или хранимую процедуру

try

{

// Получаем дескриптор базы данных

$database_handler = self::GetHandler();

// Готовим запрос к выполнению

$statement_handler = $database_handler->prepare($sqlQuery);

// Выполняем запрос

$statement_handler->execute($params);

// Получаем результат

$result = $statement_handler->fetch($fetchStyle);

}

// Генерируем ошибку, если при выполнении SQL-запроса возникло исключение

catch(PDOException $e)

{

// Закрываем дескриптор базы данных и генерируем ошибку

self::Close();

trigger_error($e->getMessage(), E_USER_ERROR);

}

// Возвращаем результаты выполнения запроса

return $result;

}

// Возвращает значение первого столбца из строки

public static function GetOne($sqlQuery, $params = null)

{

// Инициализируем возвращаемое значение

$result = null;

// Пытаемся выполнить SQL-запрос или хранимую процедуру

try

{

// Получаем дескриптор базы данных

$database_handler = self::GetHandler();

// Готовим запрос к выполнению

$statement_handler = $database_handler->prepare($sqlQuery);

// Выполняем запрос

$statement_handler->execute($params);

// Получаем результат

$result = $statement_handler->fetch(PDO::FETCH_NUM);

/* Сохраняем первое значение из множества (первый столбец первой строки)в переменной $result */

$result = $result[0];

}

// Генерируем ошибку, если при выполнении SQL-запроса возникло исключение

catch(PDOException $e)

{

// Закрываем дескриптор базы данных и генерируем ошибку

self::Close();

trigger_error($e->getMessage(), E_USER_ERROR);

}

// Возвращаем результаты выполнения запроса

return $result;

}

}

?>

Файл catalog.php

<?php

// Класс уровня логики приложения для считывания информации

// о каталоге товаров

classCatalog

{

// Определяет места отображения товара

public static $mProductDisplayOptions = array ('Default', // 0

'On Catalog', // 1

'On Department', // 2

'On Both'); // 3

// Получаем список отделов

public static function GetDepartments()

{

// Составляем SQL-запрос

$sql = 'CALL catalog_get_departments_list()';

// Выполняем запрос и получаем результаты

returnDatabaseHandler::GetAll($sql);

}

// Возвращает подробные сведения о выбранном отделе

public static function GetDepartmentDetails($departmentId)

{

// Составляем SQL-запрос

$sql = 'CALL catalog_get_department_details(:department_id)';

// Создаем массив параметров

$params = array (':department_id' => $departmentId);

// Выполняем запрос и возвращаем результат

return DatabaseHandler::GetRow($sql, $params);

}

// Возвращает список категорий, относящихся к выбранному отделу

public static function GetCategoriesInDepartment($departmentId)

{

// Составляем SQL-запрос

$sql = 'CALL catalog_get_categories_list(:department_id)';

// Создаем массив параметров

$params = array (':department_id' => $departmentId);

// Выполняем запрос и возвращаем результат

return DatabaseHandler::GetAll($sql, $params);

}

// Возвращает название и описание выбранной категории

public static function GetCategoryDetails($categoryId)

{

// Составляем SQL-запрос

$sql = 'CALL catalog_get_category_details(:category_id)';

// Создаем массив параметров

$params = array (':category_id' => $categoryId);

// Выполняем запрос и возвращаем результат

return DatabaseHandler::GetRow($sql, $params);

}

/* Вычисляет, сколько страниц понадобится для отображения всех товаров -количество товаров возвращает запрос $countSql */

private static function HowManyPages($countSql, $countSqlParams)

{

// Создаем хеш для SQL-запроса

$queryHashCode = md5($countSql . var_export($countSqlParams, true));

// Проверяем, есть ли результаты выполнения запроса в кэше

if (isset ($_SESSION['last_count_hash']) &&

isset ($_SESSION['how_many_pages']) &&

$_SESSION['last_count_hash'] === $queryHashCode)

{

// Извлекаем кэшированное значение

$how_many_pages = $_SESSION['how_many_pages'];

}

else

{

// Выполняем запрос

$items_count = DatabaseHandler::GetOne($countSql, $countSqlParams);

// Вычисляем количество страниц

$how_many_pages = ceil($items_count / PRODUCTS_PER_PAGE);

// Сохраняем данные в сеансовых переменных

$_SESSION['last_count_hash'] = $queryHashCode;

$_SESSION['how_many_pages'] = $how_many_pages;

}

// Возвращаем количество страниц

return $how_many_pages;

}

// Возвращает список товаров, принадлежащих к заданной категории

public static function GetProductsInCategory(

$categoryId, $pageNo, &$rHowManyPages)

{

// Запрос, возвращающий количество товаров в категории

$sql = 'CALL catalog_count_products_in_category(:category_id)';

// Создаем массив параметров

$params = array (':category_id' => $categoryId);

// Определяем, сколько страниц понадобится для отображения товаров

$rHowManyPages = Catalog::HowManyPages($sql, $params);

// Определяем, какой товар будет первым

$start_item = ($pageNo - 1) * PRODUCTS_PER_PAGE;

// Получаем список товаров

$sql = 'CALL catalog_get_products_in_category(:category_id, :short_product_description_length,:products_per_page,

:start_item)';

// Создаем массив параметров

$params = array (

':category_id' => $categoryId,

':short_product_description_length' =>

SHORT_PRODUCT_DESCRIPTION_LENGTH,

':products_per_page' => PRODUCTS_PER_PAGE,

':start_item' => $start_item);

// Выполняем запрос и возвращаем результат

return DatabaseHandler::GetAll($sql, $params);

}

// Возвращает список товаров для страницы отдела

public static function GetProductsOnDepartment(

$departmentId, $pageNo, &$rHowManyPages)

{

// Запрос, возвращающий количество товаров для страницы отдела

$sql = 'CALL catalog_count_products_on_department(:department_id)';

// Создаем массив параметров

$params = array (':department_id' => $departmentId);

// Определяем, сколько страниц понадобится для отображения товаров

$rHowManyPages = Catalog::HowManyPages($sql, $params);

// Определяем, какой товар будет первым

$start_item = ($pageNo - 1) * PRODUCTS_PER_PAGE;

// Получаем список товаров

$sql = 'CALL catalog_get_products_on_department(

:department_id, :short_product_description_length,

:products_per_page, :start_item)';

// Создаеммассивпараметров

$params = array ( ':department_id' => $departmentId, ':short_product_description_length' =>

SHORT_PRODUCT_DESCRIPTION_LENGTH,

':products_per_page' => PRODUCTS_PER_PAGE,

':start_item' => $start_item);

// Выполняем запрос и возвращаем результат

return DatabaseHandler::GetAll($sql, $params);

}

// Возвращает список товаров для главной страницы каталога

public static function GetProductsOnCatalog($pageNo, &$rHowManyPages)

{

// Запрос, возвращающий количество товаров для главной страницы каталога

$sql = 'CALL catalog_count_products_on_catalog()';

// Определяем, сколько страниц понадобится для отображения товаров

$rHowManyPages = Catalog::HowManyPages($sql, null);

// Определяем, какой товар будет первым

$start_item = ($pageNo - 1) * PRODUCTS_PER_PAGE;

// Получаем список товаров

$sql = 'CALL catalog_get_products_on_catalog(

:short_product_description_length,

:products_per_page, :start_item)';

// Создаеммассивпараметров

$params = array (':short_product_description_length' =>

SHORT_PRODUCT_DESCRIPTION_LENGTH,

':products_per_page' => PRODUCTS_PER_PAGE,

':start_item' => $start_item);

// Выполняем запрос и возвращаем результат

return DatabaseHandler::GetAll($sql, $params);

}

// Возвращает подробную информацию о товаре

public static function GetProductDetails($productId)

{

// Составляем SQL-запрос

$sql = 'CALL catalog_get_product_details(:product_id)';

// Создаем массив параметров

$params = array (':product_id' => $productId);

// Выполняем запрос и возвращаем результат

return DatabaseHandler::GetRow($sql, $params);

}

// Возвращает список отделов и категорий, к которым принадлежит товар

public static function GetProductLocations($productId)

{

// Составляем SQL-запрос

$sql = 'CALL catalog_get_product_locations(:product_id)';

// Создаем массив параметров

$params = array (':product_id' => $productId);

// Выполняем запрос и возвращаем результат

return DatabaseHandler::GetAll($sql, $params);

}

// Извлекаем атрибуты товаров

public static function GetProductAttributes($productId)

{

// Составляем SQL-запрос

$sql = 'CALL catalog_get_product_attributes(:product_id)';

// Создаем массив параметров

$params = array (':product_id' => $productId);

// Выполняем запрос и возвращаем результаты

return DatabaseHandler::GetAll($sql, $params);

}

// Извлекает из базы данных названия и описания всех отделов

public static function GetDepartmentsWithDescriptions()

{

// Составляем SQL-запрос

$sql = 'CALL catalog_get_departments()';

// Выполняем запрос и возвращаем результаты

returnDatabaseHandler::GetAll($sql);

}

// Добавляет отдел

public static function AddDepartment($departmentName, $departmentDescription)

{

// Составляем SQL-запрос

$sql = 'CALL catalog_add_department(:department_name,

:department_description)';

// Создаем массив параметров

$params = array (':department_name' => $departmentName,

':department_description' => $departmentDescription);

// Выполняем запрос

DatabaseHandler::Execute($sql, $params);

}

// Обновляет сведения об отделе

public static function UpdateDepartment($departmentId, $departmentName,$departmentDescription)

{

// Составляем SQL-запрос

$sql = 'CALL catalog_update_department(:department_id, :department_name,:department_description)';

// Создаем массив параметров

$params = array (':department_id' => $departmentId,

':department_name' => $departmentName,

':department_description' => $departmentDescription);

// Выполняем запрос

DatabaseHandler::Execute($sql, $params);

}

// Удаляет отдел

public static function DeleteDepartment($departmentId)

{

// Составляем SQL-запрос

$sql = 'CALL catalog_delete_department(:department_id)';

// Создаем массив параметров

$params = array (':department_id' => $departmentId);

// Выполняем запрос и возвращаем результаты

return DatabaseHandler::GetOne($sql, $params);

}

// Возвращает список категорий отдела

public static function GetDepartmentCategories($departmentId)

{

// Составляем SQL-запрос

$sql = 'CALL catalog_get_department_categories(:department_id)';

// Создаем массив параметров

$params = array (':department_id' => $departmentId);

// Выполняем запрос и возвращаем результаты

return DatabaseHandler::GetAll($sql, $params);

}

// Добавляет новую категорию

public static function AddCategory($departmentId, $categoryName,

$categoryDescription)

{

// Составляем SQL-запрос

$sql = 'CALL catalog_add_category(:department_id, :category_name,:category_description)';

// Создаеммассивпараметров

$params = array (':department_id' => $departmentId,

':category_name' => $categoryName,

':category_description' => $categoryDescription);

// Выполняем запрос

DatabaseHandler::Execute($sql, $params);

}

// Обновляет категорию

public static function UpdateCategory($categoryId, $categoryName, $categoryDescription)

{

// Составляем SQL-запрос

$sql = 'CALL catalog_update_category(:category_id, :category_name,:category_description)';

// Создаеммассивпараметров

$params = array (':category_id' => $categoryId,

':category_name' => $categoryName,

':category_description' => $categoryDescription);

// Выполняем запрос

DatabaseHandler::Execute($sql, $params);

}

// Удаляет категорию

public static function DeleteCategory($categoryId)

{

// Составляем SQL-запрос

$sql = 'CALL catalog_delete_category(:category_id)';

// Создаем массив параметров

$params = array (':category_id' => $categoryId);

// Выполняем запрос и возвращаем результаты

return DatabaseHandler::GetOne($sql, $params);

}

// Возвращает все атрибуты

public static function GetAttributes()

{

// Составляем SQL-запрос

$sql = 'CALL catalog_get_attributes()';

// Выполняем запрос и возвращаем результаты

returnDatabaseHandler::GetAll($sql);

}

// Добавляет атрибут

public static function AddAttribute($attributeName)

{

// Составляем SQL-запрос

$sql = 'CALL catalog_add_attribute(:attribute_name)';

// Создаем массив параметров

$params = array (':attribute_name' => $attributeName);

// Выполняем запрос

DatabaseHandler::Execute($sql, $params);

}

// Обновляет имя атрибута

public static function UpdateAttribute($attributeId, $attributeName)

{

// Составляем SQL-запрос

$sql = 'CALL catalog_update_attribute(:attribute_id, :attribute_name)';

// Создаем массив параметров

$params = array (':attribute_id' => $attributeId,

':attribute_name' => $attributeName);

// Выполняем запрос

DatabaseHandler::Execute($sql, $params);

}

// Удаляет атрибут

public static function DeleteAttribute($attributeId)

{

// Составляем SQL-запрос

$sql = 'CALL catalog_delete_attribute(:attribute_id)';

// Создаем массив параметров

$params = array (':attribute_id' => $attributeId);

// Выполняем запрос и возвращаем результаты

return DatabaseHandler::GetOne($sql, $params);

}

// Возвращает сведения о выбранном атрибуте

public static function GetAttributeDetails($attributeId)

{

// Составляем SQL-запрос

$sql = 'CALL catalog_get_attribute_details(:attribute_id)';

// Создаем массив параметров

$params = array (':attribute_id' => $attributeId);

// Выполняем запрос и возвращаем результаты

return DatabaseHandler::GetRow($sql, $params);

}

// Возвращает значения атрибута

public static function GetAttributeValues($attributeId)

{

// Составляем SQL-запрос

$sql = 'CALL catalog_get_attribute_values(:attribute_id)';

// Создаем массив параметров

$params = array (':attribute_id' => $attributeId);

// Выполняем запрос и возвращаем результаты

return DatabaseHandler::GetAll($sql, $params);

}

// Добавляет значение атрибута

public static function AddAttributeValue($attributeId, $attributeValue)

{

// Составляем SQL-запрос

$sql = 'CALL catalog_add_attribute_value(:attribute_id,:value)';

// Создаем массив параметров

$params = array (':attribute_id' => $attributeId,':value' => $attributeValue);

// Выполняем запрос

DatabaseHandler::Execute($sql, $params);

}

// Обновляет значение атрибута

public static function UpdateAttributeValue(

$attributeValueId, $attributeValue)

{

// Составляем SQL-запрос

$sql = 'CALL catalog_update_attribute_value(

:attribute_value_id, :value)';

// Создаем массив параметров

$params = array (':attribute_value_id' => $attributeValueId,

':value' => $attributeValue);

// Выполняем запрос

DatabaseHandler::Execute($sql, $params);

}

// Удаляет значение атрибута

public static function DeleteAttributeValue($attributeValueId)

{

// Составляем SQL-запрос

$sql = 'CALL catalog_delete_attribute_value(:attribute_value_id)';

// Создаем массив параметров

$params = array (':attribute_value_id' => $attributeValueId);

// Выполняем запрос и возвращаем результаты

return DatabaseHandler::GetOne($sql, $params);

}

// Получаем товары заданной категории

public static function GetCategoryProducts($categoryId)

{

// Составляем SQL-запрос

$sql = 'CALL catalog_get_category_products(:category_id)';

// Создаем массив параметров

$params = array (':category_id' => $categoryId);

// Выполняем запрос и возвращаем результаты

return DatabaseHandler::GetAll($sql, $params);

}

// Создаем товар и зачисляем его в категорию

public static function AddProductToCategory($categoryId, $productName, $productDescription, $productPrice)

{

// Составляем SQL-запрос

$sql = 'CALL catalog_add_product_to_category(:category_id, :product_name,:product_description, :product_price)';

// Создаем массив параметров

$params = array (':category_id' => $categoryId,

':product_name' => $productName,

':product_description' => $productDescription,':product_price' => $productPrice);

// Выполняем запрос

DatabaseHandler::Execute($sql, $params);

}

// Обновляет сведения о товаре

public static function UpdateProduct($productId, $productName,

$productDescription, $productPrice,$productDiscountedPrice)

{

// Составляем SQL-запрос

$sql = 'CALL catalog_update_product(:product_id, :product_name,:product_description, :product_price,

:product_discounted_price)';

// Создаем массив параметров

$params = array (':product_id' => $productId,

':product_name' => $productName,

':product_description' => $productDescription,

':product_price' => $productPrice,

':product_discounted_price' => $productDiscountedPrice);

// Выполняем запрос

DatabaseHandler::Execute($sql, $params);

}

// Удаляет товар из каталога

public static function DeleteProduct($productId)

{

// Составляем SQL-запрос

$sql = 'CALL catalog_delete_product(:product_id)';

// Создаем массив параметров

$params = array (':product_id' => $productId);

// Выполняем запрос

DatabaseHandler::Execute($sql, $params);

}

// Удаляет товар из категории

public static function RemoveProductFromCategory($productId, $categoryId)

{

// Составляем SQL-запрос

$sql = 'CALL catalog_remove_product_from_category( :product_id, :category_id)';

// Создаем массив параметров

$params = array (':product_id' => $productId,

':category_id' => $categoryId);

// Выполняем запрос и возвращаем результаты

return DatabaseHandler::GetOne($sql, $params);

}

// Возвращает список категорий

public static function GetCategories()

{

// Составляем SQL-запрос

$sql = 'CALL catalog_get_categories()';

// Выполняем запрос и возвращаем результаты

returnDatabaseHandler::GetAll($sql);

}

// Возвращает сведения о товаре

public static function GetProductInfo($productId)

{

// Составляем SQL-запрос

$sql = 'CALL catalog_get_product_info(:product_id)';

// Создаем массив параметров

$params = array (':product_id' => $productId);

// Выполняем запрос и возвращаем результаты

return DatabaseHandler::GetRow($sql, $params);

}

// Возвращает список категорий, к которым относится товар

public static function GetCategoriesForProduct($productId)

{

// Составляем SQL-запрос

$sql = 'CALL catalog_get_categories_for_product(:product_id)';

// Создаем массив параметров

$params = array (':product_id' => $productId);

// Выполняем запрос и возвращаем результаты

return DatabaseHandler::GetAll($sql, $params);

}

// Включает товар в категорию

public static function SetProductDisplayOption($productId, $display)

{

// Составляем SQL-запрос

$sql = 'CALL catalog_set_product_display_option(

:product_id, :display)';

// Создаем массив параметров

$params = array (':product_id' => $productId,

':display' => $display);

// Выполняем запрос

DatabaseHandler::Execute($sql, $params);

}

// Включает товар в категорию

public static function AssignProductToCategory($productId, $categoryId)

{

// Составляем SQL-запрос

$sql = 'CALL catalog_assign_product_to_category(

:product_id, :category_id)';

// Создаем массив параметров

$params = array (':product_id' => $productId,

':category_id' => $categoryId);

// Выполняем запрос

DatabaseHandler::Execute($sql, $params);

}

// Перемещает товар из одной категории в другую

public static function MoveProductToCategory($productId, $sourceCategoryId,$targetCategoryId)

{

// Составляем SQL-запрос

$sql = 'CALL catalog_move_product_to_category(:product_id,

:source_category_id, :target_category_id)';

// Создаем массив параметров

$params = array (':product_id' => $productId,

':source_category_id' => $sourceCategoryId,

':target_category_id' => $targetCategoryId);

// Выполняем запрос

DatabaseHandler::Execute($sql, $params);

}

// Возвращает атрибуты, не присвоенные никаким товарам

public static function GetAttributesNotAssignedToProduct($productId)

{

// Составляем SQL-запрос

$sql = 'CALL

catalog_get_attributes_not_assigned_to_product(:product_id)';

// Создаем массив параметров

$params = array (':product_id' => $productId);

// Выполняем запрос и возвращаем результаты

return DatabaseHandler::GetAll($sql, $params);

}

// Присваивает значение атрибута указанному товару

public static function AssignAttributeValueToProduct($productId,

$attributeValueId)

{

// Составляем SQL-запрос

$sql = 'CALL catalog_assign_attribute_value_to_product(

:product_id, :attribute_value_id)';

// Создаем массив параметров

$params = array (':product_id' => $productId,

':attribute_value_id' => $attributeValueId);

// Выполняем запрос

DatabaseHandler::Execute($sql, $params);

}

// Удаляет значение атрибута для товара

public static function RemoveProductAttributeValue($productId,

$attributeValueId)

{

// Составляем SQL-запрос

$sql = 'CALL catalog_remove_product_attribute_value(

:product_id, :attribute_value_id)';

// Создаем массив параметров

$params = array (':product_id' => $productId,

':attribute_value_id' => $attributeValueId);

// Выполняем запрос

DatabaseHandler::Execute($sql, $params);

}

// Изменяет имя файла изображения товара в базе данных

public static function SetImage($productId, $imageName)

{

// Составляем SQL-запрос

$sql = 'CALL catalog_set_image(:product_id, :image_name)';

// Создаем массив параметров

$params = array (':product_id' => $productId, ':image_name' =>

$imageName);

// Выполняем запрос

DatabaseHandler::Execute($sql, $params);

}

// Изменяет имя файла второго изображения товара в базе данных

public static function SetImage2($productId, $imageName)

{

// Составляем SQL-запрос

$sql = 'CALL catalog_set_image_2(:product_id, :image_name)';

// Создаем массив параметров

$params = array (':product_id' => $productId, ':image_name' =>

$imageName);

// Выполняем запрос

DatabaseHandler::Execute($sql, $params);

}

// Изменяет имя файла уменьшенного изображения товара в базе данных

public static function SetThumbnail($productId, $thumbnailName)

{

// Составляем SQL-запрос

$sql = 'CALL catalog_set_thumbnail(:product_id, :thumbnail_name)';

// Создаем массив параметров

$params = array (':product_id' => $productId,

':thumbnail_name' => $thumbnailName);

// Выполняем запрос

DatabaseHandler::Execute($sql, $params);

}

}

?>

Файл departments_list.tpl

{* departments_list.tpl *}

{load_presentation_object filename="departments_list" assign="obj"}

{* Начало списка отделов *}

<divclass="box">

<p class="box-title">Каталог</p>

<ul>

{* Перебираем элементы списка отделов *}

{section name=i loop=$obj->mDepartments}

{assignvar=selectedvalue=""}

{* Проверяем, выделен ли отдел, чтобы определить, какой

стиль CSS использовать *}

{if ($obj->mSelectedDepartment ==

$obj->mDepartments[i].department_id)}

{assign var=selected value="class=\"selected\""}

{/if}

<li>

{* Генерируем ссылку для нового отдела в списке *}

<a {$selected} href="{$obj->mDepartments[i].link_to_department}">

{$obj->mDepartments[i].name}

</a>

</li>

{/section}

</ul>

</div>

{* Конец списка отделов *}

Файл 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);

}

?>

Файлdepartments_list.php

<?php

// Управляет списком отделов

classDepartmentsList

{

/* Общественные переменные, доступные в departments_list.tpl шаблона Smarty*/

public $mSelectedDepartment = 0;

public $mDepartments;

// Constructor reads query string parameter

public function __construct()

{

/* ЕслиDepartmentIDсуществуетвстрокезапроса, мыпосещаем

отдел */

if (isset ($_GET['DepartmentId']))

$this->mSelectedDepartment = (int)$_GET['DepartmentId'];

elseif (isset($_GET['ProductId']) &&

isset($_SESSION['link_to_continue_shopping']))

{

$continue_shopping =

Link::QueryStringToArray($_SESSION['link_to_continue_shopping']);

if (array_key_exists('DepartmentId', $continue_shopping))

$this->mSelectedDepartment =

(int)$continue_shopping['DepartmentId'];

}

}

/* Вызов метода бизнес-уровня, чтобы прочитать список отделов и создать свои ссылки */

public function init()

{

$this->mDepartments = Catalog::GetDepartments();

// Создаем ссылкина отдел

for ($i = 0; $i < count($this->mDepartments); $i++)

$this->mDepartments[$i]['link_to_department'] =

Link::ToDepartment($this->mDepartments[$i]['department_id']);

}

}

?>

Файл link.php

<?php

class Link

{

public static function Build($link, $type = 'http')

{

$base = (($type == 'http' || USE_SSL == 'no') ? 'http://' : 'https://') .getenv('SERVER_NAME');

// Если константа HTTP_SERVER_PORT определена и значение //отличается от используемого по умолчанию...

if (defined('HTTP_SERVER_PORT') && HTTP_SERVER_PORT != '80' &&

strpos($base, 'https') === false)

{

// Добавляемномерпорта

$base .= ':' . HTTP_SERVER_PORT;

}

$link = $base . VIRTUAL_LOCATION . $link;

// Escape-символы для html

return htmlspecialchars($link, ENT_QUOTES);

}

public static function ToDepartment($departmentId, $page = 1)

{

$link = 'index.php?DepartmentId=' . $departmentId;

if ($page > 1)

$link .= '&Page=' . $page;

return self::Build($link);

}

public static function ToCategory($departmentId, $categoryId, $page = 1)

{

$link = 'index.php?DepartmentId=' . $departmentId .

'&CategoryId=' . $categoryId;

if ($page > 1)

$link .= '&Page=' . $page;

return self::Build($link);//self::Build($link);

}

public static function ToProduct($productId)

{

return self::Build('index.php?ProductId=' . $productId);

}

public static function ToIndex($page = 1)

{

$link = '';

if ($page > 1)

$link .= 'index.php?Page=' . $page;

return self::Build($link);

}

public static function QueryStringToArray($queryString)

{

$result = array();

if ($queryString != '')

{

$elements = explode('&', $queryString);

foreach($elements as $key => $value)

{

$element = explode('=', $value);

$result[urldecode($element[0])] =

isset($element[1]) ? urldecode($element[1]) : '';

}

}

return $result;

}

// Создание ссылки на страницу поиска

public static function ToSearch()

{

return self::Build('index.php?Search');

}

// Создание ссылки на страницу с результатами поиска

public static function ToSearchResults($searchString, $allWords,

$page = 1)

{

$link = 'search-results/find';

if (empty($searchString))

$link .= '/';

else

$link .= '-' . self::CleanUrlText($searchString) . '/';

$link .= 'all-words-' . $allWords . '/';

if ($page > 1)

$link .= 'page-' . $page . '/';

returnself::Build($link);

}

// ПеренаправлениеправильногоURL

public static function CheckRequest()

{

$proper_url = '';

if (isset ($_GET['Search']) || isset($_GET['SearchResults']) ||

isset ($_GET['AddProduct']))

{

return ;

}

// ПолучаемнадлежащееURLдлястраницкатегорий

elseif (isset ($_GET['DepartmentId']) && isset ($_GET['CategoryId']))

{

if (isset ($_GET['Page']))

$proper_url = self::ToCategory($_GET['DepartmentId'],

$_GET['CategoryId'], $_GET['Page']);

else

$proper_url = self::ToCategory($_GET['DepartmentId'],

$_GET['CategoryId']);

}

// Получаем надлежащее URL для страниц отделов

elseif (isset ($_GET['DepartmentId']))

{

if (isset ($_GET['Page']))

$proper_url = self::ToDepartment($_GET['DepartmentId'],

$_GET['Page']);

else

$proper_url = self::ToDepartment($_GET['DepartmentId']);

}

// Получаем надлежащее URL для страниц продукции

elseif (isset ($_GET['ProductId']))

{

$proper_url = self::ToProduct($_GET['ProductId']);

}

// Получаем надлежащее URL домашней страницы

else

{

if (isset($_GET['Page']))

$proper_url = self::ToIndex($_GET['Page']);

else

$proper_url = self::ToIndex();

}

/* Удалить виртуальное место из запрашиваемого URL

так чтобы мы могли сравнить пути */

$requested_url = self::Build(str_replace(VIRTUAL_LOCATION, '',

$_SERVER['REQUEST_URI']));

if (strstr($proper_url, '/-'))

{

// Очистить выходной буфер

ob_clean();

// Загрузить страницу 404

include '404.php';

// Очистить выходной буфер и остановить выполнение

flush();

ob_flush();

ob_end_clean();

exit();

}

if ($requested_url != $proper_url)

{

ob_clean();

header('HTTP/1.1 301 Moved Permanently');

header('Location: ' . $proper_url);

flush();

ob_flush();

ob_end_clean();

exit();

}

}

// Создает ссылку Add to Cart

public static function ToAddProduct($productId)

{

return self::Build('index.php?AddProduct=' . $productId);

}

// Создает ссылку на страницу администрирования

public static function ToAdmin($params = '')

{

$link = 'admin.php';

if ($params != '')

$link .= '?' . $params;

return self::Build($link, 'https');

}

// Создает ссылку для выхода

public static function ToLogout()

{

return self::ToAdmin('Page=Logout');

}

// Создание ссылки на страницу администрирования отделов

public static function ToDepartmentsAdmin()

{

return self::ToAdmin('Page=Departments');

}

// Создает ссылку на страницу администрирования категорий

public static function ToDepartmentCategoriesAdmin($departmentId)

{

$link = 'Page=Categories&DepartmentId=' . $departmentId;

return self::ToAdmin($link);

}

// Создаем ссылку на страницу администрирования атрибутов

public static function ToAttributesAdmin()

{

return self::ToAdmin('Page=Attributes');

}

// Создает ссылку на страницу администрирования значений атрибутов

public static function ToAttributeValuesAdmin($attributeId)

{

$link = 'Page=AttributeValues&AttributeId=' . $attributeId;

return self::ToAdmin($link);

}

// Создает ссылку на страницу администрирования товаров

public static function ToCategoryProductsAdmin($departmentId, $categoryId)

{

$link = 'Page=Products&DepartmentId=' . $departmentId .

'&CategoryId=' . $categoryId;

returnself::ToAdmin($link);

}

// Создает ссылку на страницу администрирования информации о товарах

public static function ToProductAdmin($departmentId, $categoryId,$productId)

{

$link = 'Page=ProductDetails&DepartmentId=' . $departmentId .

'&CategoryId=' . $categoryId . '&ProductId=' . $productId;

'&CategoryId=' . $categoryId . '&ProductId=' . $productId;

return self::ToAdmin($link);

}

}

?>

Файл store_front.php

<?php

class StoreFront

{

public $mSiteUrl;

// Определяем файл шаблона для содержимого страницы

public $mContentsCell = 'first_page_contents.tpl';

// Определяем файл шаблона для ячеек категорий

public $mCategoriesCell = 'blank.tpl';

// Заголовок страницы

public $mPageTitle;

// Ссылка PayPal для возврата в магазин

public $mPayPalContinueShoppingLink;

// Конструктор класса

public function __construct()

{

$this->mSiteUrl = Link::Build('');

}

// Инициализируем объект представления

publicfunctioninit()

{

// Создаем ссылку для возврата в магазин в корзине покупателя PayPal

if (!isset ($_GET['AddProduct']))

{

/* Сохраняем текущий запрос, необходимый для работы ссылки в paypal,возвращающей в магазин */

$_SESSION['paypal_continue_shopping'] =

Link::Build(str_replace(VIRTUAL_LOCATION, '',

$_SERVER['REQUEST_URI']));

$this->mPayPalContinueShoppingLink =

$_SESSION['paypal_continue_shopping'];

}

// ЕслинажатакнопкаAddtoCart, подготавливаемпеременные //PayPal

else

{

// Очищаем буфер вывода

ob_clean();

$product_id = 0;

// Получаем идентификатор товара, который добавляется в корзину

if (isset ($_GET['AddProduct']))

$product_id = (int)$_GET['AddProduct'];

else

trigger_error('AddProduct not set');

$selected_attribute_groups = array ();

$selected_attribute_values = array ();

// Получаем атрибуты выбранного товара, если таковые есть

foreach ($_POST as $key => $value)

{

// Если в массиве POST есть поля, начинающиеся с "attr_"

if (substr($key, 0, 5) == 'attr_')

{

// Получаем имя и значение выбранного атрибута

$selected_attribute_groups[] = substr($key, strlen('attr_'));

$selected_attribute_values[] = $_POST[$key];

}

}

// Получаем сведения о товаре

$product = Catalog::GetProductDetails($product_id);

// Генерируем URL для PayPal, чтобы добавить товар в корзину

$paypal_url = PAYPAL_URL . '?cmd=_cart&business=' . PAYPAL_EMAIL .'&item_name=' . rawurlencode($product['name']);

if (count($selected_attribute_groups) > 0)

$paypal_url .= '&on0=' . implode('/', $selected_attribute_groups) .

'&os0=' . implode('/', $selected_attribute_values);

$paypal_url .='&amount=' . ($product['discounted_price'] == 0 ?

$product['price'] : $product['discounted_price']) .'&currency_code=' . PAYPAL_CURRENCY_CODE . '&add=1' .'&shopping_url=' .

rawurlencode($_SESSION['paypal_continue_shopping']) .

'&return=' . rawurlencode(PAYPAL_RETURN_URL) .

'&cancel_return=' . rawurlencode(PAYPAL_CANCEL_RETURN_URL);

// Выполняем перенаправление на страницу корзины PayPal

header('HTTP/1.1 302 Found');

header('Location: ' . $paypal_url);

// Очищаем выходной буфер и завершаем выполнение

flush();

ob_flush();

ob_end_clean();

exit();

}

// Загружаем подробные сведения об отделе на страницу отдела

if (isset ($_GET['DepartmentId']))

{

$this->mContentsCell = 'department.tpl';

$this->mCategoriesCell = 'categories_list.tpl';

}

elseif (isset($_GET['ProductId']) &&

isset($_SESSION['link_to_continue_shopping']) &&

strpos($_SESSION['link_to_continue_shopping'], 'DepartmentId', 0)

!== false)

{

$this->mCategoriesCell = 'categories_list.tpl';

}

// Загружаем сведения о товаре на страницу товара

if (isset ($_GET['ProductId']))

$this->mContentsCell = 'product.tpl';

// Загружаем страницу с результатами поиска, если выполнялся поиск

elseif (isset ($_GET['SearchResults']))

$this->mContentsCell = 'search_results.tpl';

}

// Возвращает заголовок страницы

privatefunction _GetPageTitle()

{

$page_title = 'Goodstore: ' .

'Demo Product Catalog from Beginning PHP and MySQL E-Commerce';

if (isset ($_GET['DepartmentId']) && isset ($_GET['CategoryId']))

{

$page_title = 'Goodstore: ' .

Catalog::GetDepartmentName($_GET['DepartmentId']) . ' - ' .

Catalog::GetCategoryName($_GET['CategoryId']);

if (isset ($_GET['Page']) && ((int)$_GET['Page']) > 1)

$page_title .= ' - Page ' . ((int)$_GET['Page']);

}

elseif (isset ($_GET['DepartmentId']))

{

$page_title = 'Goodstore: ' .

Catalog::GetDepartmentName($_GET['DepartmentId']);

if (isset ($_GET['Page']) && ((int)$_GET['Page']) > 1)

$page_title .= ' - Page ' . ((int)$_GET['Page']);

}

elseif (isset ($_GET['ProductId']))

{

$page_title = 'Goodstore: ' .

Catalog::GetProductName($_GET['ProductId']);

}

elseif (isset ($_GET['SearchResults']))

{

$page_title = 'Goodstore: "';

$page_title .= trim(str_replace('-', ' ', $_GET['SearchString'])) . '" (';

$all_words = isset ($_GET['AllWords']) ? $_GET['AllWords'] : 'off';

$page_title .= (($all_words == 'on') ? 'all' : 'any') . '-words search';

if (isset ($_GET['Page']) && ((int)$_GET['Page']) > 1)

$page_title .= ', page ' . ((int)$_GET['Page']);

$page_title .= ')';

}

else

{

if (isset ($_GET['Page']) && ((int)$_GET['Page']) > 1)

$page_title .= ' - Page ' . ((int)$_GET['Page']);

}

return $page_title;

}

}

?>

Файл blank.tpl

{* Smarty blank page *}

Файл department.tpl

{* department.tpl *}

{load_presentation_object filename="department" assign="obj"}

<h1 class="title">{$obj->mName}</h1>

<p class="description">{$obj->mDescription}</p>

{include file="products_list.tpl"}

Файл department.php

<?php

// Занимается извлечением сведений об отделе

class Department

{

// Public-переменныедляшаблонов Smarty

public $mName;

public $mDescription;

// Private-элементы

private $_mDepartmentId;

private $_mCategoryId;

// Конструкторкласса

public function __construct()

{

// В строке запроса должен присутствовать параметр DepartmentId

if (isset ($_GET['DepartmentId']))

$this->_mDepartmentId = (int)$_GET['DepartmentId'];

else

trigger_error('DepartmentId not set');

/* Если CategoryId есть в строке запроса, мы сохраняем его значение(преобразуя его в integer для защиты от некорректных значений) */

if (isset ($_GET['CategoryId']))

$this->_mCategoryId = (int)$_GET['CategoryId'];

}

public function init()

{

// Еслипосещаемотдел...

$department_details =

Catalog::GetDepartmentDetails($this->_mDepartmentId);

$this->mName = $department_details['name'];

$this->mDescription = $department_details['description'];

// Еслипосещаемкатегорию...

if (isset ($this->_mCategoryId))

{

$category_details =

Catalog::GetCategoryDetails($this->_mCategoryId);

$this->mName = $this->mName . ' &raquo; ' .

$category_details['name'];

$this->mDescription = $category_details['description'];

}

}

}

?>

Файл categories_list.tpl

{* categories_list.tpl *}

{load_presentation_object filename="categories_list" assign="obj"}

{* Start categories list *}

<div class="box">

<pclass="box-title">Выберите категорию товаров</p>

<ul>

{section name=i loop=$obj->mCategories}

{assign var=selected value=""}

{if ($obj->mSelectedCategory == $obj->mCategories[i].category_id)}

{assign var=selected value="class=\"selected\""}

{/if}

<li>

<a {$selected} href="{$obj->mCategories[i].link_to_category}">

{$obj->mCategories[i].name}

</a>

</li>

{/section}

</ul>

</div>

{* End categories list *}

Файлcategories_list.php

<?php

// Отвечает за списки категорий

classCategoriesList

{

// Public-переменные дл¤ шаблона smarty

public $mSelectedCategory = 0;

public $mSelectedDepartment = 0;

public $mCategories;

// Конструкторсчитываетпараметризстрокизапроса

public function __construct()

{

if (isset ($_GET['DepartmentId']))

$this->mSelectedDepartment = (int)$_GET['DepartmentId'];

else

trigger_error('DepartmentId not set');

if (isset ($_GET['CategoryId']))

$this->mSelectedCategory = (int)$_GET['CategoryId'];

}

public function init()

{

$this->mCategories =

Catalog::GetCategoriesInDepartment($this->mSelectedDepartment);

// Генерируем ссылки дл¤ страниц категорий

for ($i = 0; $i < count($this->mCategories); $i++)

$this->mCategories[$i]['link_to_category'] =

Link::ToCategory($this->mSelectedDepartment,

$this->mCategories[$i]['category_id']);

}

}

?>

Файл products_list.tpl

{* products_list.tpl *}

{load_presentation_object filename="products_list" assign="obj"}

{if $obj->mSearchDescription != ""}

<p class="description">{$obj->mSearchDescription}</p>

{/if}

{if $obj->mrTotalPages > 1}

<p>

Page {$obj->mPage} of {$obj->mrTotalPages}

{if $obj->mLinkToPreviousPage}

<a href="{$obj->mLinkToPreviousPage}">Previous</a>

{else}

Previous

{/if}

{if $obj->mLinkToNextPage}

<a href="{$obj->mLinkToNextPage}">Next</a>

{else}

Next

{/if}

</p>

{/if}

{if $obj->mProducts}

<table class="product-list" border="0">

<tbody>

{section name=k loop=$obj->mProducts}

{if $smarty.section.k.index % 2 == 0}

<tr>

{/if}

<td valign="top">

<h3 class="product-title">

<a href="{$obj->mProducts[k].link_to_product}">

{$obj->mProducts[k].name}

</a>

</h3>

<p>

{if $obj->mProducts[k].thumbnail neq ""}

<a href="{$obj->mProducts[k].link_to_product}">

<img src="{$obj->mProducts[k].thumbnail}"

alt="{$obj->mProducts[k].name}" />

</a>

{/if}

{$obj->mProducts[k].description}

</p>

<p class="section">

Цена:

{if $obj->mProducts[k].discounted_price != 0}

<span class="old-price">{$obj->mProducts[k].price}</span>

<span class="price">{$obj->mProducts[k].discounted_price}</span>

{else}

<span class="price">{$obj->mProducts[k].price}</span>

{/if}

</p>

{* Форма Add to Cart *}

<form class="add-product-form" target="_self" method="post"

action="{$obj->mProducts[k].link_to_add_product}">

{* Генерируем список значений атрибутов *}

<p class="attributes">

{* Просматриваем список атрибутов и их значений *}

{section name=l loop=$obj->mProducts[k].attributes}

{* Генерируемновыйтег select? *}

{if $smarty.section.l.first ||

$obj->mProducts[k].attributes[l].attribute_name !==

$obj->mProducts[k].attributes[l.index_prev].attribute_name}

{$obj->mProducts[k].attributes[l].attribute_name}:

<select name="attr_{$obj->mProducts[k].attributes[l].attribute_name}">

{/if}

{* Генерируем новый тег option *}

<option value="{$obj->mProducts[k].attributes[l].attribute_value}">

{$obj->mProducts[k].attributes[l].attribute_value}

</option>

{* Закрываемтег select? *}

{if $smarty.section.l.last ||

$obj->mProducts[k].attributes[l].attribute_name !==

$obj->mProducts[k].attributes[l.index_next].attribute_name}

</select>

{/if}

{/section}

</p>

{* Добавляемкнопкудляотправкиформы *}

<p>

<input type="submit" name="submit" value="Добавитьвкорзину" />

</p>

</form>

</td>

{if $smarty.section.k.index % 2 != 0 && !$smarty.section.k.first ||

$smarty.section.k.last}

</tr>

{/if}

{/section}

</tbody>

</table>

{/if}

Файл products_list.php

<?php

class ProductsList

{

// Public-переменные, доступныеизшаблонаSmarty

public $mPage = 1;

public $mrTotalPages;

public $mLinkToNextPage;

public $mLinkToPreviousPage;

public $mProducts;

public $mSearchDescription;

public $mAllWords = 'off';

public $mSearchString;

// Private-переменные

private $_mDepartmentId;

private $_mCategoryId;

// Конструкторкласса

public function __construct()

{

// Получаем DepartmentId из строки запроса и преобразуем его в int

if (isset ($_GET['DepartmentId']))

$this->_mDepartmentId = (int)$_GET['DepartmentId'];

// Получаем CategoryId из строки запроса и преобразуем его в int

if (isset ($_GET['CategoryId']))

$this->_mCategoryId = (int)$_GET['CategoryId'];

// Получаем номер страницы из строки запроса и преобразуем его в int

if (isset ($_GET['Page']))

$this->mPage = (int)$_GET['Page'];

if ($this->mPage < 1)

trigger_error('Incorrect Page value');

// Сохраняемадресстраницы, посещеннойпоследней

$_SESSION['link_to_continue_shopping'] = $_SERVER['QUERY_STRING'];

// Получаем поисковую строку и параметр AllWords из строки запроса

if (isset ($_GET['SearchResults']))

{

$this->mSearchString = trim(str_replace('-', ' ',

$_GET['SearchString']));

$this->mAllWords = isset ($_GET['AllWords']) ? $_GET['AllWords'] : 'off';

}

}

publicfunctioninit()

{

/* Если выполнялся поиск, получаем список товаров, вызывая

метод уровня логики приложения Search() */

if (isset ($this->mSearchString))

{

// Получаемрезультатыпоиска

$search_results = Catalog::Search($this->mSearchString,

$this->mAllWords,

$this->mPage,

$this->mrTotalPages);

// Получаемсписоктоваров

$this->mProducts = $search_results['products'];

// Составляемзаголовокдляспискатоваров

if (count($search_results['accepted_words']) > 0)

$this->mSearchDescription =

'<p class="description">Products containing <font class="words">'

. ($this->mAllWords == 'on' ? 'all' : 'any') . '</font>'

. ' of these words: <font class="words">'

. implode(', ', $search_results['accepted_words']) .

'</font></p>';

if (count($search_results['ignored_words']) > 0)

$this->mSearchDescription .=

'<p class="description">Ignored words: <font class="words">'

. implode(', ', $search_results['ignored_words']) .

'</font></p>';

if (!(count($search_results['products']) > 0))

$this->mSearchDescription .=

'<p class="description">Your search generated no results.</p>';

}

/* Если посетитель просматривает категорию, получаем список ее товаров,вызывая метод уровня логики приложения GetProductsInCategory() */

if (isset ($this->_mCategoryId))

$this->mProducts = Catalog::GetProductsInCategory(

$this->_mCategoryId, $this->mPage, $this->mrTotalPages);

/* Если посетитель просматривает отдел, получаем список его товаров,вызывая метод уровня логики приложения GetProductsOnDepartment() */

elseif (isset ($this->_mDepartmentId))

$this->mProducts = Catalog::GetProductsOnDepartment(

$this->_mDepartmentId, $this->mPage, $this->mrTotalPages); /* Еслипосетительпросматриваетпервуюстраницу, получаемсписоктоваров,вызываяметодуровнялогикиприложения GetProductsOnCatalog() */

else

$this->mProducts = Catalog::GetProductsOnCatalog(

$this->mPage, $this->mrTotalPages);

/* Если список товаров разбит на несколько страниц, отображаем

навигационные элементы управления */

if ($this->mrTotalPages> 1)

{

// Создаемссылку Next

if ($this->mPage < $this->mrTotalPages)

{

if (isset($_GET['SearchResults']))

$this->mLinkToNextPage =

Link::ToSearchResults($this->mSearchString, $this->mAllWords,$this->mPage + 1);

elseif (isset($this->_mCategoryId))

$this->mLinkToNextPage =

Link::ToCategory($this->_mDepartmentId, $this->_mCategoryId,$this->mPage + 1);

elseif (isset($this->_mDepartmentId))

$this->mLinkToNextPage =

Link::ToDepartment($this->_mDepartmentId, $this->mPage + 1);

else

$this->mLinkToNextPage = Link::ToIndex($this->mPage + 1);

}

// Создаемссылку Previous

if ($this->mPage > 1)

{

if (isset($_GET['SearchResults']))

$this->mLinkToPreviousPage =

Link::ToSearchResults($this->mSearchString, $this->mAllWords, $this->mPage - 1);

if (isset($this->_mCategoryId))

$this->mLinkToPreviousPage =

Link::ToCategory($this->_mDepartmentId, $this->_mCategoryId,$this->mPage - 1);

elseif (isset($this->_mDepartmentId))

$this->mLinkToPreviousPage =

Link::ToDepartment($this->_mDepartmentId, $this->mPage - 1);

else

$this->mLinkToPreviousPage = Link::ToIndex($this->mPage - 1);

}

if ($this->mPage > $this->mrTotalPages && !empty($this->mrTotalPages))

{

ob_clean();

include '404.php';

flush();

ob_flush();

ob_end_clean();

exit();

}

}

// Генерируемссылкинастраницытоваров

for ($i = 0; $i < count($this->mProducts); $i++)

{

$this->mProducts[$i]['link_to_product'] =

Link::ToProduct($this->mProducts[$i]['product_id']);

if ($this->mProducts[$i]['thumbnail'])

$this->mProducts[$i]['thumbnail'] =

Link::Build('product_images/' .


Подобные документы

  • 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-файлы представлены только в архивах.
Рекомендуем скачать работу.