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
Форумы портала PHP.SU :: Версия для печати :: Принцип построение иерархического меню
Форумы портала PHP.SU » PHP » Программирование на PHP » Принцип построение иерархического меню

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

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

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

id parent_id link, если parent_id=-1, то это ссылка 1 уровня, ну и т.д.
исходя из данных этой таблицы, вы можете построить меню любой вложенности.
3. InviS - 21 Мая, 2010 - 09:48:39 - перейти к сообщению
Но для того, чтоб его построить, мне нужно сделать n запросов к sql-серверу, чтоб получить n раз ссылку на родителя? Верно? Так всегда делают?
4. ZeiZ - 21 Мая, 2010 - 09:55:54 - перейти к сообщению
AdMeen

согласен, но зачем -1 нужен? (0?)
5. AdMeen - 21 Мая, 2010 - 10:15:07 - перейти к сообщению
ZeiZ пишет:
AdMeen

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


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


0_о, можете одним запросом выбрать все, потом манипулировать ими.
пы.сы. не знаю я как все делают, а тем более всегда, я больше с++ программист чем пхп Закатив глазки , что первое пришло на ум, то и посоветовал)
6. altermann - 21 Мая, 2010 - 10:46:31 - перейти к сообщению
InviS пишет:
Но для того, чтоб его построить, мне нужно сделать n запросов к sql-серверу, чтоб получить n раз ссылку на родителя? Верно? Так всегда делают?


Я бы выбрал всех родителей (один запрос), а потом к каждому родителю выбрал все дочерние (кол-во запросов = кол-во родителей).
7. InviS - 21 Мая, 2010 - 10:54:27 - перейти к сообщению
че-то я недопонял технологию вышесказанного Улыбка Что значит все родителей? Если он у каждого элемента один... меню же идет иерархично Главная > Статьи > О Донецке.. И т.п. Улыбка
8. altermann - 21 Мая, 2010 - 11:08:38 - перейти к сообщению
Таблица (id | parent_id | link)
Примем parent_id верхнего уровня равным 0.
В первом запросе выбираем все строки у которых parent_id=0. Это будет верхний уровень меню.
Дальше проходишь поэлементно по верхнему уровню. Для примера: Пункт меню "статьи" имеет id=3, и дальше выбираем все строки у которых parent_id равен 3. Получится список подменю для пункта меню "статьи"
9. InviS - 21 Мая, 2010 - 11:14:23 - перейти к сообщению
Нет, Вы по ходу неправильно поняли))) Всегда один родительский элемент... Например выбрана статься о донецке, то ссылки будут лишь на пункт Статьи и на Главную... Ну это как менюшка истории.. иерархия ссылок.. типа карты что ли... если пользователь перейдет в статьи, то будет уже только Главная ссылкой, а выбран пункт Статьи... будет что-то типа:
Главная > Статьи... Перейти можно только на главную. А на этой страничке у нас списочек статей Улыбка я так понял, что лучше, чем n-1 запросов, где n - уровень нашей странички - не получится.. Да?
10. Мелкий - 21 Мая, 2010 - 11:14:40 - перейти к сообщению
Сохранена у меня вот такая ссылка: http://www[dot]getinfo[dot]ru/article610[dot][dot][dot]html?vote=5#vote

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

т.е. выбираем все пункты одного уровня, а потом подпункты для него и т.д. рекурсивно.
11. InviS - 21 Мая, 2010 - 11:17:50 - перейти к сообщению
НУ это я и хотел узнать Улыбка Думал, может есть че по-оптимальнее Улыбка
12. JustUserR - 21 Мая, 2010 - 12:06:21 - перейти к сообщению
InviS пишет:
НУ это я и хотел узнать Думал, может есть че по-оптимальнее
Если данные меню хранятся в БД то впринципе возможно написание SQL-функции которая будут ускорять выборку Ведь в обычном случае для вывода не всех подменю всех урвоней а только определенной группы вам нужно делать серию SQL-запросов с указанием соответствующий родительскиъ элементов - а если сделать правильную функцию внутри SQL то можно сразу будет делать рекурсивную выборку для данной цепочки меню
13. InviS - 21 Мая, 2010 - 12:07:46 - перейти к сообщению
Это вообще для меня как темный лес, вы не сталкивались с такими скриптами? хотелось бы посмотреть, если есть..
14. JustUserR - 21 Мая, 2010 - 12:17:18 - перейти к сообщению
InviS пишет:
Это вообще для меня как темный лес, вы не сталкивались с такими скриптами? хотелось бы посмотреть, если есть..
Использование SQL-фукнция является достаточно интересной возможность поскольку позволяет переложить нагрузку на сервер баз данных - а учитывая что в него встроены эффективные алгоримты поиска и индексации то ваши собственные функции должно эффективно рабоать вместе с ними
Здесь приведено несколько статей связанных с SQL-фукнциями и в частности с рекурсией в SQL-функциях
15. InviS - 21 Мая, 2010 - 12:25:20 - перейти к сообщению
Это по mysql? А то чет везде почти oracle написано... а я как бы использую mysql...
Ссылочка на ibm вроде бы что-то похожее... Но триггеры же совсем недавно появились)) надо будет в них разобраться.. сильная вещь.. но все это время..

 

Powered by ExBB FM 1.0 RC1