Warning: Cannot use a scalar value as an array in /home/admin/public_html/forum/include/fm.class.php on line 757

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/include/fm.class.php on line 770

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/topic.php on line 737
Форумы портала PHP.SU :: Принцип построение иерархического меню

 PHP.SU

Программирование на PHP, MySQL и другие веб-технологии
PHP.SU Портал     На главную страницу форума Главная     Помощь Помощь     Поиск Поиск     Поиск Яндекс Поиск Яндекс     Вакансии  Пользователи Пользователи


 Страниц (2): [1] 2 »   

> Без описания
InviS
Отправлено: 21 Мая, 2010 - 03:36:49
Post Id


Гость


Покинул форум
Сообщений всего: 107
Дата рег-ции: Янв. 2010  


Помог: 0 раз(а)




Ребят, думаю, что многие видели иерархические меню на сайтах, форумах и т.п. Например, даже сейчас на форуме это: Форумы портала PHP.SU » Программирование на PHP
А на каких принципах оно строится? Пока что я в каждой страничке вбиваю вручную все ссылки... Но это рабский труд... Должно же быть красивое решение... Может в БД где-то хранится что-то в виде дерева иерархии? Чтоб для каждой страницы был определен родитель, а ссылки строятся из базы? Ну это предположение... Подскажите, каким образом можно построить к примеру: Главная > Статьи > Обо мне

P.S. Если все же из БД, то каким образом строится это дерево... Ведь у нас есть один корень - Главная страница, а дальше дерево расходится и может быть несколько страниц 2 уровня, несколько третьего... Я не оч. понимаю как это организовать. Перед глазами только какие-то рекурсивные методы обработки)))) Чтоб начинать выбирать с конца меню, а затем по одному добирать следующие пункты... Но это что-то страшное... должен быть другой выход, я надеюсь Улыбка

(Отредактировано автором: 21 Мая, 2010 - 03:40:44)

 
 Top
AdMeen
Отправлено: 21 Мая, 2010 - 08:27:55
Post Id



Посетитель


Покинул форум
Сообщений всего: 370
Дата рег-ции: Сент. 2009  
Откуда: Воронеж


Помог: 1 раз(а)




не претендую на лучшее решение. к примеру, таблица с полями

id parent_id link, если parent_id=-1, то это ссылка 1 уровня, ну и т.д.
исходя из данных этой таблицы, вы можете построить меню любой вложенности.
 
 Top
InviS
Отправлено: 21 Мая, 2010 - 09:48:39
Post Id


Гость


Покинул форум
Сообщений всего: 107
Дата рег-ции: Янв. 2010  


Помог: 0 раз(а)




Но для того, чтоб его построить, мне нужно сделать n запросов к sql-серверу, чтоб получить n раз ссылку на родителя? Верно? Так всегда делают?
 
 Top
ZeiZ
Отправлено: 21 Мая, 2010 - 09:55:54
Post Id



Частый гость


Покинул форум
Сообщений всего: 231
Дата рег-ции: Нояб. 2009  
Откуда: Москва


Помог: 0 раз(а)




AdMeen

согласен, но зачем -1 нужен? (0?)
 
 Top
AdMeen
Отправлено: 21 Мая, 2010 - 10:15:07
Post Id



Посетитель


Покинул форум
Сообщений всего: 370
Дата рег-ции: Сент. 2009  
Откуда: Воронеж


Помог: 1 раз(а)




ZeiZ пишет:
AdMeen

согласен, но зачем -1 нужен? (0?)


ну не суть, хоть 20000000 возьмите). я написал, как бы я сделал)
(Добавление)
InviS пишет:
Но для того, чтоб его построить, мне нужно сделать n запросов к sql-серверу, чтоб получить n раз ссылку на родителя? Верно? Так всегда делают?


0_о, можете одним запросом выбрать все, потом манипулировать ими.
пы.сы. не знаю я как все делают, а тем более всегда, я больше с++ программист чем пхп Закатив глазки , что первое пришло на ум, то и посоветовал)
 
 Top
altermann
Отправлено: 21 Мая, 2010 - 10:46:31
Post Id



Частый гость


Покинул форум
Сообщений всего: 196
Дата рег-ции: Март 2010  
Откуда: Днепропетровск


Помог: 6 раз(а)




InviS пишет:
Но для того, чтоб его построить, мне нужно сделать n запросов к sql-серверу, чтоб получить n раз ссылку на родителя? Верно? Так всегда делают?


Я бы выбрал всех родителей (один запрос), а потом к каждому родителю выбрал все дочерние (кол-во запросов = кол-во родителей).


-----
Я прирожденный кузнец, я не могу не куя!
 
 Top
InviS
Отправлено: 21 Мая, 2010 - 10:54:27
Post Id


Гость


Покинул форум
Сообщений всего: 107
Дата рег-ции: Янв. 2010  


Помог: 0 раз(а)




че-то я недопонял технологию вышесказанного Улыбка Что значит все родителей? Если он у каждого элемента один... меню же идет иерархично Главная > Статьи > О Донецке.. И т.п. Улыбка
 
 Top
altermann
Отправлено: 21 Мая, 2010 - 11:08:38
Post Id



Частый гость


Покинул форум
Сообщений всего: 196
Дата рег-ции: Март 2010  
Откуда: Днепропетровск


Помог: 6 раз(а)




Таблица (id | parent_id | link)
Примем parent_id верхнего уровня равным 0.
В первом запросе выбираем все строки у которых parent_id=0. Это будет верхний уровень меню.
Дальше проходишь поэлементно по верхнему уровню. Для примера: Пункт меню "статьи" имеет id=3, и дальше выбираем все строки у которых parent_id равен 3. Получится список подменю для пункта меню "статьи"


-----
Я прирожденный кузнец, я не могу не куя!
 
 Top
InviS
Отправлено: 21 Мая, 2010 - 11:14:23
Post Id


Гость


Покинул форум
Сообщений всего: 107
Дата рег-ции: Янв. 2010  


Помог: 0 раз(а)




Нет, Вы по ходу неправильно поняли))) Всегда один родительский элемент... Например выбрана статься о донецке, то ссылки будут лишь на пункт Статьи и на Главную... Ну это как менюшка истории.. иерархия ссылок.. типа карты что ли... если пользователь перейдет в статьи, то будет уже только Главная ссылкой, а выбран пункт Статьи... будет что-то типа:
Главная > Статьи... Перейти можно только на главную. А на этой страничке у нас списочек статей Улыбка я так понял, что лучше, чем n-1 запросов, где n - уровень нашей странички - не получится.. Да?
 
 Top
Мелкий Супермодератор
Отправлено: 21 Мая, 2010 - 11:14:40
Post Id



Активный участник


Покинул форум
Сообщений всего: 11926
Дата рег-ции: Июль 2009  
Откуда: Россия, Санкт-Петербург


Помог: 618 раз(а)




Сохранена у меня вот такая ссылка: http://www[dot]getinfo[dot]ru/article610[dot][dot][dot]html?vote=5#vote

InviS пишет:
Что значит все родителей? Если он у каждого элемента один... меню же идет иерархично Главная > Статьи > О Донецке.. И т.п.

т.е. выбираем все пункты одного уровня, а потом подпункты для него и т.д. рекурсивно.


-----
PostgreSQL DBA
 
 Top
InviS
Отправлено: 21 Мая, 2010 - 11:17:50
Post Id


Гость


Покинул форум
Сообщений всего: 107
Дата рег-ции: Янв. 2010  


Помог: 0 раз(а)




НУ это я и хотел узнать Улыбка Думал, может есть че по-оптимальнее Улыбка
 
 Top
JustUserR
Отправлено: 21 Мая, 2010 - 12:06:21
Post Id



Активный участник


Покинул форум
Сообщений всего: 8715
Дата рег-ции: Июнь 2009  


Помог: 17 раз(а)




InviS пишет:
НУ это я и хотел узнать Думал, может есть че по-оптимальнее
Если данные меню хранятся в БД то впринципе возможно написание SQL-функции которая будут ускорять выборку Ведь в обычном случае для вывода не всех подменю всех урвоней а только определенной группы вам нужно делать серию SQL-запросов с указанием соответствующий родительскиъ элементов - а если сделать правильную функцию внутри SQL то можно сразу будет делать рекурсивную выборку для данной цепочки меню


-----
Сделать можно все что угодно - нужно только старание, терпение и хороший поисковик Улыбка
Безлимитный web-хостинг от 15 рублей за 40 МБ дискового пространства - http://ihost[dot]oks71[dot]ru/
 
 Top
InviS
Отправлено: 21 Мая, 2010 - 12:07:46
Post Id


Гость


Покинул форум
Сообщений всего: 107
Дата рег-ции: Янв. 2010  


Помог: 0 раз(а)




Это вообще для меня как темный лес, вы не сталкивались с такими скриптами? хотелось бы посмотреть, если есть..
 
 Top
JustUserR
Отправлено: 21 Мая, 2010 - 12:17:18
Post Id



Активный участник


Покинул форум
Сообщений всего: 8715
Дата рег-ции: Июнь 2009  


Помог: 17 раз(а)




InviS пишет:
Это вообще для меня как темный лес, вы не сталкивались с такими скриптами? хотелось бы посмотреть, если есть..
Использование SQL-фукнция является достаточно интересной возможность поскольку позволяет переложить нагрузку на сервер баз данных - а учитывая что в него встроены эффективные алгоримты поиска и индексации то ваши собственные функции должно эффективно рабоать вместе с ними
Здесь приведено несколько статей связанных с SQL-фукнциями и в частности с рекурсией в SQL-функциях


-----
Сделать можно все что угодно - нужно только старание, терпение и хороший поисковик Улыбка
Безлимитный web-хостинг от 15 рублей за 40 МБ дискового пространства - http://ihost[dot]oks71[dot]ru/
 
 Top
InviS
Отправлено: 21 Мая, 2010 - 12:25:20
Post Id


Гость


Покинул форум
Сообщений всего: 107
Дата рег-ции: Янв. 2010  


Помог: 0 раз(а)




Это по mysql? А то чет везде почти oracle написано... а я как бы использую mysql...
Ссылочка на ibm вроде бы что-то похожее... Но триггеры же совсем недавно появились)) надо будет в них разобраться.. сильная вещь.. но все это время..
 
 Top
Страниц (2): [1] 2 »
Сейчас эту тему просматривают: 0 (гостей: 0, зарегистрированных: 0)
« Программирование на PHP »


Все гости форума могут просматривать этот раздел.
Только зарегистрированные пользователи могут создавать новые темы в этом разделе.
Только зарегистрированные пользователи могут отвечать на сообщения в этом разделе.
 



Powered by PHP  Powered By MySQL  Powered by Nginx  Valid CSS  RSS

 
Powered by ExBB FM 1.0 RC1. InvisionExBB