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

Форум MySQL

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

 

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

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

тема: Нужна помощь. Затыка с раскрытием текущей ветви меню
 
 автор: DJ Paltus   (25.02.2009 в 17:53)   письмо автору
 
 

Есть таблица БД, описанная следующим образом:

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($result0);
           }

    
$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 текущей страницы, раскрывалась вся соответствующая ей ветвь меню и скрывались остальные, до самого верхнего уровня (но не включительно). Но на деле все выходит иначе, а у меня не хватает мозга, чтобы разрулить.

Если кто сталкивался, помогите, плиз, добить функцию!

  Ответить  
 
 автор: Zilog   (26.02.2009 в 00:33)   письмо автору
 
   для: DJ Paltus   (25.02.2009 в 17:53)
 

Вот тебе ответ на затыку
http://www.softtime.ru/forum/read.php?id_forum=3&id_theme=62675&page=1

на вход подаешь 0, на выходе - зелёное дерево.

  Ответить  
 
 автор: DJ Paltus   (26.02.2009 в 20:42)   письмо автору
 
   для: Zilog   (26.02.2009 в 00:33)
 

Вы меня не до конца андерстенд. )))
Вывести дуб-дерево я могу самостоятельно, все же бейсик в школе учил.
Но мне надо, отталкиваясь от того, на какой странице я нахожусь, разворачивать ее ветсь до нужного уровня и ныкать остальные, о чем я вроде бы написал в вопросе...

  Ответить  
 
 автор: BinLaden   (26.02.2009 в 21:42)   письмо автору
 
   для: DJ Paltus   (26.02.2009 в 20:42)
 

Зачем Вы храните какие-то URL'ы дочерних ветвей? Почему не формируете их "на ходу"?

  Ответить  
 
 автор: Zilog   (27.02.2009 в 02:02)   письмо автору
 
   для: 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']}";
?>

Я имел ввиду это.

[поправлено модератором]

  Ответить  
 
 автор: DJ Paltus   (27.02.2009 в 09:28)   письмо автору
 
   для: BinLaden   (26.02.2009 в 21:42)
 

В поле url у меня пишется всего лишь человеко-понятное название страницы, которое подставляется в адрес и при помощи rewriteRule превращается в GET-ную переменную.
То есть, site.com/main на самом деле это site.com/index.php?name=main. А по существу есть что-нибудь помочь?

  Ответить  
 
 автор: Zilog   (27.02.2009 в 02:00)   письмо автору
 
   для: DJ Paltus   (26.02.2009 в 20:42)
 

>Но мне надо, отталкиваясь от того, на какой странице я нахожусь, разворачивать ее ветсь до нужного уровня и ныкать остальные, о чем я вроде бы написал в вопросе...

Ну тогда с конца надо плясать, с кода той ветки, которую предполагается раскрыть. Вычисляем обратный путь, до корня, и идем с начала, разворачивая ветви дерева (прямо дендрарий у нас какой-то :) ), по пути, который мы запомнили. Ну и по ходу обратного движения надо запомнить место, где ответвление происходит (parent), и потом с этого места дорисовать дерево.

  Ответить  
 
 автор: DJ Paltus   (27.02.2009 в 10:26)   письмо автору
 
   для: 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($result0);
           } 
//вычисляем обратный путь до корня;

    
$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.

  Ответить  
 
 автор: Zilog   (27.02.2009 в 14:02)   письмо автору
 
   для: DJ Paltus   (27.02.2009 в 10:26)
 

>Как неясно и то, куда девается массив parents перед моментом проверки на вхождение $pid.

Ну он же у тебя теряется при следующем вызове функции. Переменная то - локальная. Надо, как тут недавно выяснлось, обьявлять её как static.

  Ответить  
 
 автор: DJ Paltus   (27.02.2009 в 15:44)   письмо автору
 
   для: 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);
?>

Вот и все.
Всем чмоки!

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

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