Генерация карты сайта
Для формирования карты нам не нужны отдельные обращения к файлам данных – весь список разделов в самом начале работы главного скрипта уже считан и размещен в ассоциативном массиве. Список разделов верхнего уровня также выбран в самом начале и уложен в массив. Остается только формировать список, делая выборку подразделов для каждого раздела.
Есть еще одна сложность. Движок может работать с разными форматами ссылок, поэтому для каждого из форматов нам потребуется формировать ссылки по-разному. Как вы помните, для каждого формата ссылок мы предусмотрели отдельный библиотечный файл, который содержит функции формирования меню. Так что просто оформим сборку карты как функцию, напишем ее в разных вариантах для каждого вида ссылок и разложим по библиотекам. Начнем с функции для реальных URL. Она будет находиться в файле m_none.php вместе с другими функциями, обрабатывающими динамические ссылки.
function getmap(&$marr) { global $knot, $_pageid, $hier; $str="\n<ul style=\"list-style: none;\">\n"; foreach ($marr as $knot=>$val) { $str.="<li><a href="; $str.=($val['knot']!='/'? '"main.php?'.$_pageid.'='.$val['knot'].'"':'"/"'); $str.='>'.$val['name']."</a>\n"; $subset=array_filter($hier,'getsub'); if (!empty($subset)) { $str.="<ul style=\"list-style:none;\">\n"; foreach ($subset as $sval) { $str.="<li><a href="; $str.='"main.php?'.$_pageid.'='.$sval['knot'].'">'.$sval['name']."</a>\n"; } $str.="</ul>\n"; } } $str.="</ul>\n"; unset($subset); return $str; }
Работа функции достаточно ясна. Ей передается в качестве параметра массив разделов верхнего уровня. Циклически проходя по массиву, она формирует карту как ненуменованный список. Для каждого раздела выполняется фильтрация его подразделов-потомков (из общего массива разделов). Если есть подразделы, выполняется внутренний цикл с формированием списка подразделов. Таким образом функция собирает двухуровневый список ссылок, где разделы и подразделы видны по отступу.
Для фильтрации подразделов задействована та же функция getsub(), что фильтрует их для меню. Из-за использования в ней глобальной переменной $knot пришлось и здесь сделать ее глобальной. Причем, при проходе по массиву разделов она последовательно меняет значение. Но эта переменная хранит алиас текущего раздела. Значит, перед вызовом функции getmap() переменную нужно сохранить, а потом восстановить ее значение.
В итоге подгружаемый файл для плагина sitemap выглядит совсем просто:
<?php $res_knot=$knot; $outstr=getmap($mainarr); $knot=$res_knot; ?>
Этот файл называется sitemap.inc.php и располагается он в директории /libs вместе с прочими подгружаемыми библиотеками.
Для вариантов с псевдостатикой он совершенно не меняется – достаточно переделать ту же функцию getmap() для генерации нужных ссылок и разместить ее в соответствующем подгружаемом файле. Как вы, вероятно, помните, библиотека для генерирования навигационных ссылок выбирается в зависимости от выбранного формата URL.