Source for file Sitemap.class.php
Documentation is available at Sitemap.class.php
* @copyright Energine 2006
//require_once('core/framework/DBWorker.class.php');
//require_once('core/framework/TreeConverter.class.php');
* Содержит методы по работе со структурой сайта
* @todo проблема с конечными страницами
* @var TreeNodeList Экземпляр класса реализующего работу с древовидными структурами
* @var Sitemap Instance объекта Sitema
private static $instance;
* Информация о тех разделах, на которіе у юзера есть права
* Информация обо всех разделах(включая те на которые у текущего юзера нет прав)
* Идентификатор дефолтной страницы
* Вынесено в переменную чтоб не дергать запрос постоянно
* Дефолтные meta keywords
* Используется для всех страниц у которых не указано
* Вынесено в отдельную переменную, чтобы не дергать каждый раз запрос
* Дефолтное meta description
* @see Sitemap::defaultMetaKeywords
* Идентификатор текущего языка
* Кеширование уровней доступа
//Кешируем уровни доступа к страницам сайта
//[идентификатор раздела][идентификатор роли] = идентификатор уровня доступа
foreach ($this->dbh->select('share_access_level') as $data) {
foreach ($userGroups as $groupID) {
//todo проверить вариант с пересечением array_diff
$this->cacheAccessLevels[$data['smap_id']][$data['group_id']] = (int) $data['right_id'];
//Загружаем идентификаторы для последующего формирования древовидной стркутуры
//Получаем только идентификаторы разделов
$res = $this->dbh->selectRequest(
'SELECT s.smap_id, s.smap_pid FROM share_sitemap s '.
'LEFT JOIN share_sitemap_translation st ON st.smap_id = s.smap_id '.
'WHERE st.smap_is_disabled = 0 AND st.lang_id = %s '.
'ORDER BY smap_order_num'
//inspect($this->resetTimer());
//Фильтруем перечень идентификаторов отсекая те разделы на которые нет прав
//inspect($this->resetTimer());
//Загружаем перечень идентификаторов в объект дерева
//inspect($this->resetTimer());
//Получаем дефолтные meta заголовки
$res = $this->dbh->select('share_sitemap_translation', array('smap_meta_keywords', 'smap_meta_description'), array('smap_id' => $this->getDefault(), 'lang_id' => $this->langID));
* Возвращает экземпляр объекта Sitemap
if (!isset (self::$instance)) {
self::$instance = new Sitemap();
* Метод возвращающий информацию о разделах
* @param mixed идентификатор раздела или массив идентификаторов
$this->dbh->selectRequest(
'SELECT s.smap_id, s.smap_pid, s.tmpl_id as templateID, s.smap_segment as Segment, s.smap_is_final as isFinal, st.smap_name, smap_redirect_url, smap_description_rtf, smap_html_title, smap_meta_keywords, smap_meta_description '.
'LEFT JOIN share_sitemap_translation st ON s.smap_id = st.smap_id '.
'WHERE st.lang_id = '. $this->langID. ' AND s.smap_id IN ('. $ids. ')'),
$result = array_map(array($this, 'preparePageInfo'), $result);
foreach ($this->info as $key=> $value){
* Внутренний метод по преобразования информации о документе. Сводит все ключи к camel notation и для линка изменяет значение идентификатора шаблона
if($result['RedirectUrl']) $result['RedirectUrl'] = (URI::validate($result['RedirectUrl']))? $result['RedirectUrl']: Request::getInstance()->getBasePath(). $result['RedirectUrl'];
* Возвращает идентификатор страницы по умолчанию
$result = simplifyDBResult($this->dbh->select('share_sitemap', 'smap_id', array('smap_default' => true)), 'smap_id', true);
* Возвращает часть строки УРЛ по идентификатор
* @todo Ошибка с вычислением URL для конечных разделов
foreach ($parents as $id) {
if (isset ($this->info[$id])) {
$result[] = $this->info[$id]['Segment'];
$result[] = $res['Segment'];
$currentSegment = $currentSegment['Segment'];
$result[] = $currentSegment;
$result = implode('/', $result). '/';
* Возвращает идентификатор страницы по его URL
public function getIDByURI(array $segments, $useDefaultIfEmpty = false) {
$request = Request::getInstance();
if (empty($segments) && $useDefaultIfEmpty) {
foreach ($segments as $segment) {
$res = $this->dbh->select('share_sitemap', array('smap_id'), array('smap_segment' => $segment, 'smap_pid' => $id));
$request->setPathOffset($i);
* Определение прав набора групп на страницу
* @param int идентификатор документа
* @param mixed группа/набор групп, если не указан, берется группа/группы текущего пользовател
$groups = array($groups);
* Возвращает меню первого уровн
* Возвращает все дочерние разделы
* @param int идентификатор раздела
if ($node = $this->tree->getNodeById($smapID)) {
$node = $this->tree->getNodeById($smapID);
* Возвращает массив родителей
* @param int Идентфикатор раздела
$node = $this->tree->getNodeById($smapID);
* По переданному массиву идентификаторов разделов и массиву перечня полей формирует cтруктуру array('$идентификатор_раздела'=>array())
* @param array идентификаторы разделов
* Возвращает информацию о документе
* Ищем документ с нужным идентификатором в $this->info
* @param int Идентификатор раздела
if(isset ($this->info[$id]))
$result = $this->info[$id];
* Возвращает всю информацию о раздеах в не структурированном виде
* Внутренний метод для фильтрации разделов, на которые нет прав
* Вызывется как callback для array_filter
|