01
Ноя

Пишем скрипт Каталог товаров на Php и MySql, Часть #3

Третья статья из цикла "Пишем скрипт Каталог товаров".
Сегодня мы научим Back_Office работать с категориями - создавать, редактировать и удалять.
Мы сделаем скрипт для управления категориями нашего каталога с неограниченной вложенностью.
Начнем с создания таблицы в базе данных:
CREATE TABLE 'category' (
  'cat_id' int(11) NOT NULL auto_increment,
  'root_cat' int(11) NOT NULL default '0',
  'name_cat' varchar(64) NOT NULL default '',
  'descr' varchar(255) NOT NULL default '',
  PRIMARY KEY  ('cat_id')
) ENGINE=MyISAM DEFAULT CHARSET=cp1251 AUTO_INCREMENT=1 ; 


Поясню назначение полей:
cat_id - ну это я думаю вам понятно - номер категории
root_cat - номер категории-родителя
name_cat - название
descr - описание

Теперь в наш Бэк_Офис нужно добавить ссылку, для управления категориями. Для этого открываем файл sadmin.php, ищем строку:
        echo "<td><a href=\"http://".$_SERVER['HTTP_HOST']."/administrator/\">На главную страницу Админ раздела</a></td>";


и после неё добавляем:
        echo "<td><a href=\"http://".$_SERVER['HTTP_HOST']."/admin/cat/\">Каталог</a></td>";


Теперь необходимо прописать правила для ссылок управления категориями. В конец файла .htaccess добавляем следующие строки:
### работа с категориями каталога ###  
RewriteRule ^admin/cat/?$ sadmin.php?action=cat  
RewriteRule ^admin/cat/([0-9]+)/edit_category/?$ sadmin.php?action=cat&op=edit_category&id_cat=$1 
RewriteRule ^admin/cat/([0-9]+)/drop_category/?$ sadmin.php?action=cat&op=drop_category&id_cat=$1 
RewriteRule ^admin/cat/add_category/?$ sadmin.php?action=cat&op=add_category 


После этого создадим директорию для файлов управления скриптом и назовем её стандартно - admin.
Теперь создаем файл с названием scat.php со следующим содержанием:
<? 
    ###############    УДАЛЕНИЕ КАТЕГОРИЙ    ###############     
if(@$_GET['op'] == "drop_category") 
{ 
    //удаляем категорию 
    $delete_category = mysql_query("DELETE FROM category
     WHERE cat_id = ". $_GET['id_cat']); 
    //удаляем подкатегории 
    $delete_subcategory_in_category = mysql_query("DELETE FROM category
     WHERE root_cat = ". $_GET['id_cat']); 
    //если успешно, то... 
    if ($delete_category) echo "<center><strong>
    Категория успешно удалена</strong></center>"; 
    else echo "<center><strong>
    Не удалось удалить категорию!</strong></center>"; 
} 
    ###############    КОНЕЦ БЛОКА УДАЛЕНИЯ КАТЕГОРИЙ    ###############     

    ###############    РЕДАКТИРОВАНИЕ КАТЕГОРИЙ    ###############     
elseif (@$_GET['op'] == "edit_category") 
{ 
    // если существует название 
    if(@$_POST['name_cat']) 
    { 
        // преобразовываем зарезервированные в HTML символы 
        $name_cat = htmlspecialchars($_POST['name_cat']); 
        $descr  = htmlspecialchars($_POST['descr']); 
        // экранируем кавычки 
        if (!get_magic_quotes_gpc()) 
        { 
             $name_cat = mysql_escape_string($name_cat); 
             $descr = mysql_escape_string($descr); 
        } 
        else 
        { 
            $name_cat = str_replace("'","'",$name_cat); 
            $descr = str_replace("'","'",$descr); 
        } 
        //  обновляем БД 
        $query = mysql_query(" 
        UPDATE category  
        SET root_cat = '".$_POST['id_category']."',  
        name_cat = '".$name_cat."',  
        descr = '".$descr."'  
        WHERE cat_id = '".$_GET['id_cat']."' 
        "); 
        // если успешно, то... 
        if ($query) echo "<center><strong>
        Обновление данных успешно завершено</strong></center>"; 
        else echo "<center><strong>
        Не удалось обновить данные</strong></center>"; 
    } 
    // иначе выводим форму с данными для редактирования 
    else 
    { 
        // достаем данные из БД 
        $query = mysql_query("SELECT * FROM category
         WHERE cat_id = '".$_GET['id_cat']."'"); 
        // лепим ассоциативный массив 
        $line = mysql_fetch_assoc($query); 
        echo "<table cellspacing=2 cellpadding=2 border=0 width=60%><tr><td> 
        <FORM METHOD=POST
         ACTION=\"http://".$_SERVER['HTTP_HOST']."/admin/cat/$id_cat/edit_category/\"> 
        Название:<br /><br />
        <input type=text size=130  name=name_cat value=\"".$line['name_cat']."\">
        <br /><br /> 
        Описание: 
        <input type=text size=120  name=descr value=\"".$line['descr']."\">
        <br /><br /> 
        Выберите категорию:<br /><br />
        <select name=id_category>"; 
        echo "<option value=0>--------  Корневая директория  -----
        </option>"; 
        // ф-ия обхода дерева категорий 
        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'] == @$line['root_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'] == @$line['root_cat'] ? " 
             selected " : "" )."> 
                 ".$category['name_cat']." "; 
            subcategory($category['cat_id'], $sub); 
        } 
        echo "</select><br /><br />
        <input type=submit value=Изменить></form></td></tr></table>"; 
    } 
} 
    ###############    КОНЕЦ БЛОКА РЕДАКТИРОВАНИЯ КАТЕГОРИЙ    ###############     

    ###############    СОЗДАНИЕ КАТЕГОРИЙ    ###############     
elseif (@$_GET['op'] == "add_category") 
{ 
    // если существует название 
    if(@$_POST['name_cat']) 
    { 
        // преобразовываем зарезервированные в HTML символы 
        $name_cat = htmlspecialchars($_POST['name_cat']); 
        $descr  = htmlspecialchars($_POST['descr']); 
        // экранируем кавычки 
        if (!get_magic_quotes_gpc()) 
        { 
             $name_cat = mysql_escape_string($name_cat); 
             $descr = mysql_escape_string($descr); 
        } 
        else 
        { 
            $name_cat = str_replace("'","'",$name_cat); 
            $descr = str_replace("'","'",$descr); 
        } 
        // вставляем данные в БД 
        $query = mysql_query(" 
        INSERT category  
        SET root_cat = '".$_POST['id_category']."',  
        name_cat = '".$name_cat."',  
        descr = '".$descr."' 
        "); 
        // если удачно, то... 
        if($query) echo "<center><strong>
        Категория добавлена</strong></center>"; 
        // если не удачно, то 
        else echo "<center><strong>
        Ошибка при добавлении категории</strong></center>"; 
    } 
    // иначе выводим форму для заполнения 
    else 
    { 
        echo "<table cellspacing=2 cellpadding=2 border=0 width=70%>
        <tr><td> 
        <FORM METHOD=POST
         ACTION=\"http://".$_SERVER['HTTP_HOST']."/admin/cat/add_category/\"> 
        Название: <input type=text size=120  name=name_cat><br /><br /> 
        Описание: <input type=text size=120  name=descr><br /><br /> 
        Выберите категорию: <select name=id_category>"; 
        // ф-ия обхода дерева категорий 
        echo "<option value=0>----------- Корневая директория -----------
        </option>"; 
        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=submit value=Добавить категорию>
        </form></td></tr></table>"; 
    } 
} 
    ###############    КОНЕЦ БЛОКА СОЗДАНИЯ КАТЕГОРИЙ    ###############     
    ###############    ВЫВОД КАТЕГОРИЙ    ###############     
else 
{ 
    echo "<br /><br /><br />"; 
    echo " <table border=0 width=90% align=center cellspacing=5 cellpadding=0>"; 
    // ф-ия обхода дерева категорий 
    function subcategory($id, $sub) 
    { 
        $categories = mysql_query("SELECT * FROM category
         WHERE root_cat = $id"); 
        while($category = mysql_fetch_array($categories))  
        {     
            echo "<tr bgcolor=#EEEEEE><td width=100%>"; 
            for($i = 0; $i < $sub; $i++) echo "&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;"; 
            echo "<strong>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;- 
            ".$category['name_cat']."</strong></td><td>
            <a href=\"http://".$_SERVER['HTTP_HOST']."/admin/cat/".$category['cat_id']."/\"> 
             Товары&nbsp;в&nbsp;данной&nbsp;категории</a></td><td> 
            <a href=\"http://".$_SERVER['HTTP_HOST']."/admin/cat/".$category['cat_id']."/edit_category/\"> 
             [Редактировать] </a></td> 
             <td><a href=\"http://".$_SERVER['HTTP_HOST']."/admin/cat/".$category['cat_id']."/drop_category/\"> 
              [Удалить] </a></td></tr>"; 
            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 "<tr bgcolor=#EFEFEF><td width=100%>
        <strong>".$category['name_cat']."</strong></td><td> 
         <a href=\"http://".$_SERVER['HTTP_HOST']."/admin/cat/".$category['cat_id']."/\"> 
         Товары&nbsp;в&nbsp;данной&nbsp;категории</a></td><td> 
        <a href=\"http://".$_SERVER['HTTP_HOST']."/admin/cat/".$category['cat_id']."/edit_category/\"> 
         [Редактировать] </a></td><td> 
         <a href=\"http://".$_SERVER['HTTP_HOST']."/admin/cat/".$category['cat_id']."/drop_category/\"> 
          [Удалить] </a></td></tr>"; 
        subcategory($category['cat_id'], $sub); 
    } 
    echo "</table><br /><br /><br /><br /><center> 
    <a href=\"http://".$_SERVER['HTTP_HOST']."/admin/cat/add_category/\">
     Добавить категорию </a> |  
    <a href=\"http://".$_SERVER['HTTP_HOST']."/admin/cat/add_item/\">
     Добавить наименование товара </a></center>"; 
} 
    ###############    КОНЕЦ ВЫВОДА КАТЕГОРИЙ    ###############     
?>


Теперь Вы можете протестировать работу с категориями.

Следующая статья расскажет нам, как добавить товар в нашу базу данных и как с ним работать.

Кстати код, который получится в итоге этого цикла статей лёг в основу скрипта JOKER_vitrina 1.0 FREE, описание которого и ссылки для скачивания Вы найдете на странице http://allpublication.ru/blog/p15-novyy_besplatnyy_PHP_skript_katalog_tovarov_JOKER_vitrina_1_0_FREE.html
 

Комментарии

Rss-лента комментариев к этому посту
1
ИгорьИгорь23.03.2011Почему-то при правильном вводе логина и пароля выдает ошибку:
Warning: Unknown: Your script possibly relies on a session side-effect which existed until PHP 4.2.3. Please be advised that the session extension does not consider global variables as a source of data, unless register_globals is enabled. You can disable this functionality and this warning by setting session.bug_compat_42 or session.bug_compat_warn to off, respectively in Unknown on line 0

Не подскажете в чем дело?
2
ДмитрийДмитрий28.07.2011Спасибо за сценарий! Не подскажете, как его в Codeigniter переписать? То есть мне нужно, чтобы в контроллере был код, а в отображении - вывод. Покажите, если не трудно, на примере вывода дерева категорий. Заранее благодарен!
3
СандроСандро29.07.2011Ссылка
http://".$_SERVER['HTTP_HOST']."/admin/cat

не срабатывает, в $_GET['action'], нет значения "cat", в чем проблема7
4
яя10.12.2011вот это я понимаю быдлокод=)
5
bjbj26.03.2012Здравствуйте! проблема в том, что когда нажимаю в админке "Каталог" или любую другую ссылку, меня выкдывает и появляется первая страничка входа и просит логин и пароль. как быть?
6
xaocbozzzxaocbozzz03.09.2012такая же фигня - выкидывает обратно на логин и пароль
7
ВладиславВладислав22.11.2012if(@$_POST['name_cat'])

чё за говно код?
8
ЕвгенийЕвгений08.05.2013
для Владислав: Ты бы как написал?
9
РоманРоман14.07.2013Еб. вы тугодумы деревенские, прочитайте заголовок статьи сначало, речь идет про категории а не авторизацию!!!
10
ВейсВейс25.02.2014Никогда не используйте собаку в коде.

Оставьте свой комментарий

Заменить картинку
жирный курсив цитата

С правилами ознакомлен
 

Правила публикования комментариев
1. Не информативные комментарии вида "Спасибо, замечательная статья", имеющие ссылку на сайт, скорее всего будут удалены.
2. В поле "сайт" указывается ссылка на главную страницу сайта для людей.
Владелец этого блога незамедлительно удалит спам в любом его проявлении.

 
Для комфортного доступа к этому сайту, в вашем браузере должен быть включен JavaScript