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

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/topic.php on line 737
Форумы портала PHP.SU :: Вывод древовидного меню

 PHP.SU

Программирование на PHP, MySQL и другие веб-технологии
PHP.SU Портал     На главную страницу форума Главная     Помощь Помощь     Поиск Поиск     Поиск Яндекс Поиск Яндекс     Вакансии  Пользователи Пользователи


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

> Описание: Вывод древовидного меню.
ЮричЪ
Отправлено: 16 Декабря, 2013 - 21:28:27
Post Id


Новичок


Покинул форум
Сообщений всего: 6
Дата рег-ции: Дек. 2013  


Помог: 0 раз(а)




Добрый вечер!
Имеется самописная cms. Я в ней пытаюсь создать древовидное меню (вложенное множество). За основу взял пример скрипта из интернета:
PHP:
скопировать код в буфер обмена
  1. // запрос к базе
  2. $query = mysqli_query($connect, "SELECT * FROM categories");
  3.  
  4. // получение данных в виде ассоциативного массива и формирование нужного нам массива ($data)
  5. while($row = mysqli_fetch_assoc($query))
  6. {
  7.     $data[$row[id]] = $row;
  8. }
  9. Формируем иерархию категорий

PHP:
скопировать код в буфер обмена
  1. function mapTree($dataset) {
  2.      
  3.     $tree = array();
  4.  
  5.     foreach ($dataset as $id=>&$node) {
  6.  
  7.         if (!$node['parent_id']) {
  8.             $tree[$id] = &$node;
  9.         }
  10.         else {
  11.             $dataset[$node['parent_id']]['childs'][$id] = &$node;
  12.         }
  13.  
  14.     }
  15.     return $tree;
  16.  
  17. }
  18. // вызываем функцию и передаем ей наш массив
  19. $data = mapTree($data);

Вывод меню
PHP:
скопировать код в буфер обмена
  1. function view_cat ($dataset) {
  2.  
  3.   foreach ($dataset as $menu) {
  4.  
  5.     echo '<li><a href="/?id='.$menu["id"].'">'.$menu["title"].'</a>';
  6.      
  7.     if($menu['childs']) {
  8.         echo '<ul class="submenu">';
  9.         view_cat($menu['childs']);
  10.         echo '</ul>';
  11.     }
  12.     echo '</li>';
  13.  
  14.  }
  15.  
  16. }

CODE (html):
скопировать код в буфер обмена
  1. <ul class="menu">
  2.     <?php view_cat($data);?>
  3. </ul>

Теперь у меня есть класс store.class.php и mysql.class.php
в store.class.php я подправил данный скрипт под себя:
PHP:
скопировать код в буфер обмена
  1. private function mapTree($dataset) {
  2.         $tree = array();
  3.         foreach ($dataset as $id=>$node) {
  4.             if (!$node['parent_id']) {
  5.                 $tree[$id] = $node;
  6.             }
  7.             else {
  8.                 $dataset[$node['parent_id']]['childs'][$id] = $node;
  9.             }
  10.         }
  11.         return $tree;
  12.     }


PHP:
скопировать код в буфер обмена
  1. private function view_cat($dataset){
  2.         $result = "";
  3.         foreach ($dataset as $menu) {
  4.             $result .= '<li><a href="http://lessonphp.ru/?id='.$menu['id'].'">'.$menu['title'].'</a>';
  5.                 if($menu['childs']) {
  6.                     $result .= '<ul class="submenu">';
  7.                     $this->view_cat($menu['childs']);
  8.                     $result .= '</ul>';
  9.                 }
  10.             $result .= '</li>';
  11.         }
  12.     }

А вот функция в которой я подключаюсь и вывожу в шаблон данные
PHP:
скопировать код в буфер обмена
  1. private function main(){
  2.         $this->tmpl->load_storetemplate('main');
  3.  
  4.         $qaz = $this->sql->get_results("SELECT * FROM categories;", true);
  5.  
  6.         while($row = $this->sql->assoc($qaz))
  7.         {
  8.             $data[$row['id']] = $row;
  9.         }
  10.        
  11.         $data = $this->mapTree($data);        
  12.         $re = $this->view_cat($data);
  13.         //var_dump($re);
  14.        
  15.         $this->tmpl->set('tmpl_cat', $re);}

При таком варианте данные не выводятся т.е. ничего не происходит. Если сделать var_dump($re); то на выходе получаю NULL. Если так var_dump($data); то получаю array(0) { }. Как я понял не отрабатывается while($row = $this->sql->assoc($qaz))...
В mysql.class.php прописано так:


Код не мой, да и я только всего лишь начинаю учиться. Подскажите пжл в чем проблема?
 
 Top
DeepVarvar Супермодератор
Отправлено: 16 Декабря, 2013 - 22:00:13
Post Id



Активный участник


Покинул форум
Сообщений всего: 10377
Дата рег-ции: Дек. 2008  
Откуда: Альфа Центавра


Помог: 353 раз(а)




Не сочтите за рекламу.
Лениво объяснять, многабукаф.
По ссылке ниже Внизу есть все что тебе надо.
 
 Top
ЮричЪ
Отправлено: 16 Декабря, 2013 - 23:30:48
Post Id


Новичок


Покинул форум
Сообщений всего: 6
Дата рег-ции: Дек. 2013  


Помог: 0 раз(а)




DeepVarvar пишет:
Не сочтите за рекламу.
Лениво объяснять, многабукаф.
По ссылке ниже Внизу есть все что тебе надо.


Спасибо за deep, обязательно попробую. Но все же хотелось бы увидеть как моя задачка решается, чтобы понять свои недочеты.
 
 Top
Invert
Отправлено: 17 Декабря, 2013 - 00:06:37
Post Id



Частый гость


Покинул форум
Сообщений всего: 223
Дата рег-ции: Нояб. 2010  


Помог: 5 раз(а)




PHP:
скопировать код в буфер обмена
  1. $qaz = $this->sql->get_results("SELECT * FROM categories;", true);


var_dump( $gaz ) ?

В sql->get_results возвращайте массив с данными, а потом через foreach эти данные обрабатывайте. А то вы обернули стандартные функции MySQL в методы, а толку от этого никакого.

Пример вы взяли хреновый, там работа с ссылками на массив, вы запутаетесь. Возьмите другой пример, проще, и переделайте под себя.
 
 Top
ЮричЪ
Отправлено: 17 Декабря, 2013 - 13:10:08
Post Id


Новичок


Покинул форум
Сообщений всего: 6
Дата рег-ции: Дек. 2013  


Помог: 0 раз(а)




Invert пишет:
PHP:
скопировать код в буфер обмена
  1. $qaz = $this->sql->get_results("SELECT * FROM categories;", true);


var_dump( $gaz ) ?

В sql->get_results возвращайте массив с данными, а потом через foreach эти данные обрабатывайте. А то вы обернули стандартные функции MySQL в методы, а толку от этого никакого.

Пример вы взяли хреновый, там работа с ссылками на массив, вы запутаетесь. Возьмите другой пример, проще, и переделайте под себя.

Спасибо за отклик.
Вот нашел другой пример
CODE (SQL):
скопировать код в буфер обмена
  1. CREATE TABLE `my_tree` (
  2.         `id` INT(10) NOT NULL AUTO_INCREMENT,
  3.         `name` VARCHAR(150) NULL DEFAULT NULL,
  4.         `left_key` INT(10) NOT NULL DEFAULT '0',
  5.         `right_key` INT(10) NOT NULL DEFAULT '0',
  6.         `level` INT(10) NOT NULL DEFAULT '0',
  7.         PRIMARY KEY (`id`),
  8.         INDEX `left_key` (`left_key`, `right_key`, `level`)
  9. )
  10. COLLATE='utf8_general_ci'
  11. ENGINE=MyISAM
  12. AUTO_INCREMENT=4;

Далее...
PHP:
скопировать код в буфер обмена
  1. private function main(){
  2.         $this->tmpl->load_storetemplate('main');
  3.         $re = $this->sql->get_results("SELECT `id`, `name`, `level` FROM `my_tree` ORDER BY `left_key`;", true);
  4.         $resl = "";
  5.         foreach($re as $r){
  6.             $resl .= "<li>{$r['name']}</li>";
  7.         }
  8.         $this->tmpl->set('tmpl_cat', $resl);
  9.     }
  10.  

Вывел в шаблон и получил список данных отсортированным значениям left_key.

А вот дальше как вывести деревом, сообразить вообще не могу. Перепробовал целую кучу примеров и остановился на оф. документации Nested Set. Как дальше сортировать и выстраивать по ключам родителей и детей?
 
 Top
DeepVarvar Супермодератор
Отправлено: 17 Декабря, 2013 - 18:47:24
Post Id



Активный участник


Покинул форум
Сообщений всего: 10377
Дата рег-ции: Дек. 2008  
Откуда: Альфа Центавра


Помог: 353 раз(а)




ЮричЪ пишет:
Вывел в шаблон и получил список данных отсортированным значениям left_key.

А вот дальше как вывести деревом
Ну я ж говорил, все есть:
Описание drawTreeLinksList($arr) и Реализация в исходнике.
Неужели так трудно было покопаться в документации?
Там же все по полочкам разложено.
 
 Top
ЮричЪ
Отправлено: 21 Декабря, 2013 - 06:47:01
Post Id


Новичок


Покинул форум
Сообщений всего: 6
Дата рег-ции: Дек. 2013  


Помог: 0 раз(а)




DeepVarvar пишет:
Описание drawTreeLinksList($arr) и Реализация в исходнике.
Неужели так трудно было покопаться в документации?

Спасибо большое.
Посмотрел и прикрутил то, что надо. Вроде все выводит, lvl строит дерево. Сейчас разбираю Nested Sets что бы по разному выстраивать дерево.
 
 Top
ЮричЪ
Отправлено: 23 Декабря, 2013 - 10:23:04
Post Id


Новичок


Покинул форум
Сообщений всего: 6
Дата рег-ции: Дек. 2013  


Помог: 0 раз(а)




Вывожу дерево, вложенные категория выводятся правильно только до 2 вложенности. Начиная с 3 вложения ветки уходят в низ.
Я думаю, что проблема у меня в запросе, а именно в сортировке ORDER BY.
Привожу скрини и код.

Нажмите для увеличения


Нажмите для увеличения


В запросе я сортирую по parent_id
PHP:
скопировать код в буфер обмена
  1. private function drawTreeLinksList($arr) {
  2.         $output = '';
  3.         $lvl    = null;
  4.         $arr = $this->sql->get_results("SELECT * FROM `my_tree2` ORDER BY parent_id;", true);
  5.         foreach ($arr as $k => $i) {
  6.            
  7.             $link = ' <a href="' . $i['id']. '">' . $i['prototype'] . '</a> ';            
  8.             if ($lvl === null) {
  9.                 $output .= ' <ul class="nav metro-nav-list"><li> ' . $link;
  10.                 $lvl     = $i['lvl'];
  11.                 $first   = $lvl;
  12.             } else if ($lvl < $i['lvl']) {
  13.                 $lvl     = $i['lvl'];
  14.                 $output .= ' <ul class="nav"><li> ' . $link;
  15.             } else if ($lvl > $i['lvl']) {
  16.                 $diff    = $lvl - $i['lvl'];
  17.                 $lvl     = $i['lvl'];
  18.                 $output .= ' </li> ' . str_repeat(' </ul> </li> ', $diff);
  19.                 $output .= ' <li> ' . $link;
  20.             } else {
  21.                 $output .= ' </li> <li> ' . $link;
  22.             }
  23.            
  24.             if (!isset($arr[$k+1])) {
  25.                 $output .= str_repeat(' </li> </ul> ', $lvl - $first + 1);
  26.             }
  27.         }
  28.         return $output;
  29.        
  30.     }


Я так понимаю, в дереве строится только 2 вложения, или кривой запрос.
Подскажите пжл, верен ил запрос?
 
 Top
Страниц (1): [1]
Сейчас эту тему просматривают: 0 (гостей: 0, зарегистрированных: 0)
« Вопросы новичков »


Все гости форума могут просматривать этот раздел.
Только зарегистрированные пользователи могут создавать новые темы в этом разделе.
Только зарегистрированные пользователи могут отвечать на сообщения в этом разделе.
 



Powered by PHP  Powered By MySQL  Powered by Nginx  Valid CSS  RSS

 
Powered by ExBB FM 1.0 RC1. InvisionExBB