Четвёртая статья цикла "Пишем скрипт Каталог товаров": Back_Office: работа с товаром.
Сегодня мы научим нашу программу работать с товаром.
Для этого в начале нужно сделать таблицу в базе данных.
Импортируем следующий код:
CREATE TABLE 'item' (
'id' int(11) NOT NULL auto_increment,
'id_category' int(11) NOT NULL default '0',
'title' varchar(255) NOT NULL default '',
'description' text NOT NULL,
'price' int(11) NOT NULL default '0',
'hits' int(11) NOT NULL default '0',
'money_type' enum('D','E','R','G') NOT NULL default 'R',
'print_to_index' enum('yes','no') NOT NULL default 'yes',
PRIMARY KEY ('id')
) ENGINE=MyISAM DEFAULT CHARSET=cp1251 PACK_KEYS=0 CHECKSUM=1 AUTO_INCREMENT=1 ;
И пропишем правила для ЧПУ в файле
.htaccess:
### работа с товаром каталога ###
RewriteRule ^admin/cat/([0-9]+)/?$ sadmin.php?action=cat&id_cat=$1
RewriteRule ^admin/cat/add_item/?$ sadmin.php?action=cat&op=add_item
RewriteRule ^admin/cat/([0-9]+)/page/([0-9]+)/?$ sadmin.php?action=cat&id_cat=$1&page=$2
RewriteRule ^admin/cat/([0-9]+)/([0-9]+)/edit_item/?$ sadmin.php?action=cat&id_cat=$1&id_item=$2&op=edit_item
RewriteRule ^admin/cat/([0-9]+)/([0-9]+)/drop_item/?$ sadmin.php?action=cat&id_cat=$1&id_item=$2&op=drop_item
На этом этапе у нас появляются новые функции, предназначенные для постраничной навигации, код которых необходимо поместить в наш файл
func.php:
function page_list ($page, $num, $count_on_page)
{
if (!isset($page) && intval($page) == 0) $page = 1;
$count_pages = intval($num / $count_on_page);
$ostatok = $num % $count_on_page;
if($ostatok > 0) $count_pages++;
$start = $count_on_page * $page - $count_on_page;
return $start;
}
function show_page_list ($page, $num, $count_on_page, $id_cat, $path_to_page)
{
echo "<table align=center><tr><td class=\"y b\">";
if (!isset($page) && intval($page) == 0) $page = 1;
$count_pages = intval($num / $count_on_page);
$ostatok = $num % $count_on_page;
if($ostatok > 0) $count_pages++;
if ($page>1) echo " <a href = \"http://". $_SERVER['HTTP_HOST'] ."/$path_to_page/$id_cat/page/".($page - 1)."/\" title = \"Предыдущая страница\"><<</a> ";
$diapazon = 1;
$page_from = $page - $diapazon;
if($page_from < 1) $page_from = 1;
$page_to = $page + $diapazon;
if($page_to > $count_pages) $page_to = $count_pages;
for ($i = $page_from; $i <= $page_to; $i++)
{
if ($i == $page) echo " [$i] ";
else echo "<a href=\"http://".$_SERVER['HTTP_HOST']."/$path_to_page/$id_cat/page/$i/\" title = \"$i страница\">[$i]</a>";
}
if ($page<$count_pages) echo " <a href = \"http://". $_SERVER['HTTP_HOST'] ."/$path_to_page/$id_cat/page/".($page + 1)."/\" title = \"Следующая страница\">>></a> ";
echo "</td></tr></table>";
}
function show_page_list_index ($page, $num, $count_on_page, $path_to_page)
{
echo "<table align=center><tr><td class=\"y b\">";
if (!isset($page) && intval($page) == 0) $page = 1;
$count_pages = intval($num / $count_on_page);
$ostatok = $num % $count_on_page;
if($ostatok > 0) $count_pages++;
if ($page>1) echo " <a href = \"http://". $_SERVER['HTTP_HOST'] ."/$path_to_page/page/".($page - 1)."/\" title = \"Предыдущая страница\"><<</a> ";
$diapazon = 1;
$page_from = $page - $diapazon;
if($page_from < 1) $page_from = 1;
$page_to = $page + $diapazon;
if($page_to > $count_pages) $page_to = $count_pages;
for ($i = $page_from; $i <= $page_to; $i++)
{
if ($i == $page) echo " [$i] ";
else echo "<a href =\"http://". $_SERVER['HTTP_HOST'] ."/$path_to_page/page/$i/\" title = \" $i страница \">[$i]</a>";
}
if ($page<$count_pages) echo " <a href = \"http://". $_SERVER['HTTP_HOST'] ."/$path_to_page/page/".($page + 1)."/\" title = \"Следующая страница\">>></a> ";
echo "</td></tr></table>";
}
И появляется новые переменные, значения которых будут влиять на количество товаров, выводимых на одну страницу в категории нашей Административной панели, тип и порядок сортировки.
Это следует добавить в файл
config.php:
// Количество товаров, выводимых в админ-панели на одной странице
$COUNT_SHOW_ITEMS_IN_ADMINPAGE = 5;
// Поля для сортировки: id - по номеру; title - по названию; price - по цене; hits - по популярности
$SORT_FIELD_ITEMS_IN_ADMINPAGE = "id";
// Сортировка товаров по возрастанию - ASC, наоборот - DESC
$DESC_ASC_ITEMS_IN_ADMINPAGE = "DESC";
Такс, а теперь собственно код, отвечающий за работу с товаром в нашем каталоге:
############### БЛОК ДОБАВЛЕНИЯ ТОВАРОВ ###############
elseif (@$_GET['op'] == "add_item")
{
if (@$_POST['title']) // если POST массив не пуст
{
// преобразовываем зарезервированные в HTML символы
// и устанавливаем тип переменных в числа
$id_category = intval ($_POST['id_category']);
$price = intval ($_POST['price']);
$title = htmlspecialchars ($_POST['title']);
$description = htmlspecialchars ($_POST['description']);
// Проверим наличие стоимости
if (!$price) die ("<br /><br /><center><strong>
Введите нормальную стоимость!</strong></center>");
// экранируем
if (!get_magic_quotes_gpc())
{
$title = mysql_escape_string($title);
$description = mysql_escape_string($description);
}
else
{
$title = str_replace("'","'",$title);
$description = str_replace("'","'",$description);
}
// вставляем данные в БД
$query = mysql_query("
INSERT item
SET id_category = '$id_category',
title = '$title',
description = '$description',
price = '$price',
money_type = '".$_POST['money_type']."',
print_to_index = '".$_POST['print_to_index']."'
");
// если удачно, то...
if($query) echo "<center><strong>Товар добавлен</strong></center>";
// если не удачно, то
else echo "<center><strong>Ошибка при добавлении товара</strong></center>";
}
// иначе выводим форму для заполнения
else
{
echo "<table align=center cellspacing=2 cellpadding=2 border=0>
<tr><td align=right><FORM METHOD=POST
ACTION=\"http://".$_SERVER['HTTP_HOST']."/admin/cat/add_item/\">
Название: <input type=text maxlength=250 name=title><br /><br />
Описание: <textarea name=description></textarea><br /><br />
Выберите категорию: <select name=id_category>";
// ф-ия обхода дерева категорий
function subcategory($id, $sub)
{
$categories = mysql_query("SELECT * FROM category WHERE root_cat = $id");
while($category = mysql_fetch_array($categories))
{
for($i = 0; $i < $sub; $i++) echo "";
echo "<option value=\"".$category['cat_id']."\">
".$category['name_cat']." ";
subcategory($category['cat_id'], $sub+1);
}
}
$categories = mysql_query("SELECT * FROM category WHERE root_cat = 0");
while($category = mysql_fetch_array($categories))
{
$sub = 1;
echo "<option value=\"".$category['cat_id']."\">
".$category['name_cat']."<br>";
subcategory($category['cat_id'], $sub);
}
echo "</select><br /><br />
Стоимость: <input type=text maxlength=9 name=price><br /><br />
Вид валюты: <select name=money_type>
<option value=\"R\" selected>Рубли</option>
<option value=\"D\">Доллары США</option>
<option value=\"E\">Евро</option>
<option value=\"G\">Гривны</option>
</select><br /><br />
Показывать на главной странице? <select name=print_to_index>
<option value=\"yes\" selected>Да, показывать</option>
<option value=\"no\">Нет</option>
</select><br /><br />
<input type=submit value=Добавить наименование товара>
</form></td></tr></table>";
}
}
############### КОНЕЦ БЛОКА ДОБАВЛЕНИЯ ТОВАРОВ ###############
############### БЛОК УДАЛЕНИЯ ТОВАРОВ ###############
elseif (@$_GET['op'] == "drop_item")
{
// делаем запрос на удаление
$delete = mysql_query("DELETE FROM item
WHERE id = '".$_GET['id_item']."' LIMIT 1");
//если успешно, то...
if ($delete) echo "<center><strong>
Наименование успешно удалено</strong></center>";
//иначе...
else echo "<center><strong>
Не удалось удалить наименование!</strong></center>";
}
############### КОНЕЦ БЛОКА УДАЛЕНИЯ ТОВАРОВ ###############
############### БЛОК РЕДАКТИРОВАНИЯ ТОВАРОВ ###############
elseif (@$_GET['op'] == "edit_item")
{
if (@$_POST['title']) // если POST массив не пуст
{
// преобразовываем зарезервированные в HTML символы
// и устанавливаем тип переменных в числа
$id_category = intval ($_POST['id_category']);
$price = intval ($_POST['price']);
$title = htmlspecialchars ($_POST['title']);
$description = htmlspecialchars ($_POST['description']);
// Проверим наличие стоимости
if (!$price) die ("<br /><br /><center><strong>
Введите нормальную стоимость!</strong></center>");
// экранируем
if (!get_magic_quotes_gpc())
{
$title = mysql_escape_string($title);
$description = mysql_escape_string($description);
}
else
{
$title = str_replace("'","'",$title);
$description = str_replace("'","'",$description);
}
// обновляем данные в БД
$query = mysql_query("
UPDATE item
SET id_category = '$id_category',
title = '$title',
description = '$description',
price = '$price',
money_type = '".$_POST['money_type']."',
print_to_index = '".$_POST['print_to_index']."'
WHERE id = '".$_GET['id_item']."'
LIMIT 1
");
// если удачно, то...
if($query) echo "<center><strong>
Товар изменен</strong></center>";
// если не удачно, то
else echo "<center><strong>
Ошибка при изменении товара</strong></center>";
}
// иначе выводим форму для заполнения
else
{
// достаем данные для этого товара
$query_edit = mysql_query ("SELECT * FROM item
WHERE id = '".$_GET['id_item']."'");
if (mysql_num_rows ($query_edit))
{
// лепим ассоциативный массив
$items = mysql_fetch_assoc ($query_edit);
// выводим форму
echo "<table align=center cellspacing=2 cellpadding=2 border=0>
<tr><td align=right><FORM METHOD=POST
ACTION=\"http://".$_SERVER['HTTP_HOST']."/admin/cat/".$items['id_category']."/".$items['id']."/edit_item/\">
Название:
<input type=text maxlength=250 name=title value=\"".$items['title']."\">
<br /><br />
Описание:
<textarea name=description>".$items['description']."
</textarea><br /><br />
Выберите категорию: <select name=id_category>";
// ф-ия обхода дерева категорий
function subcategory($id, $sub)
{
$categories = mysql_query("SELECT * FROM category
WHERE root_cat = $id");
while($category = mysql_fetch_array($categories))
{
for($i = 0; $i < $sub; $i++) echo "";
echo "<option value=".$category['cat_id']."
".( $category['cat_id'] == $_GET['id_cat'] ? " selected " : "" ).">
".$category['name_cat'];
subcategory($category['cat_id'], $sub+1);
}
}
$categories = mysql_query("SELECT * FROM category
WHERE root_cat = 0");
while($category = mysql_fetch_array($categories))
{
$sub = 1;
echo "<option value=".$category['cat_id']."
".( $category['cat_id'] == $_GET['id_cat'] ? " selected " : "" ).">
".$category['name_cat'];
subcategory($category['cat_id'], $sub);
}
echo "</select><br /><br />
Стоимость:
<input type=text maxlength=9 name=price value=\"".$items['price']."\">
<br /><br />
Вид валюты: <select name=money_type>
<option value=R".($items['money_type']=="R"?" selected":"").">Рубли
<option value=D".($items['money_type']=="D"?" selected":"").">Доллары США
<option value=E".($items['money_type']=="E"?" selected":"").">Евро
<option value=G".($items['money_type']=="G"?" selected":"").">Гривны
</select><br /><br />
Показывать на главной странице? <select name=print_to_index>
<option value=yes".($items['print_to_index']=="yes"?" selected":"").">
Да, показывать</option>
<option value=no".($items['print_to_index']=="no"?" selected":"").">Нет</option>
</select><br /><br />
<input type=submit value=Изменить наименование товара>
</form></td></tr></table>";
}
}
}
############### КОНЕЦ БЛОКА РЕДАКТИРОВАНИЯ ТОВАРОВ ###############
############### БЛОК ВЫВОДА ТОВАРОВ КАКОЙ-ЛИБО ИЗ КАТЕГОРИЙ ###############
elseif (!@$_GET['op'] && intval(@$_GET['id_cat']) > 0 && !@$_GET['id_item'])
{
// запрашиваем все товары для нужной категории
$query = mysql_query("SELECT * FROM item as A,
category as B
WHERE A.id_category = B.cat_id AND
A.id_category = ".$_GET['id_cat']."
ORDER by A.id DESC");
// узнаем количество товаров в этой категории
$num = mysql_num_rows ($query);
echo "<strong><center>Количество товаров в данной категории:
".$num."</strong></center><br><br>";
// используем ф-ию для постраничной навигации
@$start = page_list ($_GET['page'], $num, $COUNT_SHOW_ITEMS_IN_ADMINPAGE);
// запрашиваем товары, но уже зная, с какого товара выводить,
// сколько штук на странице,
// и как их сортировать
$query2 = mysql_query("SELECT * FROM item as A,
category as B
WHERE A.id_category = B.cat_id AND
A.id_category = ".$_GET['id_cat']."
ORDER by $SORT_FIELD_ITEMS_IN_ADMINPAGE $DESC_ASC_ITEMS_IN_ADMINPAGE
LIMIT $start, $COUNT_SHOW_ITEMS_IN_ADMINPAGE");
echo "<table cellpadding=10 cellspacing=5 align=center>";
// лепим массив в цикле
while($list = mysql_fetch_assoc($query2))
{
// узнаем, какую валюту печатать на странице у каждого товара
if ($list['money_type'] == "D") $money_type = "$";
elseif ($list['money_type'] == "E") $money_type = "€";
elseif ($list['money_type'] == "G") $money_type = "гривен";
else $money_type = "руб.";
//
if ($list['print_to_index'] == "yes")
$print_to_index = "выводится";
else $print_to_index = "<strong>не</strong> выводится";
// выводим данные
echo "<tr bgcolor=#EFEFEF valign=top><td>
<a href=\"http://".$_SERVER['HTTP_HOST']."/cat/".$list['id_category']."/".$list['id']."/\">
".$list['title']."</a></td>";
$list['description'] = substr($list['description'], 0, 100);
echo "<td>".nl2br($list['description'])."...</td>";
echo "<td>Цена: ".$list['price']." ".$money_type."</td>";
echo "<td>Просмотров: ".$list['hits']."</td>";
echo "<td>На главной ".$print_to_index."</td>";
echo "<td><a href=\"http://".$_SERVER['HTTP_HOST']."/admin/cat/".$list['id_category']."/".$list['id']."/edit_item/\">
Редактировать</a></td>";
echo "<td><a href=\"http://".$_SERVER['HTTP_HOST']."/admin/cat/".$list['id_category']."/".$list['id']."/drop_item/\">
Удалить</a></td></tr>";
}
echo "</table>";
// выводим постраничную навигацию
$path_to_page = "admin/cat";
@show_page_list($_GET['page'], $num, $COUNT_SHOW_ITEMS_IN_ADMINPAGE, $_GET['id_cat'], $path_to_page);
echo "<br /><br /><center>
<a href=\"http://".$_SERVER['HTTP_HOST']."/admin/cat/add_item/\"> Добавить товар </a>
</center>";
}
############### КОНЕЦ БЛОКА ВЫВОДА ТОВАРОВ КАКОЙ-ЛИБО ИЗ КАТЕГОРИЙ ###############
Открываем файл scat.php и ищем в нём такие строки:
############### КОНЕЦ БЛОКА СОЗДАНИЯ КАТЕГОРИЙ ###############
############### ВЫВОД КАТЕГОРИЙ ###############
и между них вставляем этот код.
Теперь работа над кодом по операциям с товаром в нашем Бэк_Офисе закончена. В следующей статье мы примемся за разработку Фронт-Офиса, вывод нужных товаров на главной странице, вывод списка наших категорий и количества товаров в каждой категории.
Напоминаю, что возникшие вопросы по данному циклу статей Вы можете опубликовать на
форуме. А я в свою очередь попробую Вам на них ответить.
Кстати код, который получится в итоге этого цикла статей лёг в основу скрипта JOKER_vitrina 1.0 FREE, описание которого и ссылки для скачивания Вы найдете на странице
http://allpublication.ru/blog/p15-novyy_besplatnyy_PHP_skript_katalog_tovarov_JOKER_vitrina_1_0_FREE.html
ОГРОМНОЕ спасибо!