mirror of
https://github.com/Oreolek/ifhub.club.git
synced 2024-07-05 07:54:24 +03:00
Документация классов
This commit is contained in:
parent
8487a151f2
commit
adc20c767d
|
@ -16,73 +16,122 @@
|
|||
*/
|
||||
|
||||
/**
|
||||
* Абстрактный класс экшена
|
||||
* Абстрактный класс экшена.
|
||||
*
|
||||
* От этого класса наследуются все экшены в движке.
|
||||
* Предоставляет базовые метода для работы с параметрами и шаблоном при запросе страницы в браузере.
|
||||
*
|
||||
* @package engine
|
||||
* @since 1.0
|
||||
*/
|
||||
abstract class Action extends LsObject {
|
||||
|
||||
/**
|
||||
* Список зарегистрированных евентов
|
||||
*
|
||||
* @var array
|
||||
*/
|
||||
protected $aRegisterEvent=array();
|
||||
/**
|
||||
* Список параметров из URL
|
||||
* <pre>/action/event/param0/param1/../paramN/</pre>
|
||||
*
|
||||
* @var array
|
||||
*/
|
||||
protected $aParams=array();
|
||||
/**
|
||||
* Список совпадений по регулярному выражению для евента
|
||||
*
|
||||
* @var array
|
||||
*/
|
||||
protected $aParamsEventMatch=array('event'=>array(),'params'=>array());
|
||||
/**
|
||||
* Объект ядра
|
||||
*
|
||||
* @var Engine|null
|
||||
*/
|
||||
protected $oEngine=null;
|
||||
/**
|
||||
* Шаблон экшена
|
||||
* @see SetTemplate
|
||||
* @see SetTemplateAction
|
||||
*
|
||||
* @var string|null
|
||||
*/
|
||||
protected $sActionTemplate=null;
|
||||
/**
|
||||
* Дефолтный евент
|
||||
* @see SetDefaultEvent
|
||||
*
|
||||
* @var string|null
|
||||
*/
|
||||
protected $sDefaultEvent=null;
|
||||
/**
|
||||
* Текущий евент
|
||||
*
|
||||
* @var string|null
|
||||
*/
|
||||
protected $sCurrentEvent=null;
|
||||
/**
|
||||
* Текущий экшен
|
||||
*
|
||||
* @var null|string
|
||||
*/
|
||||
protected $sCurrentAction=null;
|
||||
|
||||
|
||||
/**
|
||||
* Конструктор
|
||||
*
|
||||
* @param Engine $oEngine
|
||||
* @param string $sAction
|
||||
* @param Engine $oEngine Объект ядра
|
||||
* @param string $sAction Название экшена
|
||||
*/
|
||||
public function __construct(Engine $oEngine, $sAction) {
|
||||
$this->RegisterEvent();
|
||||
$this->oEngine=$oEngine;
|
||||
$this->sCurrentAction=$sAction;
|
||||
$this->aParams=Router::GetParams();
|
||||
$this->aParams=Router::GetParams();
|
||||
}
|
||||
|
||||
/**
|
||||
* Добавляет евент в экшен
|
||||
* По сути является оберткой для AddEventPreg(), оставлен для простоты и совместимости с прошлыми версиями ядра
|
||||
* @see AddEventPreg
|
||||
*
|
||||
* @param string $sEventName Название евента
|
||||
* @param string $sEventFunction Какой метод ему соответствует
|
||||
*/
|
||||
*/
|
||||
protected function AddEvent($sEventName,$sEventFunction) {
|
||||
$this->AddEventPreg("/^{$sEventName}$/i",$sEventFunction);
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Добавляет евент в экшен, используя регулярное вырожение для евента и параметров
|
||||
*
|
||||
*/
|
||||
protected function AddEventPreg() {
|
||||
protected function AddEventPreg() {
|
||||
$iCountArgs=func_num_args();
|
||||
if ($iCountArgs<2) {
|
||||
throw new Exception("Incorrect number of arguments when adding events");
|
||||
}
|
||||
$aEvent=array();
|
||||
$aEvent['method']=func_get_arg($iCountArgs-1);
|
||||
if (!method_exists($this,$aEvent['method'])) {
|
||||
if (!method_exists($this,$aEvent['method'])) {
|
||||
throw new Exception("Method of the event not found: ".$aEvent['method']);
|
||||
}
|
||||
$aEvent['preg']=func_get_arg(0);
|
||||
$aEvent['preg']=func_get_arg(0);
|
||||
$aEvent['params_preg']=array();
|
||||
for ($i=1;$i<$iCountArgs-1;$i++) {
|
||||
$aEvent['params_preg'][]=func_get_arg($i);
|
||||
}
|
||||
$this->aRegisterEvent[]=$aEvent;
|
||||
$this->aRegisterEvent[]=$aEvent;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Запускает евент на выполнение
|
||||
* Если текущий евент не определен то запускается тот которые определен по умолчанию(default event)
|
||||
*
|
||||
* @return unknown
|
||||
* @return mixed
|
||||
*/
|
||||
public function ExecEvent() {
|
||||
public function ExecEvent() {
|
||||
$this->sCurrentEvent=Router::GetActionEvent();
|
||||
if ($this->sCurrentEvent==null) {
|
||||
$this->sCurrentEvent=$this->GetDefaultEvent();
|
||||
|
@ -98,7 +147,7 @@ abstract class Action extends LsObject {
|
|||
} else {
|
||||
continue 2;
|
||||
}
|
||||
}
|
||||
}
|
||||
$sCmd='$result=$this->'.$aEvent['method'].'();';
|
||||
$this->Hook_Run("action_event_".strtolower($this->sCurrentAction)."_before",array('event'=>$this->sCurrentEvent,'params'=>$this->GetParams()));
|
||||
eval($sCmd);
|
||||
|
@ -107,17 +156,17 @@ abstract class Action extends LsObject {
|
|||
}
|
||||
}
|
||||
return $this->EventNotFound();
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
* Устанавливает евент по умолчанию
|
||||
*
|
||||
* @param string $sEvent
|
||||
* @param string $sEvent Имя евента
|
||||
*/
|
||||
public function SetDefaultEvent($sEvent) {
|
||||
$this->sDefaultEvent=$sEvent;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Получает евент по умолчанию
|
||||
*
|
||||
|
@ -130,8 +179,8 @@ abstract class Action extends LsObject {
|
|||
/**
|
||||
* Возвращает элементы совпадения по регулярному выражению для евента
|
||||
*
|
||||
* @param unknown_type $iItem
|
||||
* @return unknown
|
||||
* @param int|null $iItem Номер совпадения
|
||||
* @return string|null
|
||||
*/
|
||||
protected function GetEventMatch($iItem=null) {
|
||||
if ($iItem) {
|
||||
|
@ -147,9 +196,9 @@ abstract class Action extends LsObject {
|
|||
/**
|
||||
* Возвращает элементы совпадения по регулярному выражению для параметров евента
|
||||
*
|
||||
* @param unknown_type $iParamNum
|
||||
* @param unknown_type $iItem
|
||||
* @return unknown
|
||||
* @param int $iParamNum Номер параметра, начинается с нуля
|
||||
* @param int|null $iItem Номер совпадения, начинается с нуля
|
||||
* @return string|null
|
||||
*/
|
||||
protected function GetParamEventMatch($iParamNum,$iItem=null) {
|
||||
if (!is_null($iItem)) {
|
||||
|
@ -166,40 +215,40 @@ abstract class Action extends LsObject {
|
|||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Получает параметр из URL по его номеру, если его нет то null
|
||||
*
|
||||
* @param unknown_type $iOffset
|
||||
* @return unknown
|
||||
* @param int $iOffset Номер параметра, начинается с нуля
|
||||
* @return mixed
|
||||
*/
|
||||
public function GetParam($iOffset,$default=null) {
|
||||
$iOffset=(int)$iOffset;
|
||||
return isset($this->aParams[$iOffset]) ? $this->aParams[$iOffset] : $default;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Получает список параметров из УРЛ
|
||||
*
|
||||
* @return unknown
|
||||
* @return array
|
||||
*/
|
||||
public function GetParams() {
|
||||
public function GetParams() {
|
||||
return $this->aParams;
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
/**
|
||||
* Установить значение параметра(эмуляция параметра в URL).
|
||||
* Установить значение параметра(эмуляция параметра в URL).
|
||||
* После установки занова считывает параметры из роутера - для корректной работы
|
||||
*
|
||||
* @param int $iOffset - по идеи может быть не только числом
|
||||
* @param unknown_type $value
|
||||
* @param int $iOffset Номер параметра, но по идеи может быть не только числом
|
||||
* @param string $value
|
||||
*/
|
||||
public function SetParam($iOffset,$value) {
|
||||
public function SetParam($iOffset,$value) {
|
||||
Router::SetParam($iOffset,$value);
|
||||
$this->aParams=Router::GetParams();
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Устанавливает какой шаблон выводить
|
||||
*
|
||||
|
@ -208,7 +257,7 @@ abstract class Action extends LsObject {
|
|||
protected function SetTemplate($sTemplate) {
|
||||
$this->sActionTemplate=$sTemplate;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Устанавливает какой шаблон выводить
|
||||
*
|
||||
|
@ -231,72 +280,75 @@ abstract class Action extends LsObject {
|
|||
}
|
||||
}
|
||||
}
|
||||
$this->sActionTemplate = $sActionTemplatePath;
|
||||
$this->sActionTemplate = $sActionTemplatePath;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Получить шаблон
|
||||
* Если шаблон не определен то возвращаем дефолтный шаблон евента: action/{Action}.{event}.tpl
|
||||
*
|
||||
* @return unknown
|
||||
* @return string
|
||||
*/
|
||||
public function GetTemplate() {
|
||||
if (is_null($this->sActionTemplate)) {
|
||||
$this->SetTemplateAction($this->sCurrentEvent);
|
||||
$this->SetTemplateAction($this->sCurrentEvent);
|
||||
}
|
||||
return $this->sActionTemplate;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Получить каталог с шаблонами экшена(совпадает с именем класса)
|
||||
* @see Router::GetActionClass
|
||||
*
|
||||
* @return unknown
|
||||
* @return string
|
||||
*/
|
||||
public function GetActionClass() {
|
||||
return Router::GetActionClass();
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Вызывается в том случаи если не найден евент который запросили через URL
|
||||
* По дефолту происходит перекидывание на страницу ошибки, это можно переопределить в наследнике, а в ряде случаев и необходимо :) Для примера смотри экшен Profile
|
||||
* По дефолту происходит перекидывание на страницу ошибки, это можно переопределить в наследнике
|
||||
* @see Router::Action
|
||||
*
|
||||
* @return unknown
|
||||
* @return string
|
||||
*/
|
||||
protected function EventNotFound() {
|
||||
protected function EventNotFound() {
|
||||
return Router::Action('error','404');
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Выполняется при завершение экшена, после вызова основного евента
|
||||
*
|
||||
*/
|
||||
public function EventShutdown() {
|
||||
|
||||
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Ставим хук на вызов неизвестного метода и считаем что хотели вызвать метод какого либо модуля
|
||||
* @see Engine::_CallModule
|
||||
*
|
||||
* @param string $sName
|
||||
* @param array $aArgs
|
||||
* @return unknown
|
||||
* @param string $sName Имя метода
|
||||
* @param array $aArgs Аргументы
|
||||
* @return mixed
|
||||
*/
|
||||
public function __call($sName,$aArgs) {
|
||||
return $this->oEngine->_CallModule($sName,$aArgs);
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Абстрактный метод инициализации экшена
|
||||
*
|
||||
*/
|
||||
abstract public function Init();
|
||||
|
||||
|
||||
/**
|
||||
* Абстрактный метод регистрации евентов.
|
||||
* В нём необходимо вызывать метод AddEvent($sEventName,$sEventFunction)
|
||||
* В нём необходимо вызывать метод AddEvent($sEventName,$sEventFunction)
|
||||
*
|
||||
*/
|
||||
abstract protected function RegisterEvent();
|
||||
|
||||
abstract protected function RegisterEvent();
|
||||
|
||||
}
|
||||
?>
|
|
@ -36,114 +36,165 @@ require_once("ManyToManyRelation.class.php");
|
|||
|
||||
|
||||
/**
|
||||
* Основной класс движка, который позволяет напрямую обращаться к любому модулю
|
||||
* Основной класс движка. Ядро.
|
||||
*
|
||||
* Производит инициализацию плагинов, модулей, хуков.
|
||||
* Через этот класс происходит выполнение методов всех модулей, которые вызываются как <pre>$this->Module_Method();</pre>
|
||||
* Также отвечает за автозагрузку остальных классов движка.
|
||||
*
|
||||
* В произвольном месте (не в классах движка у которых нет обработки метода __call() на выполнение модулей) метод модуля можно вызвать так:
|
||||
* <pre>
|
||||
* Engine::getInstance()->Module_Method();
|
||||
* </pre>
|
||||
*
|
||||
* @package engine
|
||||
* @since 1.0
|
||||
*/
|
||||
class Engine extends LsObject {
|
||||
|
||||
|
||||
/**
|
||||
* Имя плагина
|
||||
* @var int
|
||||
*/
|
||||
const CI_PLUGIN = 1;
|
||||
|
||||
|
||||
/**
|
||||
* Имя экшна
|
||||
* @var int
|
||||
*/
|
||||
const CI_ACTION = 2;
|
||||
|
||||
|
||||
/**
|
||||
* Имя модуля
|
||||
* @var int
|
||||
*/
|
||||
const CI_MODULE = 4;
|
||||
|
||||
|
||||
/**
|
||||
* Имя сущности
|
||||
* @var int
|
||||
*/
|
||||
const CI_ENTITY = 8;
|
||||
|
||||
|
||||
/**
|
||||
* Имя маппера
|
||||
* @var int
|
||||
*/
|
||||
const CI_MAPPER = 16;
|
||||
|
||||
|
||||
/**
|
||||
* Имя метода
|
||||
* @var int
|
||||
*/
|
||||
const CI_METHOD = 32;
|
||||
|
||||
|
||||
/**
|
||||
* Имя хука
|
||||
* @var int
|
||||
*/
|
||||
const CI_HOOK = 64;
|
||||
|
||||
|
||||
/**
|
||||
* Имя класс наследования
|
||||
* @var int
|
||||
*/
|
||||
const CI_INHERIT = 128;
|
||||
|
||||
/**
|
||||
|
||||
/**
|
||||
* Имя блока
|
||||
* @var int
|
||||
*/
|
||||
const CI_BLOCK = 256;
|
||||
|
||||
|
||||
/**
|
||||
* Префикс плагина
|
||||
* @var int
|
||||
*/
|
||||
const CI_PPREFIX = 8192;
|
||||
|
||||
|
||||
/**
|
||||
* Разобранный класс наследования
|
||||
* @var int
|
||||
*/
|
||||
const CI_INHERITS = 16384;
|
||||
|
||||
|
||||
/**
|
||||
* Путь к файлу класса
|
||||
* @var int
|
||||
*/
|
||||
const CI_CLASSPATH = 32768;
|
||||
|
||||
|
||||
/**
|
||||
* Все свойства класса
|
||||
* @var int
|
||||
*/
|
||||
const CI_ALL = 65535;
|
||||
|
||||
|
||||
/**
|
||||
* Свойства по-умолчанию
|
||||
* CI_ALL ^ (CI_CLASSPATH | CI_INHERITS | CI_PPREFIX)
|
||||
* @var int
|
||||
*/
|
||||
const CI_DEFAULT = 8191;
|
||||
|
||||
|
||||
/**
|
||||
* Объекты
|
||||
* CI_ACTION | CI_MAPPER | CI_HOOK | CI_PLUGIN | CI_ACTION | CI_MODULE | CI_ENTITY | CI_BLOCK
|
||||
* @var int
|
||||
*/
|
||||
const CI_OBJECT = 351 ;
|
||||
|
||||
static protected $oInstance=null;
|
||||
|
||||
protected $aModules=array();
|
||||
protected $aPlugins=array();
|
||||
protected $aConfigModule;
|
||||
public $iTimeLoadModule=0;
|
||||
protected $iTimeInit=null;
|
||||
|
||||
|
||||
|
||||
/**
|
||||
* При создании объекта делаем инициализацию
|
||||
* Текущий экземпляр движка, используется для синглтона.
|
||||
* @see getInstance использование синглтона
|
||||
*
|
||||
* @var Engine
|
||||
*/
|
||||
static protected $oInstance=null;
|
||||
/**
|
||||
* Список загруженных модулей
|
||||
*
|
||||
* @var array
|
||||
*/
|
||||
protected $aModules=array();
|
||||
/**
|
||||
* Список загруженных плагинов
|
||||
*
|
||||
* @var array
|
||||
*/
|
||||
protected $aPlugins=array();
|
||||
/**
|
||||
* Содержит конфиг модулей.
|
||||
* Используется для получания списка модулей для авто-загрузки. Остальные модули загружаются при первом обращении.
|
||||
* В конфиге определен так:
|
||||
* <pre>
|
||||
* $config['module']['autoLoad'] = array('Hook','Cache','Security','Session','Lang','Message','User');
|
||||
* </pre>
|
||||
*
|
||||
* @var array
|
||||
*/
|
||||
protected $aConfigModule;
|
||||
/**
|
||||
* Время загрузки модулей в микросекундах
|
||||
*
|
||||
* @var int
|
||||
*/
|
||||
public $iTimeLoadModule=0;
|
||||
/**
|
||||
* Текущее время в микросекундах на момент инициализации ядра(движка).
|
||||
* Определается так:
|
||||
* <pre>
|
||||
* $this->iTimeInit=microtime(true);
|
||||
* </pre>
|
||||
*
|
||||
* @var int|null
|
||||
*/
|
||||
protected $iTimeInit=null;
|
||||
|
||||
|
||||
/**
|
||||
* Вызывается при создании объекта ядра.
|
||||
* Устанавливает время старта инициализации и обрабатывает входные параметры PHP
|
||||
*
|
||||
*/
|
||||
protected function __construct() {
|
||||
|
@ -155,9 +206,15 @@ class Engine extends LsObject {
|
|||
func_stripslashes($_COOKIE);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Ограничиваем объект только одним экземпляром
|
||||
* Ограничиваем объект только одним экземпляром.
|
||||
* Функционал синглтона.
|
||||
*
|
||||
* Используется так:
|
||||
* <pre>
|
||||
* Engine::getInstance()->Module_Method();
|
||||
* </pre>
|
||||
*
|
||||
* @return Engine
|
||||
*/
|
||||
|
@ -169,9 +226,9 @@ class Engine extends LsObject {
|
|||
return self::$oInstance;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Инициализация
|
||||
* Инициализация ядра движка
|
||||
*
|
||||
*/
|
||||
public function Init() {
|
||||
|
@ -201,7 +258,8 @@ class Engine extends LsObject {
|
|||
$this->Hook_Run('engine_init_complete');
|
||||
}
|
||||
/**
|
||||
* Завершение работы модуля
|
||||
* Завершение работы движка
|
||||
* Завершает все модули.
|
||||
*
|
||||
*/
|
||||
public function Shutdown() {
|
||||
|
@ -215,28 +273,28 @@ class Engine extends LsObject {
|
|||
foreach ($this->aModules as $oModule) {
|
||||
if(!$oModule->isInit()) {
|
||||
/**
|
||||
* Замеряем время инициализации модуля
|
||||
*/
|
||||
* Замеряем время инициализации модуля
|
||||
*/
|
||||
$oProfiler=ProfilerSimple::getInstance();
|
||||
$iTimeId=$oProfiler->Start('InitModule',get_class($oModule));
|
||||
|
||||
|
||||
$this->InitModule($oModule);
|
||||
|
||||
$oProfiler->Stop($iTimeId);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Инициализирует модуль
|
||||
*
|
||||
* @param unknown_type $oModule
|
||||
* @param unknown_type $bHookParent
|
||||
*
|
||||
* @param Module $oModule Объект модуля
|
||||
* @param bool $bHookParent Вызывает хук на родительском модуле, от которого наследуется текущий
|
||||
*/
|
||||
protected function InitModule($oModule, $bHookParent = true){
|
||||
$sOrigClassName = $sClassName = get_class($oModule);
|
||||
$bRunHooks = false;
|
||||
|
||||
|
||||
if($this->isInitModule('ModuleHook')){
|
||||
$bRunHooks = true;
|
||||
if($bHookParent){
|
||||
|
@ -265,12 +323,12 @@ class Engine extends LsObject {
|
|||
$this->Hook_Run($sHookPrefix.'after');
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Проверяет модуль на инициализацию
|
||||
*
|
||||
* @param unknown_type $sModuleClass
|
||||
* @return unknown
|
||||
* @param string $sModuleClass Класс модуля
|
||||
* @return bool
|
||||
*/
|
||||
public function isInitModule($sModuleClass) {
|
||||
if(!in_array($sModuleClass,array('ModulePlugin','ModuleHook'))) {
|
||||
|
@ -281,7 +339,7 @@ class Engine extends LsObject {
|
|||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Завершаем работу всех модулей
|
||||
*
|
||||
|
@ -299,33 +357,33 @@ class Engine extends LsObject {
|
|||
$oProfiler->Stop($iTimeId);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Выполняет загрузку модуля по его названию
|
||||
*
|
||||
* @param string $sModuleClass
|
||||
* @param bool $bInit - инициализировать модуль или нет
|
||||
* @param string $sModuleClass Класс модуля
|
||||
* @param bool $bInit Инициализировать модуль или нет
|
||||
* @return Module
|
||||
*/
|
||||
public function LoadModule($sModuleClass,$bInit=false) {
|
||||
$tm1=microtime(true);
|
||||
|
||||
/**
|
||||
|
||||
/**
|
||||
* Создаем объект модуля
|
||||
*/
|
||||
*/
|
||||
$oModule=new $sModuleClass($this);
|
||||
$this->aModules[$sModuleClass]=$oModule;
|
||||
if ($bInit or $sModuleClass=='ModuleCache') {
|
||||
$this->InitModule($oModule);
|
||||
}
|
||||
}
|
||||
$tm2=microtime(true);
|
||||
$this->iTimeLoadModule+=$tm2-$tm1;
|
||||
dump("load $sModuleClass - \t\t".($tm2-$tm1)."");
|
||||
return $oModule;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Загружает все используемые модули и передает им в конструктор ядро
|
||||
* Загружает модули из авто-загрузки и передает им в конструктор ядро
|
||||
*
|
||||
*/
|
||||
protected function LoadModules() {
|
||||
|
@ -333,7 +391,7 @@ class Engine extends LsObject {
|
|||
foreach ($this->aConfigModule['autoLoad'] as $sModuleName) {
|
||||
$sModuleClass='Module'.$sModuleName;
|
||||
if(!in_array($sModuleName,array('Plugin','Hook'))) $sModuleClass=$this->Plugin_GetDelegate('module',$sModuleClass);
|
||||
|
||||
|
||||
if (!isset($this->aModules[$sModuleClass])) {
|
||||
$this->LoadModule($sModuleClass);
|
||||
}
|
||||
|
@ -353,7 +411,7 @@ class Engine extends LsObject {
|
|||
protected function InitHooks() {
|
||||
$sDirHooks=Config::Get('path.root.server').'/classes/hooks/';
|
||||
$aFiles=glob($sDirHooks.'Hook*.class.php');
|
||||
|
||||
|
||||
if($aFiles and count($aFiles)) {
|
||||
foreach ($aFiles as $sFile) {
|
||||
if (preg_match("/Hook([^_]+)\.class\.php$/i",basename($sFile),$aMatch)) {
|
||||
|
@ -364,23 +422,21 @@ class Engine extends LsObject {
|
|||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Подгружаем хуки активных плагинов
|
||||
*/
|
||||
$this->InitPluginHooks();
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Инициализация хуков активированных плагинов
|
||||
*
|
||||
*/
|
||||
protected function InitPluginHooks() {
|
||||
if($aPluginList = func_list_plugins()) {
|
||||
|
||||
$aFiles=array();
|
||||
$sDirHooks=Config::Get('path.root.server').'/plugins/';
|
||||
|
||||
|
||||
foreach ($aPluginList as $sPluginName) {
|
||||
$aFiles=glob($sDirHooks.$sPluginName.'/classes/hooks/Hook*.class.php');
|
||||
if($aFiles and count($aFiles)) {
|
||||
|
@ -412,42 +468,43 @@ class Engine extends LsObject {
|
|||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Инициализация активированных плагинов
|
||||
* Инициализация активированных(загруженных) плагинов
|
||||
*
|
||||
*/
|
||||
protected function InitPlugins() {
|
||||
foreach ($this->aPlugins as $oPlugin) {
|
||||
foreach ($this->aPlugins as $oPlugin) {
|
||||
$oPlugin->Init();
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Возвращает список активных плагинов
|
||||
*
|
||||
* @return unknown
|
||||
* @return array
|
||||
*/
|
||||
public function GetPlugins() {
|
||||
return $this->aPlugins;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Проверяет файл на существование, если используется кеширование memcache то кеширует результат работы
|
||||
*
|
||||
* @param string $sFile
|
||||
* @return mixed
|
||||
* @param string $sFile Полный путь до файла
|
||||
* @param int $iTime Время жизни кеша
|
||||
* @return bool
|
||||
*/
|
||||
public function isFileExists($sFile,$iTime=3600) {
|
||||
// пока так
|
||||
return file_exists($sFile);
|
||||
|
||||
|
||||
if(
|
||||
!$this->isInit('cache')
|
||||
|| !Config::Get('sys.cache.use')
|
||||
|| Config::Get('sys.cache.type') != 'memory'
|
||||
!$this->isInit('cache')
|
||||
|| !Config::Get('sys.cache.use')
|
||||
|| Config::Get('sys.cache.type') != 'memory'
|
||||
){
|
||||
return file_exists($sFile);
|
||||
return file_exists($sFile);
|
||||
}
|
||||
if (false === ($data = $this->Cache_Get("file_exists_{$sFile}"))) {
|
||||
$data=file_exists($sFile);
|
||||
|
@ -458,28 +515,33 @@ class Engine extends LsObject {
|
|||
/**
|
||||
* Вызывает метод нужного модуля
|
||||
*
|
||||
* @param string $sName
|
||||
* @param array $aArgs
|
||||
* @return unknown
|
||||
* @param string $sName Название метода в полном виде.
|
||||
* Например <pre>Module_Method</pre>
|
||||
* @param array $aArgs Список аргументов
|
||||
* @return mixed
|
||||
*/
|
||||
public function _CallModule($sName,$aArgs) {
|
||||
list($oModule,$sModuleName,$sMethod)=$this->GetModule($sName);
|
||||
|
||||
|
||||
if (!method_exists($oModule,$sMethod)) {
|
||||
// comment for ORM testing
|
||||
//throw new Exception("The module has no required method: ".$sModuleName.'->'.$sMethod.'()');
|
||||
}
|
||||
|
||||
/**
|
||||
* Замеряем время выполнения метода
|
||||
*/
|
||||
$oProfiler=ProfilerSimple::getInstance();
|
||||
$iTimeId=$oProfiler->Start('callModule',$sModuleName.'->'.$sMethod.'()');
|
||||
|
||||
|
||||
$sModuleName=strtolower($sModuleName);
|
||||
$aResultHook=array();
|
||||
if (!in_array($sModuleName,array('plugin','hook'))) {
|
||||
$aResultHook=$this->_CallModule('Hook_Run',array('module_'.$sModuleName.'_'.strtolower($sMethod).'_before',&$aArgs));
|
||||
}
|
||||
|
||||
if (array_key_exists('delegate_result',$aResultHook)) {
|
||||
}
|
||||
/**
|
||||
* Хук может делегировать результат выполнения метода модуля, сам метод при этом не выполняется, происходит только подмена результата
|
||||
*/
|
||||
if (array_key_exists('delegate_result',$aResultHook)) {
|
||||
$result=$aResultHook['delegate_result'];
|
||||
} else {
|
||||
$aArgsRef=array();
|
||||
|
@ -488,11 +550,11 @@ class Engine extends LsObject {
|
|||
}
|
||||
$result=call_user_func_array(array($oModule,$sMethod),$aArgsRef);
|
||||
}
|
||||
|
||||
|
||||
if (!in_array($sModuleName,array('plugin','hook'))) {
|
||||
$this->Hook_Run('module_'.$sModuleName.'_'.strtolower($sMethod).'_after',array('result'=>&$result,'params'=>$aArgs));
|
||||
}
|
||||
|
||||
|
||||
$oProfiler->Stop($iTimeId);
|
||||
return $result;
|
||||
}
|
||||
|
@ -500,7 +562,8 @@ class Engine extends LsObject {
|
|||
/**
|
||||
* Возвращает объект модуля, имя модуля и имя вызванного метода
|
||||
*
|
||||
* @param string $sName
|
||||
* @param string $sName Имя метода модуля в полном виде
|
||||
* Например <pre>Module_Method</pre>
|
||||
* @return array
|
||||
*/
|
||||
public function GetModule($sName) {
|
||||
|
@ -510,8 +573,8 @@ class Engine extends LsObject {
|
|||
$aInfo = self::GetClassInfo(
|
||||
$sName,
|
||||
self::CI_MODULE
|
||||
|self::CI_PPREFIX
|
||||
|self::CI_METHOD
|
||||
|self::CI_PPREFIX
|
||||
|self::CI_METHOD
|
||||
);
|
||||
if($aInfo[self::CI_MODULE] && $aInfo[self::CI_METHOD]){
|
||||
$sName = $aInfo[self::CI_MODULE].'_'.$aInfo[self::CI_METHOD];
|
||||
|
@ -519,9 +582,9 @@ class Engine extends LsObject {
|
|||
$sName = $aInfo[self::CI_PPREFIX].$sName;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
$aName=explode("_",$sName);
|
||||
|
||||
|
||||
if(count($aName)==2) {
|
||||
$sModuleName=$aName[0];
|
||||
$sModuleClass='Module'.$aName[0];
|
||||
|
@ -545,14 +608,24 @@ class Engine extends LsObject {
|
|||
} else {
|
||||
$oModule=$this->LoadModule($sModuleClass,true);
|
||||
}
|
||||
|
||||
|
||||
return array($oModule,$sModuleName,$sMethod);
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Возвращает статистику выполнения
|
||||
*
|
||||
* @return array
|
||||
*/
|
||||
public function getStats() {
|
||||
return array('sql'=>$this->Database_GetStats(),'cache'=>$this->Cache_GetStats(),'engine'=>array('time_load_module'=>round($this->iTimeLoadModule,3)));
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Возвращает время старта выполнения движка в микросекундах
|
||||
*
|
||||
* @return int
|
||||
*/
|
||||
public function GetTimeInit() {
|
||||
return $this->iTimeInit;
|
||||
}
|
||||
|
@ -560,30 +633,35 @@ class Engine extends LsObject {
|
|||
/**
|
||||
* Ставим хук на вызов неизвестного метода и считаем что хотели вызвать метод какого либо модуля
|
||||
*
|
||||
* @param string $sName
|
||||
* @param array $aArgs
|
||||
* @return unknown
|
||||
* @param string $sName Имя метода
|
||||
* @param array $aArgs Аргументы
|
||||
* @return mixed
|
||||
*/
|
||||
public function __call($sName,$aArgs) {
|
||||
return $this->_CallModule($sName,$aArgs);
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Блокируем копирование/клонирование объекта ядра
|
||||
*
|
||||
*/
|
||||
protected function __clone() {
|
||||
|
||||
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Получает объект маппера
|
||||
*
|
||||
* @param string $sClassName
|
||||
* @param string $sName
|
||||
* @param string $sClassName Класс модуля маппера
|
||||
* @param string|null $sName Имя маппера
|
||||
* @param DbSimple_Mysql|null $oConnect Объект коннекта к БД
|
||||
* Можно получить так:
|
||||
* <pre>
|
||||
* Engine::getInstance()->Database_GetConnect($aConfig);
|
||||
* </pre>
|
||||
* @return mixed
|
||||
*/
|
||||
public static function GetMapper($sClassName,$sName=null,$oConnect=null) {
|
||||
public static function GetMapper($sClassName,$sName=null,$oConnect=null) {
|
||||
$sModuleName = self::GetClassInfo(
|
||||
$sClassName,
|
||||
self::CI_MODULE,
|
||||
|
@ -594,32 +672,33 @@ class Engine extends LsObject {
|
|||
$sName=$sModuleName;
|
||||
}
|
||||
$sClass=$sClassName.'_Mapper'.$sName;
|
||||
if (!$oConnect) {
|
||||
if (!$oConnect) {
|
||||
$oConnect=Engine::getInstance()->Database_GetConnect();
|
||||
}
|
||||
$sClass=self::getInstance()->Plugin_GetDelegate('mapper',$sClass);
|
||||
return new $sClass($oConnect);
|
||||
}
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Создает объект сущности, контролируя варианты кастомизации
|
||||
*
|
||||
* @param string $sName
|
||||
* @param mixed $aParams
|
||||
* @return mixed
|
||||
* @param string $sName Имя сущности, возможны сокращенные варианты.
|
||||
* Например <pre>ModuleUser_EntityUser</pre> эквивалентно <pre>User_User</pre> и эквивалентно <pre>User</pre> т.к. имя сущности совпадает с именем модуля
|
||||
* @param array $aParams
|
||||
* @return Entity
|
||||
*/
|
||||
public static function GetEntity($sName,$aParams=array()) {
|
||||
/**
|
||||
* Сущности, имеющие такое же название как модуль,
|
||||
* Сущности, имеющие такое же название как модуль,
|
||||
* можно вызывать сокращенно. Например, вместо User_User -> User
|
||||
*/
|
||||
switch (substr_count($sName,'_')) {
|
||||
case 0:
|
||||
$sEntity = $sModule = $sName;
|
||||
break;
|
||||
|
||||
|
||||
case 1:
|
||||
/**
|
||||
* Поддержка полного синтаксиса при вызове сущности
|
||||
|
@ -627,17 +706,17 @@ class Engine extends LsObject {
|
|||
$aInfo = self::GetClassInfo(
|
||||
$sName,
|
||||
self::CI_ENTITY
|
||||
|self::CI_MODULE
|
||||
|self::CI_PLUGIN
|
||||
|self::CI_MODULE
|
||||
|self::CI_PLUGIN
|
||||
);
|
||||
if ($aInfo[self::CI_MODULE]
|
||||
&& $aInfo[self::CI_ENTITY]) {
|
||||
&& $aInfo[self::CI_ENTITY]) {
|
||||
$sName=$aInfo[self::CI_MODULE].'_'.$aInfo[self::CI_ENTITY];
|
||||
}
|
||||
|
||||
|
||||
list($sModule,$sEntity) = explode('_',$sName,2);
|
||||
/**
|
||||
* Обслуживание короткой записи сущностей плагинов
|
||||
* Обслуживание короткой записи сущностей плагинов
|
||||
* PluginTest_Test -> PluginTest_ModuleTest_EntityTest
|
||||
*/
|
||||
if($aInfo[self::CI_PLUGIN]) {
|
||||
|
@ -645,7 +724,7 @@ class Engine extends LsObject {
|
|||
$sModule = $sEntity;
|
||||
}
|
||||
break;
|
||||
|
||||
|
||||
case 2:
|
||||
/**
|
||||
* Поддержка полного синтаксиса при вызове сущности плагина
|
||||
|
@ -653,12 +732,12 @@ class Engine extends LsObject {
|
|||
$aInfo = self::GetClassInfo(
|
||||
$sName,
|
||||
self::CI_ENTITY
|
||||
|self::CI_MODULE
|
||||
|self::CI_PLUGIN
|
||||
|self::CI_MODULE
|
||||
|self::CI_PLUGIN
|
||||
);
|
||||
if ($aInfo[self::CI_PLUGIN]
|
||||
&& $aInfo[self::CI_MODULE]
|
||||
&& $aInfo[self::CI_ENTITY]) {
|
||||
&& $aInfo[self::CI_MODULE]
|
||||
&& $aInfo[self::CI_ENTITY]) {
|
||||
$sName='Plugin'.$aInfo[self::CI_PLUGIN]
|
||||
.'_'.$aInfo[self::CI_MODULE]
|
||||
.'_'.$aInfo[self::CI_ENTITY]
|
||||
|
@ -667,22 +746,22 @@ class Engine extends LsObject {
|
|||
/**
|
||||
* Entity плагина
|
||||
*/
|
||||
if($aInfo[self::CI_PLUGIN]) {
|
||||
if($aInfo[self::CI_PLUGIN]) {
|
||||
list(,$sModule,$sEntity)=explode('_',$sName);
|
||||
$sPlugin = $aInfo[self::CI_PLUGIN];
|
||||
} else {
|
||||
throw new Exception("Unknown entity '{$sName}' given.");
|
||||
}
|
||||
break;
|
||||
|
||||
|
||||
default:
|
||||
throw new Exception("Unknown entity '{$sName}' given.");
|
||||
}
|
||||
|
||||
|
||||
$sClass=isset($sPlugin)
|
||||
? 'Plugin'.$sPlugin.'_Module'.$sModule.'_Entity'.$sEntity
|
||||
: 'Module'.$sModule.'_Entity'.$sEntity;
|
||||
|
||||
|
||||
/**
|
||||
* If Plugin Entity doesn't exist, search among it's Module delegates
|
||||
*/
|
||||
|
@ -699,38 +778,87 @@ class Engine extends LsObject {
|
|||
$sClass='Module'.$sModule.'_Entity'.$sEntity;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Определяем наличие делегата сущности
|
||||
* Делегирование указывается только в полной форме!
|
||||
*/
|
||||
$sClass=self::getInstance()->Plugin_GetDelegate('entity',$sClass);
|
||||
$sClass=self::getInstance()->Plugin_GetDelegate('entity',$sClass);
|
||||
|
||||
$oEntity=new $sClass($aParams);
|
||||
return $oEntity;
|
||||
}
|
||||
|
||||
|
||||
|
||||
/**
|
||||
* Возвращает имя плагина моудля если модул принадлежит плагину.
|
||||
* Например <pre>Openid</pre>
|
||||
*
|
||||
* @static
|
||||
* @param Module $oModule Объект модуля
|
||||
* @return string|null
|
||||
*/
|
||||
public static function GetPluginName($oModule) {
|
||||
return self::GetClassInfo($oModule, self::CI_PLUGIN, true);
|
||||
}
|
||||
|
||||
/**
|
||||
* Возвращает префикс плагина
|
||||
* Например <pre>PluginOpenid_</pre>
|
||||
*
|
||||
* @static
|
||||
* @param Module $oModule Объект модуля
|
||||
* @return string Если плагина нет, возвращает пустую строку
|
||||
*/
|
||||
public static function GetPluginPrefix($oModule) {
|
||||
return self::GetClassInfo($oModule, self::CI_PPREFIX, true);
|
||||
}
|
||||
|
||||
/**
|
||||
* Возвращает имя модуля
|
||||
*
|
||||
* @static
|
||||
* @param Module $oModule Объект модуля
|
||||
* @return string|null
|
||||
*/
|
||||
public static function GetModuleName($oModule) {
|
||||
return self::GetClassInfo($oModule, self::CI_MODULE, true);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
* Возвращает имя сущности
|
||||
*
|
||||
* @static
|
||||
* @param Entity $oEntity Объект сущности
|
||||
* @return string|null
|
||||
*/
|
||||
public static function GetEntityName($oEntity) {
|
||||
return self::GetClassInfo($oEntity, self::CI_ENTITY, true);
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Возвращает имя экшена
|
||||
*
|
||||
* @static
|
||||
* @param $oAction Объект экшена
|
||||
* @return string|null
|
||||
*/
|
||||
public static function GetActionName($oAction) {
|
||||
return self::GetClassInfo($oAction, self::CI_ACTION, true);
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Возвращает информацию об объекта или классе
|
||||
*
|
||||
* @static
|
||||
* @param LsObject|string $oObject Объект или имя класса
|
||||
* @param int $iFlag Маска по которой нужно вернуть рузультат. Доступные маски определены в константах CI_*
|
||||
* Например, получить информацию о плагине и модуле:
|
||||
* <pre>
|
||||
* Engine::GetClassInfo($oObject,Engine::CI_PLUGIN | Engine::CI_MODULE);
|
||||
* </pre>
|
||||
* @param bool $bSingle Возвращать полный результат или только первый элемент
|
||||
* @return array|string|null
|
||||
*/
|
||||
public static function GetClassInfo($oObject,$iFlag=self::CI_DEFAULT,$bSingle=false){
|
||||
$sClassName = is_string($oObject) ? $oObject : get_class($oObject);
|
||||
$aResult = array();
|
||||
|
@ -770,7 +898,7 @@ class Engine extends LsObject {
|
|||
: null
|
||||
;
|
||||
}
|
||||
if($iFlag & self::CI_BLOCK){
|
||||
if($iFlag & self::CI_BLOCK){
|
||||
$aResult[self::CI_BLOCK] = preg_match('/^(?:Plugin[^_]+_|)Block([^_]+)$/',$sClassName,$aMatches)
|
||||
? $aMatches[1]
|
||||
: null
|
||||
|
@ -821,16 +949,23 @@ class Engine extends LsObject {
|
|||
if($iFlag & self::CI_CLASSPATH){
|
||||
$aResult[self::CI_CLASSPATH] = self::GetClassPath($sClassName);
|
||||
}
|
||||
|
||||
|
||||
return $bSingle ? array_pop($aResult) : $aResult;
|
||||
}
|
||||
|
||||
|
||||
|
||||
/**
|
||||
* Возвращает информацию о пути до файла класса.
|
||||
* Используется в {@link autoload автозагрузке}
|
||||
*
|
||||
* @static
|
||||
* @param LsObject $oObject Объект - модуль, экшен, плагин, хук, сущность
|
||||
* @return null|string
|
||||
*/
|
||||
public static function GetClassPath($oObject){
|
||||
$aInfo = self::GetClassInfo(
|
||||
$oObject,
|
||||
self::CI_OBJECT
|
||||
);
|
||||
);
|
||||
$sPath = Config::get('path.root.server').'/';
|
||||
if($aInfo[self::CI_ENTITY]){
|
||||
// Сущность
|
||||
|
@ -908,7 +1043,7 @@ class Engine extends LsObject {
|
|||
// Хук ядра
|
||||
$sPath .= 'classes/hooks/Hook'.$aInfo[self::CI_HOOK].'.class.php';
|
||||
}
|
||||
}elseif($aInfo[self::CI_BLOCK]){
|
||||
}elseif($aInfo[self::CI_BLOCK]){
|
||||
// Блок
|
||||
if($aInfo[self::CI_PLUGIN]){
|
||||
// Блок плагина
|
||||
|
@ -928,16 +1063,17 @@ class Engine extends LsObject {
|
|||
;
|
||||
}else{
|
||||
$sClassName = is_string($oObject) ? $oObject : get_class($oObject);
|
||||
$sPath .= 'engine/classes/'.$sClassName.'.class.php';
|
||||
$sPath .= 'engine/classes/'.$sClassName.'.class.php';
|
||||
}
|
||||
return is_file($sPath) ? $sPath : null;
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
/**
|
||||
* Автозагрузка классов
|
||||
*
|
||||
* @param unknown_type $sClassName
|
||||
* @param string $sClassName Название класса
|
||||
* @return bool
|
||||
*/
|
||||
public static function autoload($sClassName) {
|
||||
$aInfo = Engine::GetClassInfo(
|
||||
|
@ -962,16 +1098,21 @@ class Engine extends LsObject {
|
|||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
* Регистрация автозагрузки классов
|
||||
*/
|
||||
spl_autoload_register(array('Engine','autoload'));
|
||||
|
||||
/**
|
||||
* Short aliases for Engine basic methods
|
||||
*
|
||||
* Короткий алиас для вызова основных методов движка
|
||||
*
|
||||
* @package engine
|
||||
* @since 1.0
|
||||
*/
|
||||
class LS {
|
||||
class LS extends LsObject {
|
||||
|
||||
static protected $oInstance=null;
|
||||
|
||||
|
@ -983,42 +1124,80 @@ class LS {
|
|||
return self::$oInstance;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Возвращает ядро
|
||||
* @see Engine::GetInstance
|
||||
*
|
||||
* @return Engine
|
||||
*/
|
||||
public function E() {
|
||||
return Engine::GetInstance();
|
||||
}
|
||||
|
||||
/**
|
||||
* Возвращает объект сущности
|
||||
* @see Engine::GetEntity
|
||||
*
|
||||
* @param $sName Название сущности
|
||||
* @param array $aParams Параметры для передачи в конструктор
|
||||
* @return Entity
|
||||
*/
|
||||
public function Ent($sName,$aParams=array()) {
|
||||
return Engine::GetEntity($sName,$aParams);
|
||||
}
|
||||
|
||||
/**
|
||||
* Возвращает объект маппера
|
||||
* @see Engine::GetMapper
|
||||
*
|
||||
* @param $sClassName Класс модуля маппера
|
||||
* @param string|null $sName Имя маппера
|
||||
* @param DbSimple_Mysql|null $oConnect Объект коннекта к БД
|
||||
* @return mixed
|
||||
*/
|
||||
public function Mpr($sClassName,$sName=null,$oConnect=null) {
|
||||
return Engine::GetMapper($sClassName,$sName,$oConnect);
|
||||
}
|
||||
|
||||
/**
|
||||
* Возвращает текущего авторизованного пользователя
|
||||
* @see ModuleUser::GetUserCurrent
|
||||
*
|
||||
* @return ModuleUser_EntityUser
|
||||
*/
|
||||
public function CurUsr() {
|
||||
return self::E()->User_GetUserCurrent();
|
||||
}
|
||||
|
||||
/**
|
||||
* Возвращает true если текущий пользователь администратор
|
||||
* @see ModuleUser::GetUserCurrent
|
||||
* @see ModuleUser_EntityUser::isAdministrator
|
||||
*
|
||||
* @return bool
|
||||
*/
|
||||
public function Adm() {
|
||||
return self::CurUsr() && self::CurUsr()->isAdministrator();
|
||||
}
|
||||
|
||||
/**
|
||||
* In templates we have $LS and can use $LS->Module_Method() instead of $LS->E()->Module_Method();
|
||||
* Вызов метода модуля
|
||||
* Например <pre>$LS->Module_Method()</pre>
|
||||
*
|
||||
*/
|
||||
* @param $sName Полное название метода, например <pre>Module_Method</pre>
|
||||
* @param array $aArgs Список аргуметов метода
|
||||
* @return mixed
|
||||
*/
|
||||
public function __call($sName,$aArgs=array()) {
|
||||
return call_user_func_array(array(self::E(),$sName),$aArgs);
|
||||
}
|
||||
|
||||
}
|
||||
/**
|
||||
* With PHP 5.3+ we can use LS::Module_Method() instead of LS::E()->Module_Method();
|
||||
* Статический вызов метода модуля для PHP >= 5.3
|
||||
* Например <pre>LS::Module_Method()</pre>
|
||||
*
|
||||
* @static
|
||||
* @param $sName Полное название метода, например <pre>Module_Method</pre>
|
||||
* @param array $aArgs Список аргуметов метода
|
||||
* @return mixed
|
||||
*/
|
||||
public static function __callStatic($sName,$aArgs=array()) {
|
||||
return call_user_func_array(array(self::E(),$sName),$aArgs);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
?>
|
Loading…
Reference in a new issue