Source for file Component.class.php

Documentation is available at Component.class.php

  1. /**
  2.  * Класс Component.
  3.  *
  4.  * @package energine
  5.  * @subpackage core
  6.  * @author 1m.dm
  7.  * @copyright ColoCall 2006
  8.  * @version $Id: fsource_energine_core_frameworkComponent.class.php.html,v 1.1 2007/09/17 14:32:33 pavka Exp $
  9.  */
  10.  
  11. require_once 'core/framework/ComponentConfig.class.php';
  12. require_once 'core/framework/DBWorker.class.php';
  13. require_once 'core/framework/Request.class.php';
  14. require_once 'core/framework/Builder.class.php';
  15.  
  16. /**
  17.  * Компонент страницы.
  18.  *
  19.  * @package energine
  20.  * @subpackage core
  21.  */
  22. class Component extends DBWorker {
  23.  
  24.     /**
  25.      * Имя действия по-умолчанию.
  26.      */
  27.     const DEFAULT_ACTION_NAME = 'main';
  28.     /**
  29.      * @access protected
  30.      * @var DOMDocument DOM-документ компонента
  31.      */
  32.     protected $doc;
  33.  
  34.     /**
  35.      * @access protected
  36.      * @var Request экземпляр объекта Request
  37.      */
  38.     protected $request;
  39.  
  40.     /**
  41.      * @access protected
  42.      * @var array параметры компонента
  43.      */
  44.     protected $params;
  45.  
  46.     /**
  47.      * @access protected
  48.      * @var Document документ страницы
  49.      */
  50.     protected $document;
  51.  
  52.     /**
  53.      * @access protected
  54.      * @var string имя модуля, которому принадлежит компонент
  55.      */
  56.     protected $module;
  57.  
  58.     /**
  59.      * @access protected
  60.      * @var Response экземпляр объекта Response
  61.      */
  62.     protected $response;
  63.  
  64.     /**
  65.      * @access private
  66.      * @var int уровень прав, необходимый для запуска метода компонента
  67.      */
  68.     private $rights;
  69.  
  70.     /**
  71.      * @access private
  72.      * @var string имя компонента
  73.      */
  74.     private $name;
  75.  
  76.     /**
  77.      * @var boolean Флаг, указывающий на то, является ли компонент активным
  78.      * @access private
  79.      */
  80.  
  81.     private $enabled = true;
  82.     /**
  83.      * @access private
  84.      * @var array параметры действия
  85.      */
  86.     private $actionParams = false;
  87.  
  88.     /**
  89.      * @access private
  90.      * @var array свойства компонента
  91.      */
  92.     private $properties = array();
  93.  
  94.     /**
  95.      * @access private
  96.      * @var array список ошибок, произошедших во время работы компонента
  97.      */
  98.     private $errors = array();
  99.  
  100.     /**
  101.      * Результат является объектом класса DOMNode или boolean:
  102.      * true - компонент отработал успешно, но ничего не вывел;
  103.      * false - произошла ошибка при работе компонента.
  104.      *
  105.      * @access private
  106.      * @var mixed результат работы компонента
  107.      */
  108.     private $result;
  109.  
  110.     /**
  111.      * @access private
  112.      * @var string имя текущего действия компонента
  113.      */
  114.     private $action = self::DEFAULT_ACTION_NAME;
  115.  
  116.     /**
  117.      * @access private
  118.      * @var Builder построитель результата работы компонента
  119.      */
  120.     private $builder = false;
  121.  
  122.     /**
  123.      * @access protected
  124.      * @var ComponentConfig конфигурация компонента
  125.      */
  126.     protected $config;
  127.  
  128.     /**
  129.      * Конструктор класса.
  130.      *
  131.      * @access public
  132.      * @param string $name 
  133.      * @param string $module 
  134.      * @param Document $document 
  135.      * @param array $params 
  136.      * @return void 
  137.      */
  138.     public function __construct($name$moduleDocument $documentarray $params null{
  139.         parent::__construct();
  140.  
  141.         $this->name = $name;
  142.         $this->module = $module;
  143.         $this->document = $document;
  144.         $this->params = $this->defineParams();
  145.         if (is_array($params)) {
  146.             foreach ($params as $name => $value{
  147.                 $this->setParam($name$value);
  148.                 //$this->params[$name] = $value;
  149.             }
  150.         }
  151.         $this->rights $this->getParam('rights');
  152.         $this->response Response::getInstance();
  153.         $this->request Request::getInstance();
  154.         /**
  155.          * @todo Проверить, можно ли перенести в build
  156.          */
  157.         $this->doc new DOMDocument('1.0''UTF-8');
  158.  
  159.         $this->setProperty('template'$template $this->request->getPath(Request::PATH_TEMPLATEtrue));
  160.         $this->setProperty(
  161.             'single_template',
  162.             ($this->document->getProperty('single'$template $template.'single/'.$this->getName().'/')
  163.         );
  164.         $this->config new ComponentConfig($this->getParam('configFilename')get_class($this)$this->module);
  165.  
  166.         $this->determineAction();
  167.     }
  168.  
  169.      /**
  170.       * Возвращает флаг активности компонента
  171.       *
  172.       * @return bool 
  173.       * @access protected
  174.       * @final
  175.       */
  176.  
  177.       final protected function isActive({
  178.          return $this->params['active'];
  179.       }
  180.  
  181.  
  182.     /**
  183.      * Устанавливает построитель компонента.
  184.      *
  185.      * @access protected
  186.      * @final
  187.      * @param Builder $builder 
  188.      * @return void 
  189.      */
  190.     final protected function setBuilder(Builder $builder{
  191.         $this->builder $builder;
  192.     }
  193.  
  194.     /**
  195.      * Возвращает построитель компонента.
  196.      *
  197.      * @access protected
  198.      * @final
  199.      * @return Builder 
  200.      */
  201.     final protected function getBuilder({
  202.         return $this->builder;
  203.     }
  204.  
  205.     /**
  206.      * Определяет допустимые параметры компонента и их значения по-умолчанию
  207.      * в виде массива array(paramName => defaultValue).
  208.      *
  209.      * @access protected
  210.      * @return array 
  211.      */
  212.     protected function defineParams({
  213.         return array(
  214.             'action' => $this->action,
  215.             'rights' => $this->document->getRights(),
  216.             'configFilename' => false,
  217.             'active' => false,
  218.         );
  219.     }
  220.  
  221.     /**
  222.      * Устанавливает значение параметра компонента, если такой существует.
  223.      * В противном случае возбуждается исключение.
  224.      *
  225.      * @access protected
  226.      * @param string $name 
  227.      * @param mixed $value 
  228.      * @return void 
  229.      */
  230.     protected function setParam($name$value{
  231.         if (!isset($this->params[$name])) {
  232.             throw new SystemException('ERR_DEV_NO_PARAM'SystemException::ERR_DEVELOPER$name);
  233.         }
  234.  
  235.         /*if (in_array($name, array('action','configFilename', 'active'))) {
  236.             throw new SystemException('ERR_DEV_INVARIANT_PARAM', SystemException::ERR_DEVELOPER, $name);
  237.         }*/
  238.  
  239.         // если новое значение пустое - оставляем значение по-умолчанию
  240.         if (!empty($value|| $value === false{
  241.             $this->params[$name$value;
  242.         }
  243.     }
  244.  
  245.     /**
  246.      * Возвращает значение параметра компонента, или null, если такого
  247.      * параметра не существует.
  248.      *
  249.      * @access protected
  250.      * @final
  251.      * @param string $name 
  252.      * @return mixed 
  253.      */
  254.     final protected function getParam($name{
  255.         return (isset($this->params[$name]$this->params[$namenull);
  256.     }
  257.  
  258.     /**
  259.      * Определяет текущее действие
  260.      *
  261.      * @return void 
  262.      * @access private
  263.      */
  264.  
  265.     protected  function determineAction({
  266.         //Текущее действие берем из параметров
  267.         //По умолчанию оно равно self::DEFAULT_ACTION_NAME
  268.         $this->action $this->getParam('action');
  269.  
  270.         // если это основной компонент страницы, должен быть конфигурационный файл
  271.         if ($this->isActive()) {
  272.             if ($this->config->isEmpty()) {
  273.                 throw new SystemException('ERR_DEV_NO_COMPONENT_CONFIG'SystemException::ERR_DEVELOPER$this->getName());
  274.             }
  275.  
  276.             // определяем действие по запрошенному URI
  277.             $action $this->config->getActionByURI($this->request->getPath(Request::PATH_ACTIONtrue));
  278.             if ($action !== false{
  279.                 $this->action $action['name'];
  280.                 $this->actionParams $action['params'];
  281.             }
  282.  
  283.         }
  284.         // если имя действия указано в POST-запросе - используем его
  285.         elseif (isset($_POST[$this->getName()]['action'])) {
  286.             $this->action $_POST[$this->getName()]['action'];
  287.         }
  288.         // устанавливаем права на действие из конфигурации, если определены
  289.         if (!$this->config->isEmpty()) {
  290.             $this->config->setCurrentMethod($this->getAction());
  291.  
  292.             if (!is_null($rights $this->config->getCurrentMethodConfig()->getAttribute('rights'))) {
  293.                 $this->rights = (int)$rights;
  294.             }
  295.         }
  296.  
  297.     }
  298.  
  299.     /**
  300.      * Определяет имя текущего действия компонента.
  301.      *
  302.      * @access public
  303.      * @return string 
  304.      * @final
  305.      */
  306.     final public function getAction({
  307.         return $this->action;
  308.     }
  309.  
  310.     /**
  311.      * Возвращает уровень прав пользователя, необходимых для запуска
  312.      * текущего действия компонента.
  313.      *
  314.      * @access public
  315.      * @final
  316.      * @return int 
  317.      */
  318.     final public function getMethodRights({
  319.         return (int)$this->rights;
  320.     }
  321.  
  322.     /**
  323.      * Возвращает имя компонента.
  324.      *
  325.      * @access public
  326.      * @final
  327.      * @return string 
  328.      */
  329.     final public function getName({
  330.         return $this->name;
  331.     }
  332.  
  333.     /**
  334.      * Запускает компонент на исполнение.
  335.      *
  336.      * @access public
  337.      * @final
  338.      * @return void 
  339.      */
  340.     final public function run({
  341.         if (!method_exists($this$this->getAction())) {
  342.             throw new SystemException(
  343.                 'ERR_DEV_NO_ACTION',
  344.                 SystemException::ERR_DEVELOPER,
  345.                 array($this->getAction()$this->getName())
  346.             );
  347.         }
  348.         $this->{$this->getAction()}();
  349.     }
  350.  
  351.     /**
  352.      * Действие по-умолчанию.
  353.      *
  354.      * @access protected
  355.      * @return boolean 
  356.      */
  357.     protected function main({
  358.         $this->prepare()// вызываем метод подготовки данных
  359.         return true;
  360.     }
  361.  
  362.     /**
  363.      * Метод подготовки данных.
  364.      * Вызывается вначале работы метода, реализующего основное действие.
  365.      *
  366.      * @access protected
  367.      * @return void 
  368.      */
  369.      protected function prepare({
  370.      }
  371.      /**
  372.       * Отключает отображение компонента
  373.       *
  374.       * @return void 
  375.       * @access public
  376.       * @final
  377.       */
  378.  
  379.      final public function disable({
  380.          $this->enabled = false;
  381.      }
  382.  
  383.      /**
  384.       * Включает отображение компонента
  385.       *
  386.       * @return void 
  387.       * @access public
  388.       * @final
  389.       */
  390.  
  391.      final public function enable({
  392.          $this->enabled = true;
  393.      }
  394.  
  395.      /**
  396.       * Возвращает активность компонента
  397.       *
  398.       * @return boolean 
  399.       * @access public
  400.       * @final
  401.       */
  402.  
  403.      final public function enabled({
  404.          return $this->enabled;
  405.      }
  406.     /**
  407.      * Устанавливает значение свойства компонента.
  408.      *
  409.      * @access protected
  410.      * @final
  411.      * @param string $propName 
  412.      * @param mixed $propValue 
  413.      * @return void 
  414.      */
  415.     final protected function setProperty($propName$propValue{
  416.         $this->properties[$propName$propValue;
  417.     }
  418.  
  419.     /**
  420.      * Возвращает значение свойства компонента.
  421.      *
  422.      * @access protected
  423.      * @final
  424.      * @param string $propName 
  425.      * @return mixed 
  426.      */
  427.     final protected function getProperty($propName{
  428.         $result false;
  429.         if (isset($this->properties[$propName])) {
  430.             $result $this->properties[$propName];
  431.         }
  432.         return $result;
  433.     }
  434.  
  435.     /**
  436.      * Удаляет свойство компонента.
  437.      *
  438.      * @access protected
  439.      * @final
  440.      * @param string 
  441.      * @return void 
  442.      */
  443.     final protected function removeProperty($propName{
  444.         unset($this->properties[$propName]);
  445.     }
  446.     /**
  447.      * Строит результат работы компонента используя определённый построитель.
  448.      *
  449.      * @access public
  450.      * @return DOMDocument 
  451.      */
  452.     public function build({
  453.         $result $this->doc->createElement('component');
  454.         $result->setAttribute('name'$this->getName());
  455.         $result->setAttribute('module'$this->module);
  456.         $result->setAttribute('componentAction'$this->getAction());
  457.         $result->setAttribute('class'get_class($this));
  458.  
  459.         foreach ($this->properties as $propName => $propValue{
  460.             $result->setAttribute($propName$propValue);
  461.         }
  462.  
  463.         /*
  464.          * Существует ли построитель и правильно ли он отработал?
  465.          * Построитель может не существовать, если мы создаем компонент в котором нет данных.
  466.          */
  467.         if ($this->getBuilder(&& $this->getBuilder()->build()) {
  468.             $result->appendChild(
  469.                 $this->doc->importNode(
  470.                     $this->getBuilder()->getResult(),
  471.                     true
  472.                 )
  473.             );
  474.         }
  475.  
  476.         $this->doc->appendChild($result);
  477.         $result $this->doc;
  478.         return $result;
  479.     }
  480.  
  481.  
  482.  
  483.     /**
  484.      * Генерирует ошибку и добавляет её в список ошибок компонента.
  485.      *
  486.      * @access protected
  487.      * @param int $errorType тип ошибки
  488.      * @param string $errorMessage сообщение об ошибке
  489.      * @param mixed $errorCustomInfo дополнительная информация об ошибке
  490.      * @return void 
  491.      */
  492.     protected function generateError($errorType$errorMessage$errorCustomInfo false{
  493.         $errorInfo array(
  494.             'type' => $errorType,
  495.             'message' => $errorMessage,
  496.             'custom' => $errorCustomInfo
  497.         );
  498.  
  499.         array_push($this->errors$errorInfo);
  500.  
  501.         // если ошибка не позволяет продолжить работу компонента, возбуждаем фиктивное исключение
  502.         if ($errorType == SystemException::ERR_WARNING{
  503.             throw new DummyException;
  504.         }
  505.     }
  506.  
  507.     /**
  508.      * Обрабатывает ошибки, произошедшие во время работы компонента.
  509.      * Возвращает DOMDocument, представляющий ошибки компонента, или
  510.      * false, если никаких ошибок не произошло.
  511.      *
  512.      * @access public
  513.      * @final
  514.      * @return mixed 
  515.      */
  516.     final public function handleErrors({
  517.         $result false;
  518.         if (sizeof($this->errors0{
  519.             $dom_errorDoc new DOMDocument('1.0''UTF-8');
  520.             $dom_errors $dom_errorDoc->createElement('errors');
  521.             $dom_errors->setAttribute('title'$this->translate('TXT_ERRORS'));
  522.             foreach ($this->errors as $errorInfo{
  523.                 $dom_error $dom_errorDoc->createElement('error'$errorInfo['message']);
  524.                 $dom_error->setAttribute('type'$errorInfo['type']);
  525.                 /**
  526.                  * @todo выводить дополнительную информацию только в debug-режиме.
  527.                  */
  528.                 if (isset($errorInfo['custom'])) {
  529.                     if (is_array($errorInfo['custom'])) {
  530.                         $customMessage = implode('. '$errorInfo['custom']);
  531.                     }
  532.                     else {
  533.                         $customMessage $errorInfo['custom'];
  534.                     }
  535.  
  536.                     if (!empty($customMessage)) {
  537.                         $dom_error->nodeValue "{$errorInfo['message']} [ $customMessage ]";
  538.                     }
  539.                     else {
  540.                         $dom_error->nodeValue $errorInfo['message'];
  541.                     }
  542.                 }
  543.                 $dom_errors->appendChild($dom_error);
  544.             }
  545.             $dom_errorDoc->appendChild($dom_errors);
  546.             $result $dom_errorDoc;
  547.         }
  548.         return $result;
  549.     }
  550.  
  551.     /**
  552.      * Возвращает параметры действия.
  553.      *
  554.      * @access protected
  555.      * @return array 
  556.      */
  557.     protected function getActionParams({
  558.         return $this->actionParams;
  559.     }
  560. }

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