Source for file Sitemap.class.php

Documentation is available at Sitemap.class.php

  1. /**
  2.  * Содержит класс Sitemap
  3.  *
  4.  * @package energine
  5.  * @subpackage core
  6.  * @author dr.Pavka
  7.  * @copyright ColoCall 2006
  8.  * @version $Id: fsource_energine_core_frameworkSitemap.class.php.html,v 1.1 2007/09/17 14:32:35 pavka Exp $
  9.  */
  10.  
  11. require_once('core/framework/DBWorker.class.php');
  12. require_once('core/framework/TreeConverter.class.php');
  13.  
  14.  
  15. /**
  16.  * Класс - синглтон
  17.  * Содержит методы по работе со структурой сайта
  18.  *
  19.  * @package energine
  20.  * @subpackage core
  21.  * @final
  22.  */
  23. final class Sitemap extends DBWorker {
  24.     /**
  25.      * @var TreeNodeList Экземпляр класса реализующего работу с древовидными структурами
  26.      * @access private
  27.      */
  28.     private $tree;
  29.  
  30.     /**
  31.      * @var Sitemap Instance объекта Sitemap
  32.      * @access private
  33.      * @static
  34.      */
  35.     private static $instance;
  36.  
  37.     /**
  38.      * Информация о тех разделах, на которіе у юзера есть права
  39.      * @var array 
  40.      * @access private
  41.      */
  42.     private $info = array();
  43.  
  44.     /**
  45.      * Информация обо всех разделах(включая те на которые у текущего юзера нет прав)
  46.      *
  47.      * @var array 
  48.      * @access private
  49.      */
  50.     private $allInfo = array();
  51.  
  52.     /**
  53.      * Идентификатор дефолтной страницы
  54.      * Вынесено в переменную чтоб не дергать запрос постоянно
  55.      *
  56.      * @var int 
  57.      * @access private
  58.      */
  59.     private $defaultID = false;
  60.  
  61.     /**
  62.      * Дефолтные meta keywords
  63.      * Используется для всех страниц у которых не указано
  64.      * Вынесено в отдельную переменную, чтобы не дергать каждый раз запрос
  65.      *
  66.      * @var string 
  67.      * @access private
  68.      */
  69.     private $defaultMetaKeywords;
  70.  
  71.     /**
  72.      * Дефолтное meta description
  73.      *
  74.      * @var string 
  75.      * @access private
  76.      * @see Sitemap::defaultMetaKeywords
  77.      */
  78.     private $defaultMetaDescription;
  79.  
  80.     /**
  81.      * Идентификатор текущего языка
  82.      *
  83.      * @var int 
  84.      * @access private
  85.      */
  86.     private $langID;
  87.  
  88.  
  89.     /**
  90.      * Конструктор класса
  91.      *
  92.      * @return void 
  93.      */
  94.     public function __construct({
  95.         parent::__construct();
  96.         $this->langID = Language::getInstance()->getCurrent();
  97.         //Загружаем идентификаторы для последующего формирования древовидной стркутуры
  98.         //Получаем только идентификаторы разделов
  99.  
  100.         $res $this->dbh->selectRequest('
  101.             SELECT s.smap_id, s.smap_pid FROM share_Sitemap s
  102.             LEFT JOIN share_Sitemap_translation st ON st.smap_id = s.smap_id
  103.             WHERE st.smap_is_disabled = 0 AND st.lang_id = %s AND smap_is_final = 0
  104.             ORDER BY smap_order_num
  105.         '$this->langID);
  106.  
  107.         //Фильтруем перечень идентификаторов отсекая те разделы на которые нет прав
  108.         $res = array_filter($resarray($this'checkPageRights'));
  109.  
  110.         //Загружаем перечень идентификаторов в объект дерева
  111.         $this->tree = TreeConverter::convert($res'smap_id''smap_pid');
  112.  
  113.         //Получаем дефолтные meta заголовки
  114.         $res $this->dbh->select('share_Sitemap_translation'array('smap_meta_keywords''smap_meta_description')array('smap_id' => $this->getDefault()'lang_id' => $this->langID));
  115.         list($res$res;
  116.         $this->defaultMetaKeywords = $res['smap_meta_keywords'];
  117.         $this->defaultMetaDescription = $res['smap_meta_description'];
  118.         $this->info = $this->getSitemapData(array_keys($this->tree->asList()));
  119.     }
  120.  
  121.     /**
  122.      * Возвращает экземпляр  объекта Sitemap
  123.      *
  124.      * @access public
  125.      * @return Sitemap 
  126.      * @static
  127.      */
  128.     public static function getInstance({
  129.         if (!isset(self::$instance)) {
  130.             self::$instance new Sitemap();
  131.         }
  132.         return self::$instance;
  133.     }
  134.  
  135.     /**
  136.      * Метод возвращающий информацию о разделах
  137.      *
  138.      * @param mixed идентификатор раздела или массив идентификаторов
  139.      * @return array 
  140.      * @access private
  141.      */
  142.  
  143.     private function getSitemapData($id{
  144.         if (!is_array($id)) {
  145.             $id array($id);
  146.         }
  147.  
  148.         $ids = implode(','$id);
  149.  
  150.         $result convertDBResult(
  151.             $this->dbh->selectRequest(
  152.                 '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_description_rtf, smap_meta_keywords, smap_meta_description '.
  153.                 'FROM share_Sitemap s '.
  154.                 'LEFT JOIN share_Sitemap_translation st ON s.smap_id = st.smap_id '.
  155.                 'WHERE st.lang_id = '.$this->langID.' AND s.smap_id IN ('.$ids.')'),
  156.             'smap_id'true);
  157.         $result = array_map(array($this'preparePageInfo')$result);
  158.         return $result;
  159.     }
  160.  
  161.  
  162.     /**
  163.      * Внутренний метод по преобразования информации о документе. Сводит все ключи к camel notation и для линка изменяет значение идентификатора шаблона
  164.      *
  165.      * @param array 
  166.      * @return array 
  167.      * @access private
  168.      */
  169.  
  170.     private function preparePageInfo($current{
  171.         $result convertFieldNames($current,'smap');
  172.         if(is_null($result['MetaKeywords'])) $result['MetaKeywords'$this->defaultMetaKeywords;
  173.         if(is_null($result['MetaDescription'])) $result['MetaDescription'$this->defaultMetaDescription;
  174.         return $result;
  175.     }
  176.  
  177.  
  178.     /**
  179.      * Возвращает идентификатор страницы по умолчанию
  180.      *
  181.      * @return int 
  182.      * @access public
  183.      */
  184.  
  185.     public function getDefault({
  186.         if (!$this->defaultID{
  187.             $result simplifyDBResult($this->dbh->select('share_Sitemap''smap_id'array('smap_default' => true))'smap_id'true);
  188.             if ($result === false{
  189.                 throw new SystemException('ERR_DEV_NO_DEFAULT_PAGE'SystemException::ERR_CRITICAL);
  190.             }
  191.  
  192.             $this->defaultID = $result;
  193.         }
  194.         return $this->defaultID;
  195.     }
  196.  
  197.     /**
  198.      * Возвращает часть строки УРЛ по идентификатору
  199.      *
  200.      * @param int 
  201.      * @return string 
  202.      * @access public
  203.      */
  204.  
  205.     public function getURLByID($smapID{
  206.         $result array();
  207.         $node $this->tree->getNodeById($smapID);
  208.         if (!is_null($node)) {
  209.             $parents = array_reverse(array_keys($node->getParents()->asList(false)));
  210.             foreach ($parents as $id{
  211.                 if (isset($this->info[$id])) {
  212.                     $result[$this->info[$id]['Segment'];
  213.                 }
  214.                 else {
  215.                     $res $this->getDocumentInfo($idfalse);
  216.                     $result[$res['Segment'];
  217.                 }
  218.             }
  219.         }
  220.  
  221.         $currentSegment $this->getDocumentInfo($smapID);
  222.         $currentSegment $currentSegment['Segment'];
  223.         $result[$currentSegment;
  224.         $result = implode('/'$result).'/';
  225.         return $result;
  226.     }
  227.  
  228.     /**
  229.      * Возвращает идентификатор страницы по его URL
  230.      *
  231.      * @param array 
  232.      * @return int 
  233.      * @access public
  234.      */
  235.  
  236.     public function getIDByURI(array $segments$useDefaultIfEmpty false{
  237.         $id null;
  238.         $i 1;
  239.         $request Request::getInstance();
  240.  
  241.         if (empty($segments&& $useDefaultIfEmpty{
  242.             return $this->getDefault();
  243.         }
  244.  
  245.         foreach ($segments as $segment{
  246.             $res $this->dbh->select('share_Sitemap'array('smap_id')array('smap_segment' => $segment'smap_pid' => $id));
  247.             if (!is_array($res)) {
  248.                 break;
  249.             }
  250.  
  251.             $request->setPathOffset($i);
  252.             list($res$res;
  253.             $id $res['smap_id'];
  254.             $i++;
  255.         }
  256.  
  257.         return $id;
  258.     }
  259.  
  260.     /**
  261.      * Определение прав набора групп на страницу
  262.      *
  263.      * @param int идентификатор документа
  264.      * @param mixed группа/набор групп, если не указан, берется группа/группы текущего пользователя
  265.      * @return int 
  266.      * @access public
  267.      */
  268.     public function getDocumentRights($docID$groups false{
  269.         if (!$groups{
  270.             $user AuthUser::getInstance();
  271.             $groups $user->getGroups();
  272.         }
  273.         elseif (!is_array($groups)) {
  274.             $groups array($groups);
  275.         }
  276.  
  277.         $result array(ACCESS_NONE);
  278.  
  279.         foreach ($groups as $groupID{
  280.             //для каждой группы определяем уровень прав
  281.             $res $this->dbh->select('share_AccessLevel''right_id'array('smap_id' => $docID'group_id' => $groupID));
  282.             if (is_array($res)) {
  283.                 $result[simplifyDBResult($res'right_id'true);
  284.             }
  285.         }
  286.  
  287.         return max($result);
  288.     }
  289.  
  290.     /**
  291.      * Возвращает меню первого уровня
  292.      *
  293.      * @return array 
  294.      * @access public
  295.      */
  296.  
  297.     public function getMainLevel({
  298.         return $this->buildPagesMap(array_keys($this->tree->asList(false)));
  299.     }
  300.  
  301.  
  302.     /**
  303.      * Возвращает все дочерние разделы
  304.      *
  305.      * @param int идентификатор раздела
  306.      * @return array 
  307.      * @access public
  308.      */
  309.  
  310.     public function getChilds($smapID{
  311.         $result array();
  312.         if ($node $this->tree->getNodeById($smapID)) {
  313.             $result $this->buildPagesMap(array_keys($node->getChildren()->asList(false)));
  314.         }
  315.         return $result;
  316.     }
  317.  
  318.     /**
  319.      * Возвращает массив родителей
  320.      *
  321.      * @param int Идентфикатор раздела
  322.      * @return array 
  323.      * @access public
  324.      */
  325.  
  326.     public function getParents($smapID{
  327.         $node $this->tree->getNodeById($smapID);
  328.         $result array();
  329.         if (!is_null($node)) {
  330.             $result $this->buildPagesMap(array_reverse(array_keys($node->getParents()->asList(false))));
  331.         }
  332.         return $result;
  333.     }
  334.  
  335.     /**
  336.      * По переданному массиву идентификаторов разделов и массиву перечня полей формирует  cтруктуру array('$идентификатор_раздела'=>array())
  337.      *
  338.      * @param array идентификаторы разделов
  339.      * @return array 
  340.      * @access private
  341.      */
  342.  
  343.     private function buildPagesMap($ids{
  344.         $result array();
  345.         if (is_array($ids)) {
  346.             foreach ($ids as $id{
  347.                 $info $this->getDocumentInfo($id);
  348.                 $info['Segment'$this->getURLByID($id);
  349.                 $result[$id$info;
  350.             }
  351.         }
  352.  
  353.         return $result;
  354.     }
  355.  
  356.     /**
  357.      * Возвращает информацию о документе
  358.      * Сначала ищем есть ли документ с нужным идентификатором в $this->info
  359.      * Если его там нет, получаем инфу о нем и добавляем в $this->info
  360.      *
  361.      * @param int Идентификатор раздела
  362.      * @param кешировать ли информацию о странице в $this->info
  363.      * @return array 
  364.      * @access public
  365.      */
  366.  
  367.     public function getDocumentInfo($id$cache true{
  368.         if (!isset($this->info[$id])) {
  369.             $result $this->getSitemapData($id);
  370.             if ($cache{
  371.                 $this->info $this->info $result;
  372.             }
  373.             $result $result[$id];
  374.         }
  375.         else {
  376.             $result $this->info[$id];
  377.         }
  378.  
  379.         return $result;
  380.     }
  381.  
  382.  
  383.     /**
  384.      * Возвращает объект Tree
  385.      *
  386.      * @return TreeNodeList 
  387.      * @access public
  388.      */
  389.  
  390.     public function getTree({
  391.         return $this->tree;
  392.     }
  393.  
  394.     /**
  395.      * Возвращает всю информацию о раздеах в не структурированном виде
  396.      *
  397.      * @return array 
  398.      * @access public
  399.      */
  400.  
  401.     public function getInfo({
  402.         return $this->info;
  403.     }
  404.  
  405.     /**
  406.      * Внутренний метод для фильтрации разделов, на которые нет прав
  407.      * Вызывется как callback для array_filter
  408.      *
  409.      * @param array 
  410.      * @return boolean 
  411.      * @access private
  412.      */
  413.  
  414.     private function checkPageRights($smapInfo{
  415.         return ($this->getDocumentRights($smapInfo['smap_id']!= ACCESS_NONE);
  416.     }
  417. }

Documentation generated on Mon, 17 Sep 2007 13:31:59 +0300 by phpDocumentor 1.4.0a2