Выборка разделов для меню
Чтобы выбрать из массива разделов нужные элементы для меню, не обязательно перебирать массив в цикле. В php очень хорошая библиотека для работы с массивами, в ней есть функция фильтрации array_filter(). В качестве параметров ей нужно передать массив и название пользовательской функции, в которой задано условие фильтрации. В качестве параметра эти функции получают текущий элемент массива, а возвращать должны логическое значение (соответствует ли элемент условию фильтрации). Нам нужно только написать эти функции для трех случаев:
- Выборка всех разделов верхнего уровня;
- Выборка подразделов данного раздела ;
- Выборка подразделов того же раздела, которому принадлежит текущий
Первая функция нужна нам всегда, поскольку главное меню есть на каждой странице. Ее задача – фильтрация разделов по признаку пустого элемента parent. Вызов array_filter() с этой функцией вернет нам массив, состоящий из разделов верхнего уровня.
<?php function getmain ($var) { return ($var['parent']===''); } ?>
Вторая функция нужна в том случае, когда мы находимся в разделе верхнего уровня и выбираем его подразделы для формирования локального меню раздела.
<?php function getsub($var) { global $knot; return ($var['parent']===$knot); } ?>
Но если мы находимся в подразделе, то локальное меню раздела состоит из подразделов с тем же предком, что и у текущего подраздела.
<?php function getlevel($var) { global $parent; return ($var['parent']===$parent); } ?>
Функции для фильтрации готовы. Теперь с их помощью можно получить список разделов для формирования любого меню. Но это лишь выборка разделов. Для сборки строк меню нам нужно сформировать ссылки из наименований и алиасов выбранных разделов. Собрать реальную динамическую ссылку достаточно просто: есть алиас раздела, который будет параметром для основного скрипта, и есть наименование раздела. Для того, чтобы собрать псевдостатическую ссылку, нам нужны правила преобразования.
Вариантов таких ссылок может быть несколько.
В простейшем случае cсылка может быть представлена как имя файла с расширением или без расширения – в этом случае именем файла будет алиас раздела, а нужное расширение (возможно и пустое, т.е. никакого расширения) скрипт должен к нему дописать.
Более сложный случай, когда ссылка формируется как путь по каталогам:
http://domain.ru/page/ – здесь page – алиас раздела верхнего уровня;
http://domain.ru/parent/page/ – в этом примере page – алиас раздела нижнего уровня, а parent – алиас «родительского» раздела.