|
|
|
| Есть таблица БД, описанная следующим образом:
CREATE TABLE `pages` (
`id` int(11) NOT NULL auto_increment,
`title` tinytext NOT NULL,
`content` text NOT NULL,
`url` tinytext NOT NULL,
`parent` int(11) NOT NULL,
`show` tinyint(4) NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=MyISAM AUTO_INCREMENT=84 DEFAULT CHARSET=cp1251 AUTO_INCREMENT=84 ;
|
Есть рекурсивная функция get_children, выстраивающая дерево по родительскому признаку.
<?
function get_children($pid){
$tmp=$pid;
$parents=array();
while ($tmp){
$parents[]=$tmp;
$result=mysql_query("SELECT parent FROM pages WHERE `id`=$tmp");
$tmp=mysql_result($result, 0);
}
$rez2=mysql_query("select * from pages where `parent`='$pid' and `show`='1'");
print "<ul class='navigation'>\n";
while($row2=mysql_fetch_array($rez2)){
print "<li><a href='".$row2['url']."'>". $row2['title']."</a>";
if(in_array($pid, $parents))get_children($row2['id']);
print "</li>\n";
}
print "</ul>\n";
}
?>
|
Вызов функции:
<?
get_children(0); //с нулевого уровня
?>
|
Смысл был таков, что по наличию в массиве $parents значения id текущей страницы, раскрывалась вся соответствующая ей ветвь меню и скрывались остальные, до самого верхнего уровня (но не включительно). Но на деле все выходит иначе, а у меня не хватает мозга, чтобы разрулить.
Если кто сталкивался, помогите, плиз, добить функцию! | |
|
|
|
|
|
|
|
для: DJ Paltus
(25.02.2009 в 17:53)
| | Вот тебе ответ на затыку
http://www.softtime.ru/forum/read.php?id_forum=3&id_theme=62675&page=1
на вход подаешь 0, на выходе - зелёное дерево. | |
|
|
|
|
|
|
|
для: Zilog
(26.02.2009 в 00:33)
| | Вы меня не до конца андерстенд. )))
Вывести дуб-дерево я могу самостоятельно, все же бейсик в школе учил.
Но мне надо, отталкиваясь от того, на какой странице я нахожусь, разворачивать ее ветсь до нужного уровня и ныкать остальные, о чем я вроде бы написал в вопросе... | |
|
|
|
|
|
|
|
для: DJ Paltus
(26.02.2009 в 20:42)
| | Зачем Вы храните какие-то URL'ы дочерних ветвей? Почему не формируете их "на ходу"? | |
|
|
|
|
|
|
|
для: BinLaden
(26.02.2009 в 21:42)
| | >Зачем Вы храните какие-то URL'ы дочерних ветвей? Почему не формируете их "на ходу"?
А что в этом плохого? В режиме пользователя ненадо тратить лишнее время на формирование урлов (осбенно если список длинный). Хотя, надо учесть, этот метод создает дополнительные трудности в админ-панели (удаление, переносы разделов). | |
|
|
|
|
автор: BinLaden [alive] (27.02.2009 в 02:08) |
|
|
для: Zilog
(27.02.2009 в 02:02)
| | > режиме пользователя ненадо тратить лишнее время на формирование урлов
<?php
$uri = "index.php?id={$row['id']}";
?>
|
Я имел ввиду это.
[поправлено модератором] | |
|
|
|
|
|
|
|
для: BinLaden
(26.02.2009 в 21:42)
| | В поле url у меня пишется всего лишь человеко-понятное название страницы, которое подставляется в адрес и при помощи rewriteRule превращается в GET-ную переменную.
То есть, site.com/main на самом деле это site.com/index.php?name=main. А по существу есть что-нибудь помочь? | |
|
|
|
|
|
|
|
для: DJ Paltus
(26.02.2009 в 20:42)
| | >Но мне надо, отталкиваясь от того, на какой странице я нахожусь, разворачивать ее ветсь до нужного уровня и ныкать остальные, о чем я вроде бы написал в вопросе...
Ну тогда с конца надо плясать, с кода той ветки, которую предполагается раскрыть. Вычисляем обратный путь, до корня, и идем с начала, разворачивая ветви дерева (прямо дендрарий у нас какой-то :) ), по пути, который мы запомнили. Ну и по ходу обратного движения надо запомнить место, где ответвление происходит (parent), и потом с этого места дорисовать дерево. | |
|
|
|
|
|
|
|
для: Zilog
(27.02.2009 в 02:00)
| | >Ну тогда с конца надо плясать, с кода той ветки, которую предполагается раскрыть. Вычисляем обратный путь, до корня, и идем с начала, разворачивая ветви дерева (прямо дендрарий у нас какой-то :) ), по пути, который мы запомнили. Ну и по ходу обратного движения надо запомнить место, где ответвление происходит (parent), и потом с этого места дорисовать дерево.
<?
function get_children($pid){
$tmp=$pid;
$parents=array();
while ($tmp){
$parents[]=$tmp;
$result=mysql_query("SELECT parent FROM pages WHERE `id`=$tmp");
$tmp=mysql_result($result, 0);
} //вычисляем обратный путь до корня;
$rez2=mysql_query("select * from pages where `parent`='$pid' and `show`='1'");
print "<ul class='navigation'>\n";
while($row2=mysql_fetch_array($rez2)){ //идем с начала
print "<li><a href='".$row2['url']."'>". $row2['title']."</a>";
if(in_array($pid, $parents))get_children($row2['id']); // по пути, который мы запомнили
print "</li>\n";
}
print "</ul>\n";
}
?>
|
Это я сделал. Вот. А дальнейшее мне неясно. Как неясно и то, куда девается массив parents перед моментом проверки на вхождение $pid. | |
|
|
|
|
|
|
|
для: DJ Paltus
(27.02.2009 в 10:26)
| | >Как неясно и то, куда девается массив parents перед моментом проверки на вхождение $pid.
Ну он же у тебя теряется при следующем вызове функции. Переменная то - локальная. Надо, как тут недавно выяснлось, обьявлять её как static. | |
|
|
|
|
|
|
|
для: Zilog
(27.02.2009 в 14:02)
| | Хохо, господа!
У меня получилося!
Можно в мемориз сходу.
Итак, вводим отдельно функцию вытягивания пути искомой страницы (я ее нарыл тут же, в форуме, и немного добил:
<?
function get_path($id, $root_id = '')
{
$list = array();
do{
$sql = "SELECT * FROM pages WHERE id = '$id'";
$res = mysql_query($sql) or die(mysql_error());
$row = mysql_fetch_assoc($res);
if($row == 0)
break;
$list[] = $row['id'];
$id = intval($row['parent']);
} while($id != $root_id && $id != '');
$list[]=$id;
return $list;
}
?>
|
В функцию построения ветки вводим показатель корня $eid, после чего она начинает выглядеть следующим образом:
<?
function get_children($pid, $eid){
$rez2=mysql_query("select * from pages where `parent`='$pid' and `show`='1'");
print "<ul class='navigation'>\n";
while($row2=mysql_fetch_array($rez2)){ //идем с начала
print "<li><a href='".$row2['url']."'>". $row2['title']."</a>";
if(in_array($row2['id'], get_path($eid)))get_children($row2['id'], $eid);
print "</li>\n";
}
print "</ul>\n";
}
?>
|
Ну и самое интересное - вызов меню из корневой страницы:
<?
$sql = "SELECT id AS the_id FROM pages WHERE url = '".$_GET['name']."'"; //реальный адрес страницы - site.com/index.php?name=page, а нам надо ИД вынуть.
$res = mysql_query($sql) or die(mysql_error());
$row = mysql_fetch_assoc($res);
$the_id=$row['the_id'];
get_children(0, $the_id);
?>
|
Вот и все.
Всем чмоки! | |
|
|
|