Source for file ComponentManager.class.php

Documentation is available at ComponentManager.class.php

  1. /**
  2.  * Класс ComponentManager.
  3.  *
  4.  * @package energine
  5.  * @subpackage core
  6.  * @author dr.Pavka
  7.  * @copyright ColoCall 2006
  8.  * @version $Id: fsource_energine_core_frameworkComponentManager.class.php.html,v 1.1 2007/09/17 14:32:33 pavka Exp $
  9.  */
  10.  
  11. require_once 'core/framework/SystemConfig.class.php';
  12.  
  13. /**
  14.  * Менеджер набора компонентов документа.
  15.  *
  16.  * @package energine
  17.  * @subpackage core
  18.  */
  19. class ComponentManager extends SystemConfig {
  20.  
  21.     /**
  22.      * Путь к директории пользовательских компонентов
  23.      */
  24.     const SITE_COMPONENTS_DIR = 'site/components/';
  25.  
  26.     /**
  27.      * Путь к директори компонентов стандартных модулей,
  28.      * где %s заменяется именем модуля
  29.      */
  30.     const CORE_COMPONENTS_DIR = 'core/modules/%s/components/';
  31.  
  32.     /**
  33.      * Путь к директории каркаса системы
  34.      */
  35.     const CORE_FRAMEWORK_DIR = 'core/framework/';
  36.  
  37.     /**
  38.      * @access private
  39.      * @var array набор компонентов
  40.      */
  41.     private $components = array();
  42.  
  43.     /**
  44.      * @access private
  45.      * @var Document документ
  46.      */
  47.     private $document;
  48.  
  49.     /**
  50.      * Конструктор класса.
  51.      *
  52.      * @access public
  53.      * @param Document $document 
  54.      * @return void 
  55.      */
  56.     public function __construct(Document $document{
  57.         parent::__construct();
  58.  
  59.         $this->document = $document;
  60.     }
  61.  
  62.  
  63.     /**
  64.      * Добавляет компонент.
  65.      *
  66.      * @access public
  67.      * @param Component $component 
  68.      * @param string имя файла шаблона в котором находится компонент
  69.      * @return void 
  70.      */
  71.     public function addComponent(Component $component$fileName false{
  72.         $this->components[$component->getName()array(
  73.             'component' => $component,
  74.             'file' => $fileName
  75.         );
  76.     }
  77.  
  78.     /**
  79.      * Возвращает компонент с указанным именем.
  80.      *
  81.      * @access public
  82.      * @param string $name имя компонента
  83.      * @return Component 
  84.      */
  85.     public function getComponentByName($name{
  86.         $result false;
  87.         if (isset($this->components[$name])) {
  88.             $result $this->components[$name]['component'];
  89.         }
  90.         return $result;
  91.     }
  92.  
  93.     /**
  94.      * Возвращает набор компонентов по имени класса.
  95.      *
  96.      * @access public
  97.      * @param string $className имя класса
  98.      * @return array 
  99.      */
  100.     public function getComponentsByClassName($className{
  101.         $result array();
  102.         foreach ($this->components as $componentName => $component{
  103.             if (get_class($component['component']== $className{
  104.                 $result[$componentName$component['component'];
  105.             }
  106.         }
  107.  
  108.         return $result;
  109.     }
  110.  
  111.     /**
  112.      * Загружает описания компонентов из файла шаблона(layout или content)
  113.      *
  114.      * @param string имя файла content'а или layout'а
  115.      * @param string имя компонента который нужно загрузить
  116.      * @return bool Возвращает флаг указівающий на то загружены ли компоненты
  117.      * @access public
  118.      */
  119.  
  120.     public function loadComponentsFromFile($fileName$onlyComponent false{
  121.         $result false;
  122.         //проверяем существует ли такой файл
  123.         if (!file_exists($fileName)) {
  124.             throw new SystemException('ERR_DEV_NO_TEMPLATE_FILE'SystemException::ERR_CRITICAL$fileName);
  125.         }
  126.         //и можно ли из него загрузить данные
  127.         if (!($file = simplexml_load_file($fileName))) {
  128.             throw new SystemException('ERR_DEV_BAD_TEMPLATE_FILE'SystemException::ERR_CRITICAL$fileName);
  129.         }
  130.         if ($onlyComponent{
  131.             $components $file->xpath("/*/component[@name='".$onlyComponent."']");
  132.         }
  133.         else {
  134.             $components $file->xpath('/*/component');
  135.         }
  136.  
  137.         if (!empty($components)) {
  138.             $result true;
  139.             foreach ($components as $componentDescription{
  140.                 $this->addComponent($this->createComponentFromXML($componentDescription)$fileName);
  141.                }
  142.         }
  143.  
  144.         return $result;
  145.  
  146.     }
  147.  
  148.     /**
  149.      * Создание компонента из XML описания
  150.      *
  151.      * @param SimpleXMLElement описание компонента
  152.      * @return Component 
  153.      * @access public
  154.      */
  155.  
  156.     public function createComponentFromXML(SimpleXMLElement $componentDescription{
  157.         // перечень необходимых атрибутов компонента
  158.         $requiredAttributes array('name''module''class');
  159.  
  160.         //после отработки итератора должны получить $name, $module, $class
  161.         foreach ($requiredAttributes as $attrName{
  162.             if (!isset($componentDescription[$attrName])) {
  163.                 throw new SystemException("ERR_DEV_NO_REQUIRED_ATTRIB $attrName"SystemException::ERR_DEVELOPER);
  164.             }
  165.             $$attrName = (string)$componentDescription[$attrName];
  166.         }
  167.  
  168.  
  169.         // извлекаем параметры компонента
  170.         $params null;
  171.         if (isset($componentDescription->params)) {
  172.             $params array();
  173.             foreach ($componentDescription->params->param as $tagName => $paramDescr{
  174.                 if ($tagName == 'param'{
  175.                     if (isset($paramDescr['name'])) {
  176.                         $params[(string)$paramDescr['name']] = (string)$paramDescr;
  177.                     }
  178.                 }
  179.             }
  180.         }
  181.  
  182.         $component $this->createComponent($name$module$class$params);
  183.  
  184.         return $component;
  185.     }
  186.  
  187.     /**
  188.      * Создает компонент.
  189.      *
  190.      * @access public
  191.      * @param string $name 
  192.      * @param string $module 
  193.      * @param string $class 
  194.      * @param array $params 
  195.      * @return Component 
  196.      */
  197.     public function createComponent($name$module$class$params null{
  198.         switch ($module{
  199.             case 'site':
  200.                 $componentFilename self::SITE_COMPONENTS_DIR;
  201.                 break;
  202.             case 'core':
  203.                 $componentFilename self::CORE_FRAMEWORK_DIR;
  204.                 break;
  205.             default:
  206.                 $componentFilename = sprintf(self::CORE_COMPONENTS_DIRstrtolower($module));
  207.         }
  208.  
  209.         $componentFilename .= "$class.class.php";
  210.         if (!file_exists($componentFilename)) {
  211.             throw new SystemException('ERR_DEV_NO_COMPONENT_FILE'SystemException::ERR_DEVELOPER$componentFilename);
  212.         }
  213.  
  214.         require_once($componentFilename);
  215.         if (!class_exists($class)) {
  216.             throw new SystemException('ERR_DEV_NO_CLASS'SystemException::ERR_DEVELOPER$class);
  217.         }
  218.  
  219.         $result new $class($name$module$this->document$params);
  220.         return $result;
  221.     }
  222.     /**
  223.      * Возвращает набор компонентов
  224.      *
  225.      * @return array 
  226.      * @access public
  227.      */
  228.  
  229.     public function getComponents({
  230.         return $this->components;
  231.     }
  232.  
  233. }

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