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

Форум PHP

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

 

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

вид форума:
Линейный форум (новые сообщения вниз) Структурный форум

тема: Многоуровневое меню без яваскрипта

Сообщения:  [1-4] 

 
 автор: Loki   (24.09.2006 в 12:45)   письмо автору
 
   для: elenaki   (23.09.2006 в 19:37)
 

Пункт "раздел" раскрывается. Правда, без отступов, так что дерево это всьма условное.

Вывалив такую кучу кода, вы свели количество желающих помочь к минимуму... я бы даже сказал - до одного человека. Да и то, я бы на его месте сделал вид что этой темы не заметил. Делайте выводы.

   
 
 автор: elenaki   (23.09.2006 в 19:37)   письмо автору
 
   для: carrot   (23.09.2006 в 19:11)
 

не вижу никакого меню (дерева). есть только 4 пункта, нераскрывающиеся.

   
 
 автор: carrot   (23.09.2006 в 19:11)   письмо автору
 
   для: carrot   (23.09.2006 в 04:18)
 

наверное, никто мне не поможет :(

   
 
 автор: carrot   (23.09.2006 в 04:18)   письмо автору
 
 

И снова здравствуйте :)
Для начала убедительно прошу дорогих форумчан не ругаться на то, что сабдж обсуждался минимум в 60 темах. Я искал, но того, что нужно не нашел.
Собственно, с чем пожаловал.
Есть меню. Пример тут - www.fm-studio.ru
Оно не использует яваскрипта, чистый пхп.
Вот как оно выглядит внутри:
index.php(например)

<?
require_once("menu.class.php");
/*
подготовка меню
*/
$menu=array(); 
load_menu(""); 
?>


menu.class.php

<?
class menu
{
    var 
$title,$link;
    function 
menu($title,$link)
    {
        
$this->title=$title;
        
$this->link=$link;
    }
}

function 
print_menu()
{
    global 
$menu_id,$menu,$menu_tree,$parents;
    
$parent=count($menu_tree)>$menu_tree[0] : "";
    
$main=array_keys($parents,"");
    for(
$i=0;$i<count($main);$i++)
    {

        
$id=$main[$i];
        
$link=$menu[$id]->link;
        
$title=$menu[$id]->title;  
        if(
$id==$parent)
        {
            
            
?><li><a href="<?echo $link;?>/" <?if($id==$menu_id){?>id="active_item"<?}?> title="<?echo $title;?>"><?echo $title;?></a></li><?
            print_tree
();
        }
        
        else
                 {
                 
                 
?><li><a href="<?echo $link;?>/" title="<?echo $title;?>"><?echo $title;?></a></li><?
        
}    
    }
    
    
}

function 
print_tree()
{
    global 
$menu_id,$menu,$menu_tree,$parents;
    
$level=1;
    if(
count($menu_tree)>1)
    {
        for (
$j=1;$j<count($menu_tree);$j++)
        {
            
$id=$menu_tree[$j];
            
$title=$menu[$id]->title;
            
$link=$menu[$id]->link;  
            
?><li><?
            ?>
<a href="<?echo $link;?>/" <?if($id==$menu_id){?>id="active_item"<?}?> title="<?echo $title;?>"><?echo $title;?></a><?
            $level
++;
            
?></li><?
        
}
    }
    
$child=array_keys($parents,$menu_tree[count($menu_tree)-1]);
    for(
$j=0;$j<count($child);$j++)
    {
        
?><li><?
        $id
=$child[$j];
        
$title=$menu[$id]->title;
        
$link=$menu[$id]->link;
        
?><a href="<?echo $link;?>/" <?if($id==$menu_id){?>id="active_item"<?}?> title="<?echo $title;?>"><?echo $title;?></a><?
        ?>
</li><?
    
}
}

function 
load_menu($parent)
{
    global 
$menu,$menu_link,$menu_id,$parents$db$menu_selected;

    
$query="SELECT `id`,`title`,`link` FROM `menu` WHERE `parent`='$parent' AND `visible`='yes' ORDER BY `prior` DESC";
    
$result=$db->getAll($query);
if(
$result)
{         
foreach (
$result as $row){
            
$id=$row['id'];
            
$title=$row['title'];
            
$link=$row['link'];
    


            if(
$link=="")
                
$link=$menu_link.$link;
            
            
            if(
$menu_selected==$link)
               
                
$menu_id=$id;
                            
$link=$link;    
                
            
$menu[$id]=new menu($title,$link);
                      
            
$parents[$id]=$parent;
        
            
load_menu($id);
              
        }
    }
}

function 
form_tree()
{
    global 
$menu_id,$menu_tree;
    if(
$menu_id!="")
    {
        global 
$parents;
        if(
key_exists($menu_id,$parents))
        {
            if(
in_array($menu_id,$parents))
                
$menu_tree[]=$menu_id;
            
Get_parent($menu_id);
            
$menu_tree=array_reverse($menu_tree);
            if(
count($menu_tree)==0)
                
$menu_tree[]=$menu_id;
        }
        else 
            
$menu_id="";
    }
}

?>


таблица

CREATE TABLE `menu` (
  `id` int(11) NOT NULL auto_increment,
  `visible` set('yes','no') NOT NULL default 'yes',
  `prior` tinyint(4) NOT NULL default '0',
  `title` varchar(255) NOT NULL default '',
  `link` varchar(255) NOT NULL default '',
  `parent` varchar(10) NOT NULL,
  PRIMARY KEY  (`id`),
  UNIQUE KEY `link` (`link`),
  UNIQUE KEY `id` (`id`)
) ;


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

function print_up_menu()
{
    global $menu_id,$menu,$menu_tree,$parents;
    $parent=count($menu_tree)>0 ? $menu_tree[0] : "";
    $main=array_keys($parents,"");
    for($i=0;$i<count($main);$i++)
    {
        $id=$main[$i];

        $link=$menu[$id]->link;
        $title=$menu[$id]->title;  
        if($id==$parent)
        {
            ?><a href="<?echo stripslashes($link);?>/" class="menuLink"><?echo stripslashes($title);?></a><?


        
}
        
        else
                 {
            
?><a href="<?echo stripslashes($link);?>/" class="menuLink"><?echo stripslashes($title);?></a><?}    
    }

}


а функцию print_menu() поправил вот так

...
        if($id==$parent
        {
    print_tree();
        }
...


Поставил вызов prin_up_menu() там, где надо горизонтально отразить основные разделы, а print_menu() там, где надо вывести подразделы. Ну, и обрадовался...адость была недолгой...Ведь мне нужно было сделать еще кое-что..А именно- при имеющихся подразделах- понятно дело их выводить, а если их нет...ВНИМАНИЕ- что-то другое вставлять(в данном случае нежно было вставить некий блок с текстом)...Я призадумался... По логике кода, надо было в print_menu() просто поставить

...
        if($id==$parent
        {
    print_tree();
        }
else
{
/*НУЖНЫЙ КОД*/
}
...

и вроде как, все должно работать. Но, не тут-то было :(
Получилось так, что эта зараза начала все путать. То поставить код и вывод подразделов, совершенно не относящихся к жанному разделу, то выведет сам тектовой блок, забыв про подразделы, то вообще ничерат не выведет. Вобщем, комбинировались все варианты.
И еще одна странность- ЧАСТИЧНО нормально работало только в том случае, когда id в таблице было мнеьше самого младшего parent. такие чудеса.
Я искренне надеюсь, что хоть кто-нибудь понял, что я только-что написал :)
Внимание, вопросы.
1) Как-бы мне это поправить?
2) Если никак, то очень прошу помочь мне, если не кодом(за что был-бы погроб жизни благодарен), то хоть словом добрым и описанием более-менее подробным- как мне это реализовать.
3) Если может быть у кого-то номрально реализованное, без яваскрипта и с требуемым мне функционалом меню имеется- вот сколько денег за него хотите? Я, хоть и бедный студент, но ради такого дела последнюю почку продам :) Просто действительно очень надо.
Всех заранее благодарю, с радостью отвечу на все вопросы и дам любые исходники, нужные для решения проблемы.

   

Сообщения:  [1-4] 

Форум разработан IT-студией SoftTime
Rambler's Top100
вверх

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