Source for file ComponentConfig.class.php
Documentation is available at ComponentConfig.class.php
* Содержит класс ComponentConfig
* @copyright Energine 2007
//require_once('core/framework/Object.class.php');
//require_once('core/framework/ConfigElement.class.php');
* Класс реализующий работу с конфигурационным файлом компонента
* Путь к директории, содержащей пользовательские файлы конфигурации для компонентов
* Путь к директории, содержащей файлы конфигурации для стандартных компонентов
* (вместо %s будет подставлено имя модуля, содержащего компонент)
* @param string имя конфигурационного файла
public function __construct($configFileName, $className, $moduleName) {
$configFileName = ($param = $this->getConfigPath($configFileName, $moduleName))? $param: $this->getConfigPath($className. '.component.xml', $moduleName);
* Возвращает полный путь к конфигурационному файлу, или false если файл не существует.
* @param string $configFilename имя конфигурационного файла
if ($configFilename && !file_exists($file = $configFilename))
//Смотрим в директории с пользовательскими конфигами
if (!file_exists($file = self::SITE_CONFIG_DIR. $configFilename)) {
//если файла с указанным именем нет ни в папке с пользовательскими конфигами, ни в папке модуля с конфигами
//throw new SystemException('ERR_DEV_NO_CONFIG', SystemException::ERR_DEVELOPER, $configFilename);
* Устанавливает имя текущего метода
* @param string имя метода
* Возвращает конфигурацию текущего метода
* Возвращает флаг того, что конфиг пустой
return ($this->config)? false: true;
* Возвращает имя действия из конфигурации, основываясь на URI запроса.
foreach ($this->config->methods->method as $method) {
if (isset ($method->uri_patterns->pattern)) {
foreach ($method->uri_patterns->pattern as $pattern) {
$patterns[$pattern->getValue()] = $method->getAttribute('name');
// сортируем шаблоны URI от более специфичных к менее специфичным
//uksort($patterns,array('ComponentConfig', 'uriPatternsCmp'));
* @todo Нужно заменить на uksort когда будет ликвидирован глюк с segfault
$patterns = $this->sortByKeys($patterns, array('ComponentConfig','uriPatternsCmp'));
foreach ($patterns as $pattern => $methodName) {
array('/', '[int]', '[string]', '[any]\/', '[any]'),
array('\/', '(\d+)', '([^\/]+)', '(.*)', '(.*)'),
if (preg_match("/^$regexpr$/", $path, $matches)) {
if (strpos($pattern, '[any]') !== false) {
$actionName = $methodName;
$actionParams = $matches;
//inspect($this->getName());
//$this->request->setPathOffset($this->request->getPathOffset()+sizeof($actionParams));
if ($actionName == false) {
return array('name' => $actionName, 'params' => $actionParams);
* Возвращает конфигурацию для указанного метода.
* @param string $methodName имя метода
* @return SimpleXMLElement
$methodConfig = $this->config->xpath(sprintf('/configuration/methods/method[@name=\'%s\']', $methodName));
if (!empty($methodConfig)) {
$result = $methodConfig[0];
* Возвращает флаг, указывающий какой из предложенных паттернов более специфичен
* Вызывается как callback для uksort
* @param string $patternA
* @param string $patternB
$placeholders = array('/[int]/', '/[string]/', '/[any]/');
if (in_array($patternA, $placeholders)) {
elseif (in_array($patternB, $placeholders)) {
//Получаем исходное количество элементов в массиве
//до тех пор пока размер результирующего массива меньше размера исходного масива
while (sizeof($result)< $arrayLength){
$currentElement = array(key($data) => current($data));
$currentElement = array(key($data) => current($data));
unset ($data[key($currentElement)]);
|