Warning: Cannot use a scalar value as an array in /home/admin/public_html/forum/include/fm.class.php on line 757

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/include/fm.class.php on line 770
Форумы портала PHP.SU :: Версия для печати :: Помогите достроить дерево категорий
Форумы портала PHP.SU » » Хранение данных, их вывод и обработка » Помогите достроить дерево категорий

Страниц (1): [1]
 

1. Alex_57_php - 09 Марта, 2014 - 16:25:26 - перейти к сообщению
Всем привет!
Есть таблица
Таблица категорий (Отобразить)


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

PHP:
скопировать код в буфер обмена
  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. }
  50.  


Вот так вывожу в темплейте
CODE (html):
скопировать код в буфер обмена
  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>
  11.  
  12.  


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

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

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

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

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

PHP:
скопировать код в буфер обмена
  1. if($cat_p == $cat['id']){
  2.            $active = 'active';
  3.            }else{
  4.            $active = '';
  5.            }


PHP:
скопировать код в буфер обмена
  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 равен нулю?

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

PHP:
скопировать код в буфер обмена
  1.  
  2.  
  3. if($cat['parent_id'] != 0){
  4.  
  5. }
  6.  


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


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

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

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

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

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

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

 

Powered by ExBB FM 1.0 RC1