| | И снова здравствуйте :)
Для начала убедительно прошу дорогих форумчан не ругаться на то, что сабдж обсуждался минимум в 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)>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)
{
?><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) Если может быть у кого-то номрально реализованное, без яваскрипта и с требуемым мне функционалом меню имеется- вот сколько денег за него хотите? Я, хоть и бедный студент, но ради такого дела последнюю почку продам :) Просто действительно очень надо.
Всех заранее благодарю, с радостью отвечу на все вопросы и дам любые исходники, нужные для решения проблемы. | |