Быстрая CMS
Обратная связь Карта сайта
Главная Создание сайтов Практика Строим CMS Наивное О проекте Блог

Генерация карты сайта

Для формирования карты нам не нужны отдельные обращения к файлам данных – весь список разделов в самом начале работы главного скрипта уже считан и размещен в ассоциативном массиве. Список разделов верхнего уровня также выбран в самом начале и уложен в массив. Остается только формировать список, делая выборку подразделов для каждого раздела.

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