Построение меню

AdminGorkyRu

Новичок
Построение меню

Заранее извиняюсь, то этот пост в эту тему... ну незнаю куда его еще ткнуть можно.

Граждане помогите пожайлуста.. на мысль на толкните..
есть база... иерархическая структура...
-Раздел1 (?id=2)
-Раздел2 (?id=7)
--Подраздел1 (?id=13)
---ПодПодРаздел1 (?id=15)
---ПодПодРаздел2 (?id=16)
---ПодПодРаздел3 (?id=17)
--Подраздел2 (?id=23)
---ПодПодРаздел1 (?id=24)
---ПодПодРаздел2 (?id=25)
---ПодПодРаздел3 (?id=26)
--Подраздел3 (?id=27)
---ПодПодРаздел1 (?id=29)
---ПодПодРаздел2 (?id=30)
---ПодПодРаздел3 (?id=31)
и т.д.

собственно вопрос... я незнаю как сделать так, чтобы:
когда на нулевом уровне меню выглядит:
-Раздел1 (?id=2)
-Раздел2 (?id=7)

Когда на разделе2
-Раздел1 (?id=2)
-Раздел2 (?id=7)
--Подраздел1 (?id=13)
--Подраздел2 (?id=23)
--Подраздел3 (?id=27)

Когда на подразделе: (*)
-Раздел1 (?id=2)
-Раздел2 (?id=7)
--Подраздел1 (?id=13)
--Подраздел2 (?id=23)
---ПодПодРаздел1 (?id=24)
---ПодПодРаздел2 (?id=25)
---ПодПодРаздел3 (?id=26)
--Подраздел3 (?id=27)

в принципе построить меню получилось, но вот я не знаю как мне его строить когда пользователь в виде (*) нажимает ПодПодРазделi... тогда меню просто сбрасывается на нулевой уровень...

я уже запарился.. помогите кте может...
Заранее спасибо.
 

Demiurg

Guest
а структуру базы мы сами должны угадать ?
 

AdminGorkyRu

Новичок
Автор оригинала: Demiurg
а структуру базы мы сами должны угадать ?
да. извините забыл! :))

id int(10)
docTypes_id int(10)
parent_id int(10)
name varchar(255)
anons tinytext
date int(11)
expire int(11)
rightsToShow char(3)
text text
deleted char(1)
level smallint(6)
trust char(1)
prior
 

AdminGorkyRu

Новичок
id int(10) - id документа
docTypes_id int(10) - id типа документа
parent_id int(10) - id предка
name varchar(255) - заголовок
anons tinytext - анонс
date int(11) - дата начала показа
expire int(11) - дата конца показа
rightsToShow char(3) - права на доступ
text text - текст документа
deleted char(1) - флаг (удалено? 1/0)
level smallint(6) - уровень
trust char(1) - флаг (проверено 1/0)
prior int(2) - приоритет вывода
 

Demiurg

Guest
и как определяется что раздел1 идет до раздел2 ?
и что такое "уровень" ?
 

AdminGorkyRu

Новичок
Автор оригинала: Demiurg
и как определяется что раздел1 идет до раздел2 ?
и что такое "уровень" ?
структура извращенная... это факт..

-Раздел2 (?id=7) (level=0, parent_id=0)
--Подраздел1 (?id=13) (level=1, parent_id=7)
---ПодПодРаздел1 (?id=15) (level=2, parent_id=13)
 

Demiurg

Guest
вообщем можно использовать примерно такой алгоритм:

строим цепочку выхода на верхней уровень (в твоем случае это 7 , 13 , 15)

потом делаем примерно такую функцию:

function tree($parent , $level)
{
select * from table where parent_id = $parent
while(...)
{
выводим ветку
if(ветка активна на этом уровне)
tree($node_id, $level+1);
}

}
 

AdminGorkyRu

Новичок
Автор оригинала: Demiurg
вообщем можно использовать примерно такой алгоритм:

строим цепочку выхода на верхней уровень (в твоем случае это 7 , 13 , 15)

потом делаем примерно такую функцию:

function tree($parent , $level)
{
select * from table where parent_id = $parent
while(...)
{
выводим ветку
if(ветка активна на этом уровне)
tree($node_id, $level+1);
}

}
спасибо... я думал примерно так же... но вот не сильно ли возрастает нагрузка на бд...
 

Demiurg

Guest
>но вот не сильно ли возрастает нагрузка на бд...
по сравнению с чем ?
 

AdminGorkyRu

Новичок
Автор оригинала: Demiurg
>но вот не сильно ли возрастает нагрузка на бд...
по сравнению с чем ?
там идет достаточно много обращений в бд... проверка прав пользователя, вывод меню (в 2-х варинатах), вывод статей, голосование (если надо) и т.д.

в целом насколько примерно может возрасти нагрузка при постоянном вычислении полного пути к документу?
 

Demiurg

Guest
если ты считаешь это у тебя будет узким местом, то кешируй результат, наверняка меню изменяется не часто.
 

AdminGorkyRu

Новичок
Автор оригинала: Demiurg
если ты считаешь это у тебя будет узким местом, то кешируй результат, наверняка меню изменяется не часто.
спасибо.. думал об этом.... но у меня получилось свести количество запросов к БД до максимум 20... вообщем надеюсь, что именно здесь не пригодиться кеширование..

Большое спасибо за ответы!
 
Сверху