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