Source for file Component.class.php
Documentation is available at Component.class.php
* @copyright Energine 2006
//require_once('core/framework/ComponentConfig.class.php');
//require_once('core/framework/DBWorker.class.php');
//require_once('core/framework/Request.class.php');
//require_once('core/framework/Builder.class.php');
* Имя действия по-умолчанию.
* @var DOMDocument DOM-документ компонента
* @var Request экземпляр объекта Request
* @var array параметры компонента
* @var Document документ страницы
* @var string имя модуля, которому принадлежит компонент
* @var Response экземпляр объекта Response
* @var int уровень прав, необходимый для запуска метода компонента
* @var string имя компонента
* @var boolean Флаг, указывающий на то, является ли компонент активным
* @var array параметры действия
* @var array свойства компонента
* @var array список ошибок, произошедших во время работы компонента
* Результат является объектом класса DOMNode или boolean:
* true - компонент отработал успешно, но ничего не вывел;
* false - произошла ошибка при работе компонента.
* @var mixed результат работы компонента
* @var string имя текущего действия компонента
private $action = self::DEFAULT_ACTION_NAME;
* @var Builder построитель результата работы компонента
* @var ComponentConfig конфигурация компонента
* @param Document $document
public function __construct($name, $module, Document $document, array $params = null) {
foreach ($params as $name => $value) {
* @todo Проверить, можно ли перенести в build
$this->doc = new DOMDocument('1.0', 'UTF-8');
protected function __set($name, $value){
$this->setParam($name, $value);
throw new SystemException('ERR_BAD_VARIABLE', SystemException::ERR_DEVELOPER, $name);
protected function __get($name){
$result = $this->_params[$name];
throw new SystemException('ERR_BAD_VARIABLE', SystemException::ERR_DEVELOPER, $name);
* Возвращает флаг активности компонента
return $this->params['active'];
* Устанавливает построитель компонента.
* @param Builder $builder
final protected function setBuilder(Builder $builder) {
* Возвращает построитель компонента.
* Определяет допустимые параметры компонента и их значения по-умолчанию
* в виде массива array(paramName => defaultValue).
'rights' => $this->document->getRights(),
'configFilename' => false,
* Устанавливает значение параметра компонента, если такой существует.
* В противном случае возбуждается исключение.
protected function setParam($name, $value) {
if (!isset ($this->params[$name])) {
/*if (in_array($name, array('action','configFilename', 'active'))) {
throw new SystemException('ERR_DEV_INVARIANT_PARAM', SystemException::ERR_DEVELOPER, $name);
// если новое значение пустое - оставляем значение по-умолчанию
if (!empty($value) || $value === false) {
//ОБрабатываем случай передачи массива-строки в параметры
* Возвращает значение параметра компонента, или null, если такого
* параметра не существует.
final protected function getParam($name) {
return (isset ($this->params[$name]) ? $this->params[$name] : null);
* Определяет текущее действие
//Текущее действие берем из параметров
//По умолчанию оно равно self::DEFAULT_ACTION_NAME
// если это основной компонент страницы, должен быть конфигурационный файл
if ($this->config->isEmpty()) {
// определяем действие по запрошенному URI
$this->action = $action['name'];
// если имя действия указано в POST-запросе - используем его
elseif (isset ($_POST[$this->getName()]['action'])) {
// устанавливаем права на действие из конфигурации, если определены
if (!$this->config->isEmpty()) {
if (!is_null($rights = $this->config->getCurrentMethodConfig()->getAttribute('rights'))) {
* Определяет имя текущего действия компонента.
* Возвращает уровень прав пользователя, необходимых для запуска
* текущего действия компонента.
* Возвращает имя компонента.
* Запускает компонент на исполнение.
final public function run() {
protected function main() {
$this->prepare(); // вызываем метод подготовки данных
* Метод подготовки данных.
* Вызывается вначале работы метода, реализующего основное действие.
* Отключает отображение компонента
* Включает отображение компонента
final public function enable() {
* Возвращает активность компонента
* Устанавливает значение свойства компонента.
* @param string $propName
* @param mixed $propValue
final protected function setProperty($propName, $propValue) {
* Возвращает значение свойства компонента.
* @param string $propName
* Удаляет свойство компонента.
* Строит результат работы компонента используя определённый построитель.
public function build() {
$result = $this->doc->createElement('component');
$result->setAttribute('name', $this->getName());
$result->setAttribute('module', $this->module);
$result->setAttribute('componentAction', $this->getAction());
$result->setAttribute('class', get_class($this));
foreach ($this->properties as $propName => $propValue) {
$result->setAttribute($propName, $propValue);
* Существует ли построитель и правильно ли он отработал?
* Построитель может не существовать, если мы создаем компонент в котором нет данных.
$this->doc->appendChild($result);
* Генерирует ошибку и добавляет её в список ошибок компонента.
* @param int $errorType тип ошибки
* @param string $errorMessage сообщение об ошибке
* @param mixed $errorCustomInfo дополнительная информация об ошибке
protected function generateError($errorType, $errorMessage, $errorCustomInfo = false) {
'message' => $errorMessage,
'custom' => $errorCustomInfo
// если ошибка не позволяет продолжить работу компонента, возбуждаем фиктивное исключение
* Обрабатывает ошибки, произошедшие во время работы компонента.
* Возвращает DOMDocument, представляющий ошибки компонента, или
* false, если никаких ошибок не произошло.
$dom_errorDoc = new DOMDocument('1.0', 'UTF-8');
$dom_errors = $dom_errorDoc->createElement('errors');
$dom_errors->setAttribute('title', $this->translate('TXT_ERRORS'));
foreach ($this->errors as $errorInfo) {
$dom_error = $dom_errorDoc->createElement('error', $errorInfo['message']);
$dom_error->setAttribute('type', $errorInfo['type']);
* @todo выводить дополнительную информацию только в debug-режиме.
if (isset ($errorInfo['custom'])) {
$customMessage = implode('. ', $errorInfo['custom']);
$customMessage = $errorInfo['custom'];
if (!empty($customMessage)) {
$dom_error->nodeValue = "{ $errorInfo['message']} [ $customMessage ]";
$dom_error->nodeValue = $errorInfo['message'];
$dom_errors->appendChild($dom_error);
$dom_errorDoc->appendChild($dom_errors);
* Возвращает параметры действия.
|