Генерация карты сайта
Для формирования карты нам не нужны отдельные обращения к файлам данных – весь список разделов в самом начале работы главного скрипта уже считан и размещен в ассоциативном массиве. Список разделов верхнего уровня также выбран в самом начале и уложен в массив. Остается только формировать список, делая выборку подразделов для каждого раздела.
Есть еще одна сложность. Движок может работать с разными форматами ссылок, поэтому для каждого из форматов нам потребуется формировать ссылки по-разному. Как вы помните, для каждого формата ссылок мы предусмотрели отдельный библиотечный файл, который содержит функции формирования меню. Так что просто оформим сборку карты как функцию, напишем ее в разных вариантах для каждого вида ссылок и разложим по библиотекам. Начнем с функции для реальных 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.

