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 :: Принцип построение иерархического меню
Покинул форум
Сообщений всего: 107
Дата рег-ции: Янв. 2010
Помог: 0 раз(а)
Ребят, думаю, что многие видели иерархические меню на сайтах, форумах и т.п. Например, даже сейчас на форуме это: Форумы портала PHP.SU » Программирование на PHP
А на каких принципах оно строится? Пока что я в каждой страничке вбиваю вручную все ссылки... Но это рабский труд... Должно же быть красивое решение... Может в БД где-то хранится что-то в виде дерева иерархии? Чтоб для каждой страницы был определен родитель, а ссылки строятся из базы? Ну это предположение... Подскажите, каким образом можно построить к примеру: Главная > Статьи > Обо мне
P.S. Если все же из БД, то каким образом строится это дерево... Ведь у нас есть один корень - Главная страница, а дальше дерево расходится и может быть несколько страниц 2 уровня, несколько третьего... Я не оч. понимаю как это организовать. Перед глазами только какие-то рекурсивные методы обработки)))) Чтоб начинать выбирать с конца меню, а затем по одному добирать следующие пункты... Но это что-то страшное... должен быть другой выход, я надеюсь
Покинул форум
Сообщений всего: 370
Дата рег-ции: Сент. 2009 Откуда: Воронеж
Помог: 1 раз(а)
не претендую на лучшее решение. к примеру, таблица с полями
id parent_id link, если parent_id=-1, то это ссылка 1 уровня, ну и т.д.
исходя из данных этой таблицы, вы можете построить меню любой вложенности.
InviS
Отправлено: 21 Мая, 2010 - 09:48:39
Гость
Покинул форум
Сообщений всего: 107
Дата рег-ции: Янв. 2010
Помог: 0 раз(а)
Но для того, чтоб его построить, мне нужно сделать n запросов к sql-серверу, чтоб получить n раз ссылку на родителя? Верно? Так всегда делают?
ZeiZ
Отправлено: 21 Мая, 2010 - 09:55:54
Частый гость
Покинул форум
Сообщений всего: 231
Дата рег-ции: Нояб. 2009 Откуда: Москва
Помог: 0 раз(а)
AdMeen
согласен, но зачем -1 нужен? (0?)
AdMeen
Отправлено: 21 Мая, 2010 - 10:15:07
Посетитель
Покинул форум
Сообщений всего: 370
Дата рег-ции: Сент. 2009 Откуда: Воронеж
Помог: 1 раз(а)
ZeiZ пишет:
AdMeen
согласен, но зачем -1 нужен? (0?)
ну не суть, хоть 20000000 возьмите). я написал, как бы я сделал) (Добавление)
InviS пишет:
Но для того, чтоб его построить, мне нужно сделать n запросов к sql-серверу, чтоб получить n раз ссылку на родителя? Верно? Так всегда делают?
0_о, можете одним запросом выбрать все, потом манипулировать ими.
пы.сы. не знаю я как все делают, а тем более всегда, я больше с++ программист чем пхп , что первое пришло на ум, то и посоветовал)
altermann
Отправлено: 21 Мая, 2010 - 10:46:31
Частый гость
Покинул форум
Сообщений всего: 196
Дата рег-ции: Март 2010 Откуда: Днепропетровск
Помог: 6 раз(а)
InviS пишет:
Но для того, чтоб его построить, мне нужно сделать n запросов к sql-серверу, чтоб получить n раз ссылку на родителя? Верно? Так всегда делают?
Я бы выбрал всех родителей (один запрос), а потом к каждому родителю выбрал все дочерние (кол-во запросов = кол-во родителей).
----- Я прирожденный кузнец, я не могу не куя!
InviS
Отправлено: 21 Мая, 2010 - 10:54:27
Гость
Покинул форум
Сообщений всего: 107
Дата рег-ции: Янв. 2010
Помог: 0 раз(а)
че-то я недопонял технологию вышесказанного Что значит все родителей? Если он у каждого элемента один... меню же идет иерархично Главная > Статьи > О Донецке.. И т.п.
altermann
Отправлено: 21 Мая, 2010 - 11:08:38
Частый гость
Покинул форум
Сообщений всего: 196
Дата рег-ции: Март 2010 Откуда: Днепропетровск
Помог: 6 раз(а)
Таблица (id | parent_id | link)
Примем parent_id верхнего уровня равным 0.
В первом запросе выбираем все строки у которых parent_id=0. Это будет верхний уровень меню.
Дальше проходишь поэлементно по верхнему уровню. Для примера: Пункт меню "статьи" имеет id=3, и дальше выбираем все строки у которых parent_id равен 3. Получится список подменю для пункта меню "статьи"
----- Я прирожденный кузнец, я не могу не куя!
InviS
Отправлено: 21 Мая, 2010 - 11:14:23
Гость
Покинул форум
Сообщений всего: 107
Дата рег-ции: Янв. 2010
Помог: 0 раз(а)
Нет, Вы по ходу неправильно поняли))) Всегда один родительский элемент... Например выбрана статься о донецке, то ссылки будут лишь на пункт Статьи и на Главную... Ну это как менюшка истории.. иерархия ссылок.. типа карты что ли... если пользователь перейдет в статьи, то будет уже только Главная ссылкой, а выбран пункт Статьи... будет что-то типа:
Главная > Статьи... Перейти можно только на главную. А на этой страничке у нас списочек статей я так понял, что лучше, чем n-1 запросов, где n - уровень нашей странички - не получится.. Да?
Мелкий
Отправлено: 21 Мая, 2010 - 11:14:40
Активный участник
Покинул форум
Сообщений всего: 11926
Дата рег-ции: Июль 2009 Откуда: Россия, Санкт-Петербург
Что значит все родителей? Если он у каждого элемента один... меню же идет иерархично Главная > Статьи > О Донецке.. И т.п.
т.е. выбираем все пункты одного уровня, а потом подпункты для него и т.д. рекурсивно.
----- PostgreSQL DBA
InviS
Отправлено: 21 Мая, 2010 - 11:17:50
Гость
Покинул форум
Сообщений всего: 107
Дата рег-ции: Янв. 2010
Помог: 0 раз(а)
НУ это я и хотел узнать Думал, может есть че по-оптимальнее
JustUserR
Отправлено: 21 Мая, 2010 - 12:06:21
Активный участник
Покинул форум
Сообщений всего: 8715
Дата рег-ции: Июнь 2009
Помог: 17 раз(а)
InviS пишет:
НУ это я и хотел узнать Думал, может есть че по-оптимальнее
Если данные меню хранятся в БД то впринципе возможно написание SQL-функции которая будут ускорять выборку Ведь в обычном случае для вывода не всех подменю всех урвоней а только определенной группы вам нужно делать серию SQL-запросов с указанием соответствующий родительскиъ элементов - а если сделать правильную функцию внутри SQL то можно сразу будет делать рекурсивную выборку для данной цепочки меню
----- Сделать можно все что угодно - нужно только старание, терпение и хороший поисковик
Безлимитный web-хостинг от 15 рублей за 40 МБ дискового пространства - http://ihost[dot]oks71[dot]ru/
InviS
Отправлено: 21 Мая, 2010 - 12:07:46
Гость
Покинул форум
Сообщений всего: 107
Дата рег-ции: Янв. 2010
Помог: 0 раз(а)
Это вообще для меня как темный лес, вы не сталкивались с такими скриптами? хотелось бы посмотреть, если есть..
JustUserR
Отправлено: 21 Мая, 2010 - 12:17:18
Активный участник
Покинул форум
Сообщений всего: 8715
Дата рег-ции: Июнь 2009
Помог: 17 раз(а)
InviS пишет:
Это вообще для меня как темный лес, вы не сталкивались с такими скриптами? хотелось бы посмотреть, если есть..
Использование SQL-фукнция является достаточно интересной возможность поскольку позволяет переложить нагрузку на сервер баз данных - а учитывая что в него встроены эффективные алгоримты поиска и индексации то ваши собственные функции должно эффективно рабоать вместе с ними
Здесь приведено несколько статей связанных с SQL-фукнциями и в частности с рекурсией в SQL-функциях
----- Сделать можно все что угодно - нужно только старание, терпение и хороший поисковик
Безлимитный web-хостинг от 15 рублей за 40 МБ дискового пространства - http://ihost[dot]oks71[dot]ru/
InviS
Отправлено: 21 Мая, 2010 - 12:25:20
Гость
Покинул форум
Сообщений всего: 107
Дата рег-ции: Янв. 2010
Помог: 0 раз(а)
Это по mysql? А то чет везде почти oracle написано... а я как бы использую mysql...
Ссылочка на ibm вроде бы что-то похожее... Но триггеры же совсем недавно появились)) надо будет в них разобраться.. сильная вещь.. но все это время..
Все гости форума могут просматривать этот раздел. Только зарегистрированные пользователи могут создавать новые темы в этом разделе. Только зарегистрированные пользователи могут отвечать на сообщения в этом разделе.