Все ленты — последние статьи

Каталог товаров

Каталог товаров

Итак, каталог продукции некоторой фирмы. Для хранения информации о товарах и категориях используем две таблицы: categories и products. Категория может содержать вложенные категории и/или товары. Проводя аналогию с файловой системой, директория может содержать вложенные директории и/или файлы. Каждый элемент таблиц categories и products содержит ссылку на родительский элемент — parent.

 

Таблица categories:
id_ctg — уникальный идентификатор категории
parent — ссылка на родительский элемент
title — название категории
sortorder — порядок сортировки

Таблица products:
id_prd — уникальный идентификатор товарной позиции
parent — ссылка на родительский элемент
title — наименование товарной позиции
description — описание товара
sortorder — порядок сортировки

Таблица categories:
1;0;Извещатели охранные;1
2;0;Извещатели пожарные;2
3;0;Приборы приемно-контрольные;3
6;1;Извещатели охранные магнитоконтактные;1
7;1;Извещатели охранные электроконтактные;2
8;1;Извещатели охранные ударноконтактные;3
9;2;Извещатели пожарные тепловые;1
10;2;Извещатели пожарные дымовые;2
11;2;Извещатели пожарные комбинированные;3
17;3;Приборы приемно-контрольные охранные;1
18;3;Приборы приемно-контрольные пожарные;2
19;3;Приборы приемно-контрольные охранно-пожарные;3

Таблица products:
1;6;Извещатель охранный магнитоконтактный ИО 102-2;Технические характеристики ИО 102-2;1
2;6;Извещатель охранный магнитоконтактный ИО 102-4;Технические характеристики ИО 102-4;2
3;6;Извещатель охранный магнитоконтактный ИО 102-14;Технические характеристики ИО 102-14;3
4;7;Извещатель охранный электроконтактный ИО 201-1;Технические характеристики ИО 201-1;1
5;7;Извещатель охранный электроконтактный ВПК 2112;Технические характеристики ВПК 2112;2
6;8;Извещатель охранный ударноконтактный "Окно-4";Технические характеристики "Окно-4";1
7;8;Извещатель охранный ударноконтактный "Окно-5";Технические характеристики "Окно-5";2
8;8;Извещатель охранный ударноконтактный "Окно-6";Технические характеристики "Окно-6";3
9;9;Извещатель пожарный тепловой ИП 114-01;Технические характеристики ИП 114-01;1
10;9;Извещатель пожарный тепловой ИП 101-1A;Технические характеристики ИП 101-1A;2
11;9;Извещатель пожарный тепловой ИП 101-30;Технические характеристики ИП 101-30;3
12;10;Извещатель пожарный дымовой ИП 212-3СМ;Технические характеристики ИП 212-3СМ;1
13;10;Извещатель пожарный дымовой ИП 212-18СИ;Технические характеристики ИП 212-18СИ;2
14;11;Извещатель пожарный комбинированный ИП 212/101-78-А1;Технические характеристики ИП 212/101-78-А1;1
15;11;Извещатель пожарный комбинированный ИП 212/101-18 А3R1;Технические характеристики ИП 212/101-18 А3R1;2
и т.д.

Скрипт каталога товаров:
<?php
$dblocation = "localhost"; // Имя сервера
$dbuser = "root"; // Имя пользователя
$dbpswrd = ""; // Пароль
$dbname = "catalog"; // Имя базы данных

// Соединение с сервером базы данных
$dblink = mysql_connect( $dblocation, $dbuser, $dbpswrd );
mysql_query( 'SET NAMES cp1251' );
// Выбираем базу данных
mysql_select_db( $dbname, $dblink );

if ( isset( $_GET['action'] ) ) {
$action = $_GET['action'];
$actions = array( 'showctg', 'showprd' );
if ( !in_array($action, $actions) ) $action = 'showctg';
} else {
$action = 'showctg';
}

if ( isset( $_GET['id_ctg'] ) ) {
$id_ctg = (int)$_GET['id_ctg'];
if ( $id_ctg < 0 ) $id_ctg = 0;
} else {
$id_ctg = 0;
}

if ( isset( $_GET['id_prd'] ) ) {
$id_prd = (int)$_GET['id_prd'];
if ( $id_prd < 0 ) $id_prd = 0;
} else {
$id_prd = 0;
}

?>
<html>
<head>
<title>Каталог товаров</title>
</head>
<body>
<table border="1" cellpadding="4" cellspacing="0">
<tr><td colspan="2"><h1>Логотип компании</h1></td></tr>
<tr valign="top">
<td width="30%">
<?php
// В левой части страницы выводим меню каталога
// Сначала получаем путь до выбранной категории
$path = category_path( $id_ctg );
$out = process_categories(0, $path, $id_ctg);
// Выводим меню каталога
foreach ( $out as $ctg )
{
// Делаем небольшой отступ слева — чтобы выводить категории "ступенькой":
// чем больше уровено вложенности, тем болше отступ
echo '<div style="margin-left:'.($ctg[2]*20).'px">';
if ( $id_ctg == $ctg[0] )
echo '<a href="'.$_SERVER['PHP_SELF'].'?action=showctg&id_ctg='.$ctg[0].'" style="font-weight:bold">'.$ctg[1].'</a>';
else
echo '<a href="'.$_SERVER['PHP_SELF'].'?action=showctg&id_ctg='.$ctg[0].'">'.$ctg[1].'</a>';
echo '</div>';
}
?>
</td>
<td width="70%">

</td>
</tr>
<tr><td colspan="2" align="right">Copyright</td></tr>
</table>
</body>
</html>

<?php
// Функция возвращает список подкатегорий и товаров выбраной категории $id_ctg
function get_category( $id_ctg )
{
if ( $id_ctg != 0 ) {
// Получаем из БД название категории
$query = 'SELECT title FROM categories WHERE id_ctg='.$id_ctg;
$res = mysql_query( $query );
// если такая категория не найдена
if ( mysql_num_rows( $res ) > 0 ) {
echo '<h2>'.mysql_result( $res, 0, 0 ).'</h2>';
} else {
$id_ctg = 0;
echo '<h2>Каталог</h2>'."n";
}
} else {
echo '<h2>Каталог</h2>'."n";
}

// Получаем данные о всех подкатегориях текущей категории
$query = 'SELECT id_ctg, title FROM categories WHERE parent='.$id_ctg.' ORDER BY sortorder';
$res = mysql_query( $query );
if ( mysql_num_rows( $res ) > 0 ) {
echo '<ul>';
while( $ctg = mysql_fetch_array( $res ) ) {
echo '<li><a href="'.$_SERVER['PHP_SELF'].'?action=showctg&id_ctg='.$ctg['id_ctg'].'">'.$ctg['title'].'</a></li>';
}
echo '</ul>';
}

// Получаем данные о всех товарах текущей категории
$query = 'SELECT id_prd, title FROM products WHERE parent='.$id_ctg.' ORDER BY sortorder';
$res = mysql_query( $query );
if ( mysql_num_rows( $res ) > 0 ) {
echo '<ul>';
while( $prd = mysql_fetch_array( $res ) ) {
echo '<li><a href="'.$_SERVER['PHP_SELF'].'?action=showprd&id_ctg='.$id_ctg.'&id_prd='.$prd['id_prd'].'">'.$prd['title'].'</a></li>';
}
echo '</ul>';
} else {
echo '<p>Нет товаров в этой категории</p>';
}
}

// Просмотр подробной информации о товаре (карточка товара)
function get_product( $id_prd )
{
$query = "SELECT title, description FROM products WHERE id_prd=".$id_prd;
$res = mysql_query( $query );
if ( mysql_num_rows( $res ) == 1 ) {
$prd = mysql_fetch_array( $res );
// Выводим подробную информацию о товаре
echo '<h2>'.$prd['title'].'</h2>';
echo '<div>'.$prd['description'].'</div>';
} else {
echo '<p>Товар не найден</p>';
}
}

// Функция возвращает массив категорий с уровнями вложенности для построения
// навигационной панели слева
function process_categories($level, $path, $id_ctg)
{
// $level — текущий уровень: 0 для корня каталога, 1 для его подкатегорий, и т.д.
// $path — путь от корня каталога до выбранной категории
// $id_ctg — ID выбранной категории
$out = array();
$cnt = 0;
$query = "SELECT id_ctg, title FROM categories WHERE parent=".$path[$level]." ORDER BY sortorder";
$res = mysql_query( $query );
while ($row = mysql_fetch_row($res))
{
$out[$cnt][0] = $row[0]; // category ID
$out[$cnt][1] = $row[1]; // category name
$out[$cnt][2] = $level; // catagory level
$cnt++;

// получить подкатегории?
if ($level+1 < count($path) && $row[0] == $path[$level+1])
{
// рекурсивный вызов функции process_categories
$sub_out = process_categories($level+1, $path, $id_ctg);
//добавляем подкатегории в конец массива $out
for ($j=0; $j<count($sub_out); $j++)
{
$out[] = $sub_out[$j];
$cnt++;
}
}
}
return $out;
}

// Функция возвращает путь до текущей категории
// Возвращает массив $path, содержащий categoryID от корня до текущей категории
// $path[0]=0, $path[1]=5, $path[2]=$currentCategoryID
function category_path( $id_ctg )
{
// строим путь до категории (каталога)
$path[0] = $id_ctg;
$curr = $id_ctg;
while ($curr)
{
$res = mysql_query( 'SELECT parent FROM categories WHERE id_ctg='.$curr );
if ( mysql_num_rows( $res ) > 0 ) {
$row = mysql_fetch_row($res);
$curr = $row[0];
$path[] = $curr;
} else {
$curr = 0;
$path[0] = 0;
}
}
// теперь переворачиваем массив $path
$path = array_reverse($path);
return $path;
}
?>