|
|
|
| На сайте несколько разделов
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>»</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
По данному алгоритму - открываются все подразделы. | |
|
|
|
|
|
|
|
для: mihdan
(30.09.2010 в 18:47)
| | >..По данному алгоритму - открываются все подразделы.
Угу.. А Вам в голову не приходило, что все подразделы можно и одним запросом открыть? | |
|
|
|
|
|
|
|
для: root
(30.09.2010 в 19:18)
| | Например? | |
|
|
|
|
|
|
|
для: 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 не нужен, но я его оставил. | |
|
|
|
|
|
|
|
для: root
(30.09.2010 в 19:18)
| | Проверка связи... | |
|
|
|
|
|
|
|
для: mihdan
(10.10.2010 в 01:57)
| | я гулял... | |
|
|
|
|
|
|
|
для: root
(11.10.2010 в 16:20)
| | Что касаемо нашей беседы? | |
|
|
|
|
|
|
|
для: mihdan
(30.09.2010 в 18:47)
| | Почему рекурсия ?
Подсчитайте сколько запросов будет к базе при выводе меню.
Может лучше делать только один запрос и всё меню выбирать в массив ,и по условию тоже
и делать разбор массива средствами php ? | |
|
|
|
|
|
|
|
для: Косорылый
(22.01.2011 в 23:40)
| | Возможно, вы правы! Сейчас попробуем. | |
|
|
|
|