Source for file ComponentConfig.class.php

Documentation is available at ComponentConfig.class.php

  1. /**
  2.  * Содержит класс ComponentConfig
  3.  *
  4.  * @package energine
  5.  * @subpackage core
  6.  * @author dr.Pavka
  7.  * @copyright ColoCall 2007
  8.  * @version $Id: fsource_energine_core_frameworkComponentConfig.class.php.html,v 1.1 2007/09/17 14:32:33 pavka Exp $
  9.  */
  10.  
  11. require_once('core/framework/Object.class.php');
  12. require_once('core/framework/ConfigElement.class.php');
  13. /**
  14.  * Класс реализующий работу с конфигурационным файлом компонента
  15.  *
  16.  * @package energine
  17.  * @subpackage core
  18.  * @final
  19.  */
  20. final class ComponentConfig extends Object {
  21.     /**
  22.      * Путь к директории, содержащей пользовательские файлы конфигурации для компонентов
  23.      */
  24.     const SITE_CONFIG_DIR = 'site/config/';
  25.  
  26.     /**
  27.      * Путь к директории, содержащей файлы конфигурации для стандартных компонентов
  28.      * (вместо %s будет подставлено имя модуля, содержащего компонент)
  29.      */
  30.     const CORE_CONFIG_DIR = 'core/modules/%s/config/';
  31.  
  32.     /**
  33.      * Конфигурационный файл
  34.      *
  35.      * @var SimpleXMLElement 
  36.      * @access private
  37.      */
  38.     private $config = false;
  39.  
  40.     /**
  41.      * Имя текущего метода
  42.      *
  43.      * @var ConfigElement 
  44.      * @access private
  45.      */
  46.     private $currentMethod = false;
  47.  
  48.     /**
  49.      * Конструктор класса
  50.      *
  51.      * @param string имя конфигурационного файла
  52.      * @return void 
  53.      */
  54.  
  55.     public function __construct($configFileName$className$moduleName{
  56.         parent::__construct();
  57.         $configFileName ($param $this->getConfigPath($configFileName$moduleName))?$param:$this->getConfigPath($className.'.component.xml'$moduleName);
  58.  
  59.         if ($configFileName{
  60.             try {
  61.                 $this->config = simplexml_load_file($configFileName'ConfigElement');
  62.             }
  63.             catch (Exception  $e{
  64.                 throw new SystemException('ERR_DEV_BAD_CONFIG_FILE'SystemException::ERR_DEVELOPER$configFileName);
  65.             }
  66.         }
  67.     }
  68.  
  69.     /**
  70.      * Возвращает полный путь к конфигурационному файлу, или false если файл не существует.
  71.      *
  72.      * @access private
  73.      * @param string $configFilename имя конфигурационного файла
  74.      * @return mixed 
  75.      */
  76.     private function getConfigPath($configFilename$moduleName{
  77.         $file false;
  78.         if ($configFilename && !file_exists($file $configFilename))
  79.         //Смотрим в директории с пользовательскими конфигами
  80.         if (!file_exists($file self::SITE_CONFIG_DIR.$configFilename)) {
  81.             if(!file_exists($file = sprintf(self::CORE_CONFIG_DIR$moduleName).$configFilename)){
  82.             //если файла с указанным именем нет ни в папке с пользовательскими конфигами, ни в папке модуля с конфигами
  83.             //throw new SystemException('ERR_DEV_NO_CONFIG', SystemException::ERR_DEVELOPER, $configFilename);
  84.             $file false;
  85.             }
  86.         }
  87.         return $file;
  88.     }
  89.     /**
  90.      * Устанавливает имя текущего метода
  91.      *
  92.      * @param string имя метода
  93.      * @return void 
  94.      * @access public
  95.      */
  96.  
  97.     public function setCurrentMethod($methodName{
  98.         if(!($this->currentMethod = $this->getMethodConfig($methodName))){
  99.             throw new SystemException('ERR_NO_METHOD'SystemException::ERR_DEVELOPER);
  100.         }
  101.     }
  102.  
  103.     /**
  104.      * Возвращает конфигурацию текущего метода
  105.      *
  106.      * @return ConfigElement 
  107.      * @access public
  108.      */
  109.  
  110.     public function getCurrentMethodConfig({
  111.         return $this->currentMethod;
  112.     }
  113.  
  114.     /**
  115.      * Возвращает флаг того, что конфиг пустой
  116.      *
  117.      * @return boolean 
  118.      * @access public
  119.      */
  120.  
  121.     public function isEmpty({
  122.         return ($this->config)?false:true;
  123.     }
  124.  
  125.     /**
  126.      * Возвращает имя действия из конфигурации, основываясь на URI запроса.
  127.      *
  128.      * @access public
  129.      * @return array 
  130.      */
  131.     public function getActionByURI($path{
  132.         $actionName false;
  133.         $actionParams array();
  134.         $path '/'.$path;
  135.  
  136.         $patterns array();
  137.         foreach ($this->config->methods->method as $method{
  138.             if (isset($method->uri_patterns->pattern)) {
  139.                 foreach ($method->uri_patterns->pattern as $pattern{
  140.                     $patterns[$pattern->getValue()$method->getAttribute('name');
  141.                 }
  142.             }
  143.         }
  144.  
  145.         // сортируем шаблоны URI от более специфичных к менее специфичным
  146.         //uksort($patterns,array('ComponentConfig', 'uriPatternsCmp'));
  147.         /**
  148.          * @todo Нужно заменить на uksort когда будет ликвидирован глюк с segfault
  149.          */
  150.         $patterns $this->sortByKeys($patternsarray('ComponentConfig','uriPatternsCmp'));
  151.  
  152.         foreach ($patterns as $pattern => $methodName{
  153.             $regexpr = str_replace(
  154.                 array('/',  '[int]''[string]''[any]\/''[any]'),
  155.                 array('\/''(\d+)''([^\/]+)''(.*)',    '(.*)'),
  156.                 $pattern
  157.             );
  158.             if (preg_match("/^$regexpr$/"$path$matches)) {
  159.                 array_shift($matches);
  160.                 if (strpos($pattern'[any]'!== false{
  161.                     array_pop($matches);
  162.                 }
  163.                 $actionName $methodName;
  164.                 $actionParams $matches;
  165.                 //inspect($this->getName());
  166.                 //$this->request->setPathOffset($this->request->getPathOffset()+sizeof($actionParams));
  167.                 break;
  168.             }
  169.         }
  170.  
  171.         if ($actionName == false{
  172.             return false;
  173.         }
  174.  
  175.         return array('name' => $actionName'params' => $actionParams);
  176.     }
  177.  
  178.     /**
  179.      * Возвращает конфигурацию для указанного метода.
  180.      *
  181.      * @access public
  182.      * @param string $methodName имя метода
  183.      * @return SimpleXMLElement 
  184.      */
  185.     public function getMethodConfig($methodName{
  186.         $result false;
  187.         if (!$this->isEmpty()) {
  188.             $methodConfig $this->config->xpath(sprintf('/configuration/methods/method[@name=\'%s\']'$methodName));
  189.             if (!empty($methodConfig)) {
  190.                 $result $methodConfig[0];
  191.             }
  192.         }
  193.         return $result;
  194.     }
  195.  
  196.     /**
  197.      * Возвращает флаг, указывающий какой из предложенных паттернов более специфичен
  198.      * Вызывается как callback для uksort
  199.      *
  200.      * @access private
  201.      * @param string $patternA 
  202.      * @param string $patternB 
  203.      * @return int 
  204.      * @static
  205.      */
  206.  
  207.     static private function uriPatternsCmp($patternA$patternB{
  208.         $placeholders array('/[int]/''/[string]/''/[any]/');
  209.         if (in_array($patternA$placeholders)) {
  210.             $result 1;
  211.         }
  212.         elseif (in_array($patternB$placeholders)) {
  213.             $result = -1;
  214.         }
  215.         else {
  216.             $result = -(strlen($patternA- strlen($patternB));
  217.         }
  218.  
  219.         return $result;
  220.     }
  221.  
  222.     /**
  223.      * Аналог uksort
  224.      *
  225.      * @return array 
  226.      * @access public
  227.      */
  228.  
  229.     public function sortByKeys($data$callback{
  230.         $result array();
  231.         //Получаем исходное количество элементов в массиве
  232.         $arrayLength = sizeof($data);
  233.  
  234.         //до тех пор пока размер результирующего массива меньше размера исходного масива
  235.         while (sizeof($result)<$arrayLength){
  236.             $currentElement array(key($data=> current($data));
  237.             do {
  238.                 if (($haveNext = next($data)) && (call_user_func($callbackkey($currentElement)key($data))<0)){
  239.                     $currentElement array(key($data=> current($data));
  240.                 }
  241.             }
  242.             while($haveNext);
  243.  
  244.             $result = array_merge($currentElement$result);
  245.             unset($data[key($currentElement)]);
  246.             reset($data);
  247.         }
  248.         return $result;
  249.     }
  250. }

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