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

Форум 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(243);
?>


где $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); ?> 
</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

  Ответить  
Rambler's Top100
вверх

Rambler's Top100 Яндекс.Метрика Яндекс цитирования