Форум: Форум PHPФорум ApacheФорум Регулярные ВыраженияФорум MySQLHTML+CSS+JavaScriptФорум FlashРазное
Новые темы: 0000000
Социальная инженерия и социальные хакеры. Авторы: Кузнецов М.В., Симдянов И.В. MySQL 5. В подлиннике. Авторы: Кузнецов М.В., Симдянов И.В. PHP 5/6. В подлиннике. Авторы: Кузнецов М.В., Симдянов И.В. C++. Мастер-класс в задачах и примерах. Авторы: Кузнецов М.В., Симдянов И.В. Самоучитель PHP 5 / 6 (3 издание). Авторы: Кузнецов М.В., Симдянов И.В.
ВСЕ НАШИ КНИГИ

Форум MySQL

Выбрать другой форум

 

Здравствуйте, Посетитель!

вид форума:
Линейный форум Структурный форум

тема: Открытие текущей ветки меню при рекурсивном обходе дерева
 
 автор: mihdan   (30.09.2010 в 18:47)   письмо автору
 
 

На сайте несколько разделов

id | pid | name

1 0 Культура
2 0 Наука
    4 2 Подраздел науки
3 0 Спорт
    5 3 Подраздел спорта


При клике на Наука нужно вывести все ее подразделы рекурсивно и открыть текущую ветку


<?php
function getLeftMenu ($id, $cur, $level) {
        global $cfg, $db;
    $tmp = '<ul id="item_'.$id.'">';

        $sql = "SELECT * FROM `{$cfg['db']['prefix']}_pages_list` WHERE `pid`=$id AND `is_vis`=1 ORDER BY `sort`";
        $sitemap = $db->getAll($sql);
        $count = count($sitemap);

        if ($count > 0) {
            foreach ($sitemap as $item) {
         $class = ($item['id'] == $cur) ? 'current' : '';
                $tmp .= '<li><a href="?module=pages&action=view&id='.$item['id'].'&level='.$level.'" id="'.$class.'"><span>&raquo;</span>'.$item['name'].'</a>';
        if (hasChildren($item['id'])) {
            $tmp .= getLeftMenu($item['id'], $cur, $level++);
        }

                $tmp .= '</li>';
            }
        }
    $tmp .= '</ul>';

        return $tmp;
}
echo getLeftMenu(2, 4, 3);
?>


где $id = ID корневого раздела (вычисляется исходя из $cur, полученной из строки запроса)
$cur = из строки запроса, обозначает текущую страницу
$level = уровень вложенности

hasChildren() - проверяет наличие подразделов у текущего раздела, возвращая bool: true/false
По данному алгоритму - открываются все подразделы.

  Ответить  
 
 автор: root   (30.09.2010 в 19:18)   письмо автору
 
   для: mihdan   (30.09.2010 в 18:47)
 

>..По данному алгоритму - открываются все подразделы.

Угу.. А Вам в голову не приходило, что все подразделы можно и одним запросом открыть?

  Ответить  
 
 автор: mihdan   (08.10.2010 в 00:43)   письмо автору
 
   для: root   (30.09.2010 в 19:18)
 

Например?

  Ответить  
 
 автор: root   (11.10.2010 в 16:19)   письмо автору
 
   для: mihdan   (08.10.2010 в 00:43)
 

В общем случае можно пробовать так:
<?php 
/* 
CREATE TABLE `_pages_list` ( 
  `id` int(11) NOT NULL AUTO_INCREMENT, 
  `pid` int(11), 
  `name` varchar(255), 
  PRIMARY KEY (`id`) 
) ENGINE=MyISAM; 

INSERT INTO `_pages_list` (`id`, `pid`, `name`) VALUES 
(1, NULL, 'Science'), 
(2, NULL, 'Culture'), 
(3, NULL, 'Sport'), 
(4, 1, 'Sub Science'), 
(5, 3, 'Sub Sport'), 
(6, 5, 'Sub sub sport'); 
*/ 

function getNodes( $nodes, $children, $level )
{
    $html = '';
    foreach( $nodes as $node )
    {
        $html .= '<ul><li>' . $node->name;
        if( isset( $children[$node->id] ) )
            $html .= getNodes( $children[$node->id], $children, ++$level );
        $html .= '</li></ul>'; 
    }
    return $html; 
}

mysql_connect( 'localhost', 'root', '' ); 
mysql_select_db( 'test' ); 
$result = mysql_query( 'SELECT id, pid, name FROM _pages_list' ); 
$roots = array(); 
$children = array(); 
while ( $row = mysql_fetch_object( $result ) ) 
{ 
    if( is_null( $row->pid ) ) 
        $roots[] = $row; 
    else 
        $children[$row->pid][] = $row; 
} 
?> 
<html><body> 
<?php echo getNodes( $roots, $children, 0 ); ?> 
</body></html>

В Вашем случае добавится поиск нужного root'a.

P.S.
$level не нужен, но я его оставил.

  Ответить  
 
 автор: mihdan   (10.10.2010 в 01:57)   письмо автору
 
   для: root   (30.09.2010 в 19:18)
 

Проверка связи...

  Ответить  
 
 автор: root   (11.10.2010 в 16:20)   письмо автору
 
   для: mihdan   (10.10.2010 в 01:57)
 

я гулял...

  Ответить  
 
 автор: mihdan   (22.01.2011 в 23:28)   письмо автору
 
   для: root   (11.10.2010 в 16:20)
 

Что касаемо нашей беседы?

  Ответить  
 
 автор: Косорылый   (22.01.2011 в 23:40)   письмо автору
 
   для: mihdan   (30.09.2010 в 18:47)
 

Почему рекурсия ?
Подсчитайте сколько запросов будет к базе при выводе меню.
Может лучше делать только один запрос и всё меню выбирать в массив ,и по условию тоже
и делать разбор массива средствами php ?

  Ответить  
 
 автор: mihdan   (23.01.2011 в 20:26)   письмо автору
 
   для: Косорылый   (22.01.2011 в 23:40)
 

Возможно, вы правы! Сейчас попробуем.

  Ответить  
 
 автор: Косорылый   (24.01.2011 в 10:37)   письмо автору
 
   для: mihdan   (23.01.2011 в 20:26)
 

Эти темы на форуме освещались посмотрите
http://softtime.ru/forum/srchform.php?id_forum=3&name=Trianon+tree&numberthemes=30&srchwhere=2&logic=1

  Ответить