<?php
/**
* ÐлаÑÑ ComponentManager.
*
* @package energine
* @subpackage core
* @author dr.Pavka
* @copyright ColoCall 2006
* @version $Id: ComponentManager.class.php,v 1.10 2008/04/02 16:13:52 pavka Exp $
*/
//require_once('core/framework/SystemConfig.class.php');
/**
* ÐÐµÐ½ÐµÐ´Ð¶ÐµÑ Ð½Ð°Ð±Ð¾Ñа компоненÑов докÑменÑа.
*
* @package energine
* @subpackage core
* @final
*/
final class ComponentManager extends Object {
/**
* @access private
* @var array Ð½Ð°Ð±Ð¾Ñ ÐºÐ¾Ð¼Ð¿Ð¾Ð½ÐµÐ½Ñов
*/
private $components = array();
/**
* @access private
* @var Document докÑменÑ
*/
private $document;
/**
* ÐонÑÑÑÑкÑÐ¾Ñ ÐºÐ»Ð°ÑÑа.
*
* @access public
* @param Document $document
* @return void
*/
public function __construct(Document $document) {
parent::__construct();
$this->document = $document;
}
/**
* ÐобавлÑÐµÑ ÐºÐ¾Ð¼Ð¿Ð¾Ð½ÐµÐ½Ñ.
*
* @access public
* @param Component $component
* @param string Ð¸Ð¼Ñ Ñайла Ñаблона в коÑоÑом наÑ
одиÑÑÑ ÐºÐ¾Ð¼Ð¿Ð¾Ð½ÐµÐ½Ñ
* @return void
*/
public function addComponent(Component $component, $fileName = false) {
$this->components[$component->getName()] = array(
'component' => $component,
'file' => $fileName
);
}
/**
* ÐозвÑаÑÐ°ÐµÑ ÐºÐ¾Ð¼Ð¿Ð¾Ð½ÐµÐ½Ñ Ñ ÑказаннÑм именем.
*
* @access public
* @param string $name Ð¸Ð¼Ñ ÐºÐ¾Ð¼Ð¿Ð¾Ð½ÐµÐ½Ñа
* @return Component
*/
public function getComponentByName($name) {
$result = false;
if (isset($this->components[$name])) {
$result = $this->components[$name]['component'];
}
return $result;
}
/**
* ÐозвÑаÑÐ°ÐµÑ Ð½Ð°Ð±Ð¾Ñ ÐºÐ¾Ð¼Ð¿Ð¾Ð½ÐµÐ½Ñов по имени клаÑÑа.
*
* @access public
* @param string $className Ð¸Ð¼Ñ ÐºÐ»Ð°ÑÑа
* @return array
*/
public function getComponentsByClassName($className) {
$result = array();
foreach ($this->components as $componentName => $component) {
if (get_class($component['component']) == $className) {
$result[$componentName] = $component['component'];
}
}
return $result;
}
/**
* ÐагÑÑÐ¶Ð°ÐµÑ Ð¾Ð¿Ð¸ÑÐ°Ð½Ð¸Ñ ÐºÐ¾Ð¼Ð¿Ð¾Ð½ÐµÐ½Ñов из Ñайла Ñаблона(layout или content)
*
* @param string Ð¸Ð¼Ñ Ñайла content'а или layout'а
* @param string Ð¸Ð¼Ñ ÐºÐ¾Ð¼Ð¿Ð¾Ð½ÐµÐ½Ñа коÑоÑÑй нÑжно загÑÑзиÑÑ
* @return bool ÐозвÑаÑÐ°ÐµÑ Ñлаг ÑказÑваÑÑий на Ñо загÑÑÐ¶ÐµÐ½Ñ Ð»Ð¸ компоненÑÑ
* @access public
*/
public function loadComponentsFromFile($fileName, $onlyComponent = false) {
$result = false;
//пÑовеÑÑем ÑÑÑеÑÑвÑÐµÑ Ð»Ð¸ Ñакой Ñайл
if (!file_exists($fileName)) {
throw new SystemException('ERR_DEV_NO_TEMPLATE_FILE', SystemException::ERR_CRITICAL, $fileName);
}
//и можно ли из него загÑÑзиÑÑ Ð´Ð°Ð½Ð½Ñе
if (!($file = simplexml_load_file($fileName))) {
throw new SystemException('ERR_DEV_BAD_TEMPLATE_FILE', SystemException::ERR_CRITICAL, $fileName);
}
if ($onlyComponent) {
$components = $file->xpath("/*/component[@name='".$onlyComponent."']");
}
else {
$components = $file->xpath('/*/component');
}
if (!empty($components)) {
$result = true;
foreach ($components as $componentDescription) {
$this->addComponent($this->createComponentFromXML($componentDescription), $fileName);
}
}
return $result;
}
/**
* Создание компоненÑа из XML опиÑаниÑ
*
* @param SimpleXMLElement опиÑание компоненÑа
* @return Component
* @access public
*/
public function createComponentFromXML(SimpleXMLElement $componentDescription) {
// пеÑеÑÐµÐ½Ñ Ð½ÐµÐ¾Ð±Ñ
одимÑÑ
аÑÑибÑÑов компоненÑа
$requiredAttributes = array('name', 'module', 'class');
//поÑле оÑÑабоÑки иÑеÑаÑоÑа Ð´Ð¾Ð»Ð¶Ð½Ñ Ð¿Ð¾Ð»ÑÑиÑÑ $name, $module, $class
foreach ($requiredAttributes as $attrName) {
if (!isset($componentDescription[$attrName])) {
throw new SystemException("ERR_DEV_NO_REQUIRED_ATTRIB $attrName", SystemException::ERR_DEVELOPER);
}
$$attrName = (string)$componentDescription[$attrName];
}
// извлекаем паÑамеÑÑÑ ÐºÐ¾Ð¼Ð¿Ð¾Ð½ÐµÐ½Ñа
$params = null;
if (isset($componentDescription->params)) {
$params = array();
foreach ($componentDescription->params->param as $tagName => $paramDescr) {
if ($tagName == 'param') {
if (isset($paramDescr['name'])) {
$params[(string)$paramDescr['name']] = (string)$paramDescr;
}
}
}
}
$component = $this->createComponent($name, $module, $class, $params);
return $component;
}
/**
* Ð¡Ð¾Ð·Ð´Ð°ÐµÑ ÐºÐ¾Ð¼Ð¿Ð¾Ð½ÐµÐ½Ñ.
*
* @access public
* @param string $name
* @param string $module
* @param string $class
* @param array $params
* @return Component
*/
public function createComponent($name, $module, $class, $params = null) {
return new $class($name, $module, $this->document, $params);
}
/**
* ÐозвÑаÑÐ°ÐµÑ Ð½Ð°Ð±Ð¾Ñ ÐºÐ¾Ð¼Ð¿Ð¾Ð½ÐµÐ½Ñов
*
* @return array
* @access public
*/
public function getComponents() {
return $this->components;
}
}