За последние 24 часа нас посетили 16687 программистов и 1679 роботов. Сейчас ищет 891 программист ...

Помогите достроить дерево категорий

Тема в разделе "Прочие вопросы по PHP", создана пользователем Alex_57_php, 9 мар 2014.

  1. Alex_57_php

    Alex_57_php Новичок

    С нами с:
    9 мар 2014
    Сообщения:
    4
    Симпатии:
    0
    Всем привет!
    Есть таблица
    id | parent_id | name
    1848 | 0 | Все для мужчин
    1849 | 1848 | Аксессуары и Сумки
    1850 | 1849 | Сумки
    1851 | 1850 | Сумки через плечо
    1852 | 1850 | Сумки для ноутбука
    1853 | 1850 | Спортивные сумки
    1854 | 1850 | Рюкзаки
    1855 | 1850 | Кожаные сумки
    1856 | 1850 | Дорожные сумки
    1857 | 1849 | Аксессуары
    1858 | 1857 | Ювелирные украшения
    1859 | 1857 | Шарфы
    1860 | 1857 | Чехлы для мобильного телефона
    1861 | 1857 | Часы
    1862 | 1857 | Ремни
    1863 | 1857 | Перчатки
    1864 | 1857 | Очки
    1865 | 1857 | Кошельки, обложки для документов
    1866 | 1857 | Зонты
    1867 | 1857 | Запонки
    1868 | 1857 | Зажигалки
    1869 | 1857 | Галстуки
    1870 | 1857 | Браслеты
    1871 | 1857 | Бижутерия
    1872 | 1848 | Мужская одежда
    1873 | 1872 | Шорты
    1874 | 1873 | Бермуды
    1875 | 1873 | Спортивные
    1876 | 1872 | Футболки и поло
    1877 | 1876 | Футболки
    1878 | 1876 | Спортивные
    1879 | 1876 | Майки
    1880 | 1876 | Поло
    1881 | 1872 | Толстовки
    1882 | 1872 | Свитера, пуловеры
    1883 | 1872 | Рубашки
    1884 | 1872 | Пиджаки
    1885 | 1884 | Пиджаки в стиле casual
    1886 | 1884 | Классические пиджаки
    1887 | 1872 | Жакеты
    1888 | 1872 | Кофты и Кардиганы
    1889 | 1872 | Костюмы
    1890 | 1889 | Спортивные костюмы
    1891 | 1889 | Классические костюмы
    1892 | 1872 | Жилеты
    1893 | 1892 | Меховые
    1894 | 1892 | Классические
    1895 | 1892 | Кожанные
    1896 | 1892 | Дутые и стеганые
    1897 | 1892 | Джинсовые
    1898 | 1892 | В стиле casual
    1899 | 1872 | Джинсы
    1900 | 1899 | Прямой покрой
    1901 | 1899 | Зауженные
    1902 | 1872 | Головные уборы
    1903 | 1902 | Шляпы
    1904 | 1902 | Шапки
    1905 | 1902 | Панамы
    1906 | 1902 | Бейсболки, Кепки
    1907 | 1872 | Верхняя одежда
    1908 | 1907 | Пуховики
    1909 | 1907 | Пальто
    1910 | 1907 | Дубленка
    1911 | 1907 | Куртки
    1912 | 1907 | Вязанные кофты
    1913 | 1872 | Брюки
    1914 | 1913 | Спортивные
    1915 | 1913 | Повседневные
    1916 | 1913 | Классические
    1917 | 1872 | Белье и Пляжная мода
    1918 | 1917 | Трусы
    1919 | 1917 | Термобелье
    1920 | 1917 | Плавки
    1921 | 1917 | Носки
    1922 | 1917 | Майки
    1923 | 1848 | Обувь
    1924 | 1923 | Шлепанцы
    1925 | 1923 | Угги
    1926 | 1923 | Туфли
    1927 | 1923 | Тапочки
    1928 | 1923 | Сланцы
    1929 | 1923 | Сапоги
    1930 | 1923 | Сандали
    1931 | 1923 | Резиновые сапоги
    1932 | 1923 | Полуботинки
    1933 | 1923 | Мокасины
    1934 | 1923 | Кроссовки
    1935 | 1923 | Кеды
    1936 | 1923 | Галоши
    1937 | 1923 | Ботинки

    Есть скрипт который рекурсивно выводит категории в виде дерева

    Код (Text):
    1.  
    2. $cat_p = filter_input_var($_GET['cprod']);
    3.  
    4. //Выбираем данные из БД
    5. $result=do_query("SELECT * FROM  tovars_categories");
    6. //Если в базе данных есть записи, формируем массив
    7. if   (mysql_num_rows($result) > 0){
    8.     $cats = array();
    9. //В цикле формируем массив разделов, ключом будет id родительской категории, а также массив разделов, ключом будет id категории
    10.     while($cat =  mysql_fetch_assoc($result)){
    11.         $cats_ID[$cat['id']][] = $cat;
    12.         $cats[$cat['parent_id']][$cat['id']] =  $cat;
    13.     }
    14. }
    15. // echo '<pre>';
    16. // print_r($cats);
    17. // echo '</pre>';
    18.  
    19. function build_tree($cats,$parent_id,$only_parent = false){
    20.     if(is_array($cats) and isset($cats[$parent_id])){
    21.    
    22.      
    23.        
    24.         if($only_parent==false){
    25.         $tree = '<ul>';
    26.             foreach($cats[$parent_id] as $cat){  
    27.                 $tree .= '<li class="custom_id'.$cat['id'].'"><a class="" href="/?cprod='.$cat['id'].'">'.$cat['name'].'</a><span class="down"></span>';
    28.                 $tree .=  build_tree($cats,$cat['id']);
    29.                 $tree .= '</li>';
    30.                  }
    31.         $tree .= '</ul>';
    32.         }elseif(is_numeric($only_parent)){
    33.             $cat = $cats[$parent_id][$only_parent];
    34.             $tree = '<li class="custom_id'.$cat['id'].'"><a class="" href="/?cprod='.$cat['id'].'">'.$cat['name'].'</a><span class="down"></span>';
    35.             $tree .=  build_tree($cats,$cat['id']);
    36.             $tree .= '</li>';
    37.         }
    38.        
    39.     }
    40.     else return null;
    41.     return $tree;
    42. }
    43.  
    44. function find_parent ($tmp, $cur_id){
    45.     if($tmp[$cur_id][0]['parent_id']!=0){
    46.         return find_parent($tmp,$tmp[$cur_id][0]['parent_id']);
    47.     }
    48.     return (int)$tmp[$cur_id][0]['id'];
    49. }
    Вот так вывожу в темплейте
    Код (Text):
    1.  
    2.  <div class="box">
    3.           <div class="box-heading">Категории</div>
    4.           <div class="box-content box-category">
    5.             <ul id="cat_accordion">
    6.            
    7.  <?  echo build_tree($cats,0,find_parent($cats_ID,$cat_p)); ?>
    8.  </ul>
    9.           </div>
    10.         </div>
    Скрипт не мой брал на просторах(немного лишь подправил)

    Собственно все нормально работает, за исключением некоторых моментов, которые я не могу победить вторые сутки, поэтому прошу помощи у вас, господа профессионалы

    Момент первый (просьба о помощи)

    Определить что пользователь находится в текущей категории и добавить класс CSS для элемента <a>
    Иначе говоря если GET совпадает с ID категории, нужно добавить класс

    Я пробовал так:

    Код (Text):
    1. if($cat_p == $cat['id']){
    2.        $active = 'active';
    3.        }else{
    4.        $active = '';
    5.        }
    Код (Text):
    1. $tree .= '<li class="custom_id'.$cat['id'].'"><a class="'.$active.'" href="/?cprod='.$cat['id'].'">'.$cat['name'].'</a><span class="down"></span>';
    Но не получается, пробовал еще вариантов 5, та же фигня, моск кипит

    Момент второй и снова прошу о помощи

    Как не выводить самую главную категорию у которой parent_id равен нулю?

    пробовал что-то типа этого

    Код (Text):
    1.  
    2.  
    3. if($cat['parent_id'] != 0){
    4.  
    5. }
    не фига не выходит

    Как выводит сейчас:

    +Все для мужчин
    +-Аксессуары и Сумки
    +---Подкатегория
    +---Подкатегория
    +---Подкатегория
    +-Мужская одежда
    +---Подкатегория
    +---Подкатегория
    +---Подкатегория
    +-Обувь
    +---Подкатегория
    +---Подкатегория
    +---Подкатегория

    Что я хочу сделать, при нахождении в любой подкатегории раздела "для мужчин"

    +Аксессуары и Сумки
    +---Подкатегория
    +---Подкатегория
    +---Подкатегория
    +Мужская одежда
    +---Подкатегория
    +---Подкатегория
    +---Подкатегория
    +Обувь
    +---Подкатегория
    +---Подкатегория
    +---Подкатегория

    Т.е. без самой родительской категории с parent_id = 0

    PS Заранее спасибо всем откликнувшимся и помогающим мне в этих вопросах
     
  2. igordata

    igordata Суперстар
    Команда форума Модератор

    С нами с:
    18 мар 2010
    Сообщения:
    32.408
    Симпатии:
    1.768
    а $_GET заюзал? =)
     
  3. Alex_57_php

    Alex_57_php Новичок

    С нами с:
    9 мар 2014
    Сообщения:
    4
    Симпатии:
    0
    Код (Text):
    1. $cat_p = filter_input_var($_GET['cprod']);
    Вот это и есть проверка $_GET, но не получается, возможно я неправильно обращаюсь с массивом
    Код (Text):
    1. if($cat_p == $cat['id']){
    2.       $active = 'active';
    3.       }else{
    4.       $active = '';
    5.       }
     
  4. smitt

    smitt Старожил

    С нами с:
    3 янв 2012
    Сообщения:
    3.166
    Симпатии:
    65
    filter_input_var - что это такое?
     
  5. Alex_57_php

    Alex_57_php Новичок

    С нами с:
    9 мар 2014
    Сообщения:
    4
    Симпатии:
    0
    Это функция обработки $_GET запроса, фильтрует посторонние символы, оставляет только integer числа
     
  6. smitt

    smitt Старожил

    С нами с:
    3 янв 2012
    Сообщения:
    3.166
    Симпатии:
    65
    Что то мне не известна эта функция... да что там я ГУГЛ ее не знает.
    Самописная? Где подключаешь?
    Если нет то откуда взял.
     
  7. Alex_57_php

    Alex_57_php Новичок

    С нами с:
    9 мар 2014
    Сообщения:
    4
    Симпатии:
    0
    Брал на просторах
    Код (Text):
    1. function filter_input_var($var) {
    2.  
    3.     $quotes = array ("\x27", "\x22", "\x60", "\t", "\n", "\r", "*", "%", "<", ">", "?", "!" );
    4.     $var = str_replace( $quotes, '', $var );
    5.  
    6.     $var = preg_replace('/[^0-9]/', '', $var);
    7.  
    8.  
    9.         mysql_real_escape_string(
    10.         trim(
    11.         htmlspecialchars(
    12.         addslashes(
    13.         strip_tags($var)))));
    14.  
    15.     return $var;
    16. }
    Подключаю в самом начале списка подключаемых файлов. Проблем с ней не замечал. Пробовал и без нее, все равно не получается.

    Вы про нее спросили из личного интереса, или это имеет отношение к теме?
     
  8. igordata

    igordata Суперстар
    Команда форума Модератор

    С нами с:
    18 мар 2010
    Сообщения:
    32.408
    Симпатии:
    1.768
    $cat_p = (int)$_GET['cprod'];
     
  9. Your

    Your Старожил

    С нами с:
    2 июл 2011
    Сообщения:
    4.074
    Симпатии:
    7
    Ну просто шедевр, на помойку...