[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: Помогите достроить дерево категорий
Alex_57_php
Всем привет!
Есть таблица

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 | Ботинки

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


$cat_p = filter_input_var($_GET['cprod']);

//Выбираем данные из БД
$result=do_query("SELECT * FROM tovars_categories");
//Если в базе данных есть записи, формируем массив
if (mysql_num_rows($result) > 0){
$cats = array();
//В цикле формируем массив разделов, ключом будет id родительской категории, а также массив разделов, ключом будет id категории
while($cat = mysql_fetch_assoc($result)){
$cats_ID[$cat['id']][] = $cat;
$cats[$cat['parent_id']][$cat['id']] = $cat;
}
}
// echo '<pre>';
// print_r($cats);
// echo '</pre>';

function build_tree($cats,$parent_id,$only_parent = false){
if(is_array($cats) and isset($cats[$parent_id])){



if($only_parent==false){
$tree = '<ul>';
foreach($cats[$parent_id] as $cat){
$tree .= '<li class="custom_id'.$cat['id'].'"><a class="" href="/?cprod='.$cat['id'].'">'.$cat['name'].'</a><span class="down"></span>';
$tree .= build_tree($cats,$cat['id']);
$tree .= '</li>';
}
$tree .= '</ul>';
}elseif(is_numeric($only_parent)){
$cat = $cats[$parent_id][$only_parent];
$tree = '<li class="custom_id'.$cat['id'].'"><a class="" href="/?cprod='.$cat['id'].'">'.$cat['name'].'</a><span class="down"></span>';
$tree .= build_tree($cats,$cat['id']);
$tree .= '</li>';
}

}
else return null;
return $tree;
}

function find_parent ($tmp, $cur_id){
if($tmp[$cur_id][0]['parent_id']!=0){
return find_parent($tmp,$tmp[$cur_id][0]['parent_id']);
}
return (int)$tmp[$cur_id][0]['id'];
}


Вот так вывожу в темплейте

<div class="box">
<div
class="box-heading">Категории</div>
<div
class="box-content box-category">
<ul
id="cat_accordion">

<?
echo build_tree($cats,0,find_parent($cats_ID,$cat_p)); ?>
</ul>
</div>
</div>




Скрипт не мой брал на просторах(немного лишь подправил)

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

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

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

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

if($cat_p == $cat['id']){
$active = 'active';
}else{
$active = '';
}


$tree .= '<li class="custom_id'.$cat['id'].'"><a class="'.$active.'" href="/?cprod='.$cat['id'].'">'.$cat['name'].'</a><span class="down"></span>';


Но не получается, пробовал еще вариантов 5, та же фигня, моск кипит

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

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

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



if($cat['parent_id'] != 0){

}


не фига не выходит

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

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

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

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

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

PS Заранее спасибо всем откликнувшимсяи помогающим мне в этих вопросах
Быстрый ответ:

 Графические смайлики |  Показывать подпись
Здесь расположена полная версия этой страницы.
Invision Power Board © 2001-2024 Invision Power Services, Inc.