Source for file Document.class.php

Documentation is available at Document.class.php

  1. /**
  2.  * Класс Document.
  3.  *
  4.  * @package energine
  5.  * @subpackage core
  6.  * @author dr.Pavka
  7.  * @copyright ColoCall 2006
  8.  * @version $Id: fsource_energine_core_frameworkDocument.class.php.html,v 1.1 2007/09/17 14:32:33 pavka Exp $
  9.  */
  10.  
  11. require_once 'core/framework/DBWorker.class.php';
  12. require_once 'core/framework/AuthUser.class.php';
  13. require_once 'core/framework/Language.class.php';
  14. require_once 'core/framework/Sitemap.class.php';
  15. require_once 'core/framework/Request.class.php';
  16. require_once 'core/framework/Response.class.php';
  17. require_once 'core/framework/ComponentManager.class.php';
  18.  
  19. /**
  20.  * Документ страницы.
  21.  *
  22.  * @package energine
  23.  * @subpackage core
  24.  * @final
  25.  */
  26. final class Document extends DBWorker {
  27.     /**
  28.      * Зарезервированный сегмент URL для single-режима
  29.      */
  30.     const SINGLE_SEGMENT = 'single';
  31.  
  32.     /**
  33.      * Путь к директории с конфигурационными шаблонами
  34.      */
  35.     const TEMPLATES_DIR = 'templates/';
  36.  
  37.     /**
  38.      * @access private
  39.      * @var int идентификатор документа
  40.      */
  41.     private $id = false;
  42.  
  43.     /**
  44.      * @access private
  45.      * @var int идентификатор языка документа
  46.      */
  47.     private $lang;
  48.  
  49.     /**
  50.      * @access protected
  51.      * @var Language информация о языках системы
  52.      */
  53.     protected $language;
  54.  
  55.     /**
  56.      * @access protected
  57.      * @var Sitemap карта сайта
  58.      */
  59.     protected $sitemap;
  60.  
  61.     /**
  62.      * @access private
  63.      * @var Request 
  64.      */
  65.     private $request;
  66.  
  67.     /**
  68.      * @access public
  69.      * @var ComponentManager менеджер компонентов
  70.      */
  71.     public $componentManager;
  72.  
  73.     /**
  74.      * @access private
  75.      * @var DOMDocument результирующий DOM-документ
  76.      */
  77.     private $doc;
  78.  
  79.     /**
  80.      * @access private
  81.      * @var int права пользователя на документ
  82.      */
  83.     private $rights = false;
  84.  
  85.     /**
  86.      * @access private
  87.      * @var array свойства документа
  88.      */
  89.     private $properties = array();
  90.  
  91.     /**
  92.      * @access public
  93.      * @var AuthUser экземпляр класса AuthUser
  94.      * @see AuthUser
  95.      */
  96.     public $user;
  97.  
  98.     /**
  99.      * @access private
  100.      * @var array информация о документе
  101.      * @see Sitemap::getDocumentInfo()
  102.      */
  103.     private $documentInfo = array();
  104.  
  105.     /**
  106.      * Перечень компонентов layout'а
  107.      *
  108.      * @var array 
  109.      * @access private
  110.      */
  111.     private $layoutComponents = array();
  112.  
  113.     /**
  114.      * Перечень компонентов content'а
  115.      *
  116.      * @var array 
  117.      * @access private
  118.      */
  119.     private $contentComponents = array();
  120.  
  121.     /**
  122.      * Конструктор класса.
  123.      *
  124.      * @access public
  125.      * @return void 
  126.      */
  127.     public function __construct({
  128.         parent::__construct();
  129.         $this->user = AuthUser::getInstance();
  130.         $this->language = Language::getInstance();
  131.         $this->lang = $this->language->getCurrent();
  132.         $this->sitemap = Sitemap::getInstance();
  133.         $this->request = Request::getInstance();
  134.         $this->componentManager = new ComponentManager($this);
  135.  
  136.         // получаем идентификатор документа
  137.         $segments $this->request->getPath();
  138.         if (isset($segments[0]&& $segments[0== self::SINGLE_SEGMENT$segments array();
  139.         $this->id = $this->sitemap->getIDByURI($segmentstrue);
  140.         if (empty($this->id)) {
  141.             throw new SystemException('ERR_404'SystemException::ERR_404);
  142.         }
  143.  
  144.         // получаем права пользователя на документ
  145.         $this->rights = $this->sitemap->getDocumentRights($this->getID()$this->user->getGroups());
  146.         if ($this->getRights(== ACCESS_NONE{
  147.             throw new SystemException('ERR_403'SystemException::ERR_403);
  148.         }
  149.  
  150.         // получаем информацию о документе
  151.         $this->documentInfo = $this->sitemap->getDocumentInfo($this->getID());
  152.         //Если его нет в перечне страниц значит он IsDisabled
  153.         if (!$this->documentInfo{
  154.             throw new SystemException('ERR_404'SystemException::ERR_404);
  155.         }
  156.  
  157.         // загружаем компоненты страницы
  158.         $this->loadComponents($this->documentInfo['templateID']);
  159.  
  160.         // устанавливаем свойства документа
  161.         $this->setProperty('langID'$this->getLang());
  162.         $this->setProperty('langAbbr'$this->request->getLangSegment());
  163.         $this->setProperty('base'$this->request->getBasePath());
  164.         $this->setProperty('title'$this->documentInfo['Name']);
  165.         $this->setProperty('keywords'$this->documentInfo['MetaKeywords']);
  166.         $this->setProperty('description'$this->documentInfo['MetaDescription']);
  167.         $this->setProperty('ID'$this->getID());
  168.         $this->setProperty('final'$this->documentInfo['isFinal']);
  169.  
  170.         /*
  171.         * Если в каком-либо компоненте происходит ошибка, не позволяющая ему
  172.         * продолжить работу, генерируется фиктивное исключение, с помощью
  173.         * которого прерывается работа компонента. В дальнейшем, при вызове
  174.         * метода Document::build, происходит обработка всех возникших ошибок.
  175.         */
  176.         try {
  177.             $this->runComponents();
  178.         }
  179.         catch (DummyException $dummyException{}
  180.     }
  181.  
  182.     /**
  183.      * Возвращает идентификатор документа.
  184.      *
  185.      * @access public
  186.      * @return int 
  187.      */
  188.     public function getID({
  189.         return $this->id;
  190.     }
  191.  
  192.     /**
  193.      * Возвращает идентификатор языка документа.
  194.      *
  195.      * @access public
  196.      * @return int 
  197.      */
  198.     public function getLang({
  199.         return $this->lang;
  200.     }
  201.  
  202.     /**
  203.      * Запускает построение компонентов страницы и возвращает результат в виде
  204.      * собранного DOM-документа страницы.
  205.      *
  206.      * @access public
  207.      * @return DOMDocument 
  208.      */
  209.     public function build({
  210.         $this->doc = new DOMDocument('1.0''UTF-8');
  211.         $dom_root $this->doc->createElement('document');
  212.         $dom_root->setAttribute('debug'$this->getConfigValue('site.debug'));
  213.         $this->doc->appendChild($dom_root);
  214.  
  215.         $dom_documentProperties $this->doc->createElement('properties');
  216.         foreach ($this->properties as $propName => $propValue{
  217.             $dom_property $this->doc->createElement('property'str_replace('&''&'$propValue));
  218.             $dom_property->setAttribute('name'$propName);
  219.             $dom_documentProperties->appendChild($dom_property);
  220.         }
  221.         $dom_root->appendChild($dom_documentProperties);
  222.  
  223.         $dom_layout $this->doc->createElement('layout');
  224.         $dom_layout->setAttribute('file'$this->documentInfo['layoutFileName']);
  225.         $dom_content $this->doc->createElement('content');
  226.         $dom_content->setAttribute('file'$this->documentInfo['contentFileName']);
  227.  
  228.         $dom_root->appendChild($dom_layout);
  229.         $dom_root->appendChild($dom_content);
  230.  
  231.         foreach ($this->componentManager->getComponents(as $componentInfo{
  232.             $component $componentInfo['component'];
  233.  
  234.             $componentResult false;
  235.             $dom_errors false;
  236.  
  237.             if ($this->getRights(>= $component->getMethodRights(&& $component->enabled()) {
  238.                 try {
  239.                         $componentResult $component->build();
  240.                 }
  241.                 catch (DummyException $dummyException){}
  242.             }
  243.  
  244.             if ($componentResult{
  245.                 $componentResult $this->doc->importNode(
  246.                 $componentResult->documentElement,
  247.                 true
  248.                 );
  249.  
  250.                 if ($dom_errors{
  251.                     $componentResult->insertBefore($dom_errors$componentResult->firstChild);
  252.                 }
  253.  
  254.                 if ($componentInfo['file'== $this->documentInfo['layoutFileName']{
  255.                     $dom_layout->appendChild($componentResult);
  256.                 }
  257.                 elseif ($componentInfo['file'== $this->documentInfo['contentFileName']{
  258.                     $dom_content->appendChild($componentResult);
  259.                 }
  260.                 else {
  261.                     $dom_root->appendChild($componentResult);
  262.                 }
  263.  
  264.             }
  265.             elseif ($dom_errors{
  266.                 $dom_root->appendChild($dom_errors);
  267.             }
  268.         }
  269.     }
  270.  
  271.     /**
  272.      * Определяет компоненты страницы и загружает их в менеджер компонентов.
  273.      *
  274.      * @access private
  275.      * @param int $templateID идентификатор шаблона страницы
  276.      * @return void 
  277.      * @todo Полный рефакторинг!
  278.      */
  279.     private function loadComponents($templateID{
  280.         // получаем информацию о шаблоне страницы
  281.         $res $this->dbh->select('share_Templates'truearray('tmpl_id' => $templateID));
  282.         if (!is_array($res)) {
  283.             throw new SystemException('ERR_DEV_NO_TEMPLATE_INFO'SystemException::ERR_CRITICAL);
  284.         }
  285.         $templateInfo $res[0];
  286.  
  287.         // определяем и загружаем описания content- и layout- частей страницы
  288.         $this->documentInfo['layoutFileName'self::TEMPLATES_DIR.'layout/'.$templateInfo['tmpl_layout'];
  289.         $this->documentInfo['contentFileName'self::TEMPLATES_DIR.'content/'.$templateInfo['tmpl_content'];
  290.  
  291.         // вызывается ли какой-либо компонент в single режиме?
  292.         $actionParams $this->request->getPath(Request::PATH_ACTION);
  293.         if (sizeof($actionParams&& $actionParams[0== self::SINGLE_SEGMENT{
  294.                 /*
  295.                 * Устанавливаем смещение пути на количество существующих
  296.                 * сегментов + 1 зарезирвированный сегмент + 1 сегмент
  297.                 * имени компонента.
  298.                 */
  299.                 $this->request->setPathOffset($this->request->getPathOffset(2);
  300.                 $this->setProperty('single''single');
  301.                 if ($actionParams[1== 'pageToolBar'{
  302.                     $this->componentManager->addComponent($this->componentManager->createComponent('pageToolBar''share''DivisionEditor'array('action' => 'showPageToolbar')));
  303.                 }
  304.                 // существует ли запрошенный компонент среди компонентов страницы?
  305.                 elseif (
  306.                     !$this->componentManager->loadComponentsFromFile($this->documentInfo['layoutFileName']$actionParams[1])
  307.                     && !$this->componentManager->loadComponentsFromFile($this->documentInfo['contentFileName']$actionParams[1])
  308.                 {
  309.                     throw new SystemException('ERR_NO_SINGLE_COMPONENT'SystemException::ERR_CRITICAL);
  310.                 }
  311.         }
  312.         else {
  313.             $this->componentManager->loadComponentsFromFile($this->documentInfo['layoutFileName']);
  314.             $this->componentManager->loadComponentsFromFile($this->documentInfo['contentFileName']);
  315.             /*
  316.             * Добавляем к набору компонентов страницы
  317.             * обязательные стандартные компоненты:
  318.             *     - ActionSet
  319.             *     - BreadCrumbs
  320.             */
  321.             $this->componentManager->addComponent($this->componentManager->createComponent('pageToolBar''share''DivisionEditor'array('action' => 'showPageToolbar')));
  322.             $this->componentManager->addComponent($this->componentManager->createComponent('breadCrumbs''share''BreadCrumbs'));
  323.         }
  324.     }
  325.  
  326.     /**
  327.      * Запускает работу всех компонентов страницы.
  328.      *
  329.      * @access private
  330.      * @return void 
  331.      */
  332.     private function runComponents({
  333.         foreach ($this->componentManager->getComponents(as $componentInfo{
  334.             $component $componentInfo['component'];
  335.             /*
  336.             * Запускаем определение текущего действия компонента
  337.             * и загрузку конфигурационной информации.
  338.             */
  339.             //$component->getAction();
  340.  
  341.             // если у пользователя достаточно прав - запускаем работу компонента
  342.             if ($this->getRights(>= $component->getMethodRights()) {
  343.                 $component->run();
  344.             }
  345.         }
  346.     }
  347.  
  348.     /**
  349.      * Возвращает результирующий DOM-документ.
  350.      *
  351.      * @access public
  352.      * @return DOMDocument 
  353.      */
  354.     public function getResult({
  355.         return $this->doc;
  356.     }
  357.  
  358.     /**
  359.      * Возвращает объект текущего пользователя.
  360.      *
  361.      * @access public
  362.      * @return AuthUser 
  363.      */
  364.     public function getUser({
  365.         return $this->user;
  366.     }
  367.  
  368.     /**
  369.      * Возвращает права пользователя на документ.
  370.      *
  371.      * @access public
  372.      * @return int 
  373.      */
  374.     public function getRights({
  375.         return $this->rights;
  376.     }
  377.  
  378.     /**
  379.      * Устанавливает значение свойства документа.
  380.      *
  381.      * @access public
  382.      * @param string $propName 
  383.      * @param string $propValue 
  384.      * @return void 
  385.      */
  386.     public function setProperty($propName$propValue{
  387.         $this->properties[$propName$propValue;
  388.     }
  389.  
  390.     /**
  391.      * Возвращает значение свойства документа.
  392.      *
  393.      * @access public
  394.      * @param string $propName 
  395.      * @return string 
  396.      */
  397.     public function getProperty($propName{
  398.         if (isset($this->properties[$propName])) {
  399.             return $this->properties[$propName];
  400.         }
  401.         return false;
  402.     }
  403.  
  404.     /**
  405.      * Удаляет свойство документа.
  406.      *
  407.      * @access protected
  408.      * @param string $propName 
  409.      * @return void 
  410.      */
  411.     protected function removeProperty($propName{
  412.         if (isset($this->properties[$propName])) {
  413.             unset($this->properties[$propName]);
  414.         }
  415.     }
  416.  
  417.     /**
  418.      * Возвращает абсолютный путь
  419.      *
  420.      * @return string 
  421.      * @access public
  422.      */
  423.  
  424.     public function getSiteRoot({
  425.         return dirname($_SERVER['SCRIPT_FILENAME']);
  426.     }
  427. }

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