2009-05-10 10:50:39 +03:00
|
|
|
|
<?php
|
2008-09-21 09:36:57 +03:00
|
|
|
|
/*-------------------------------------------------------
|
|
|
|
|
*
|
|
|
|
|
* LiveStreet Engine Social Networking
|
|
|
|
|
* Copyright © 2008 Mzhelskiy Maxim
|
|
|
|
|
*
|
|
|
|
|
*--------------------------------------------------------
|
|
|
|
|
*
|
|
|
|
|
* Official site: www.livestreet.ru
|
|
|
|
|
* Contact e-mail: rus.engine@gmail.com
|
|
|
|
|
*
|
|
|
|
|
* GNU General Public License, version 2:
|
|
|
|
|
* http://www.gnu.org/licenses/old-licenses/gpl-2.0.html
|
|
|
|
|
*
|
|
|
|
|
---------------------------------------------------------
|
|
|
|
|
*/
|
|
|
|
|
|
2009-07-26 16:43:16 +03:00
|
|
|
|
set_include_path(get_include_path().PATH_SEPARATOR.dirname(__FILE__));
|
2009-08-19 15:50:45 +03:00
|
|
|
|
require_once(Config::Get('path.root.engine').'/lib/internal/ProfilerSimple/Profiler.class.php');
|
2009-09-10 21:51:58 +03:00
|
|
|
|
|
2009-07-26 16:43:16 +03:00
|
|
|
|
require_once("Object.class.php");
|
2009-12-24 22:18:13 +02:00
|
|
|
|
require_once("Plugin.class.php");
|
2009-07-26 16:43:16 +03:00
|
|
|
|
require_once("Block.class.php");
|
|
|
|
|
require_once("Hook.class.php");
|
|
|
|
|
require_once("Module.class.php");
|
|
|
|
|
require_once("Router.class.php");
|
|
|
|
|
|
|
|
|
|
require_once("Entity.class.php");
|
|
|
|
|
require_once("Mapper.class.php");
|
|
|
|
|
|
2010-11-17 23:32:57 +02:00
|
|
|
|
require_once("ModuleORM.class.php");
|
|
|
|
|
require_once("EntityORM.class.php");
|
|
|
|
|
require_once("MapperORM.class.php");
|
|
|
|
|
|
2011-05-03 14:55:17 +03:00
|
|
|
|
require_once("ManyToManyRelation.class.php");
|
|
|
|
|
|
2010-08-19 12:02:15 +03:00
|
|
|
|
|
2008-09-21 09:36:57 +03:00
|
|
|
|
/**
|
|
|
|
|
* Основной класс движка, который позволяет напрямую обращаться к любому модулю
|
|
|
|
|
*
|
|
|
|
|
*/
|
|
|
|
|
class Engine extends Object {
|
|
|
|
|
|
2010-08-19 12:02:15 +03:00
|
|
|
|
/**
|
|
|
|
|
* Имя плагина
|
|
|
|
|
* @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;
|
2011-07-05 16:33:59 +03:00
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* Имя блока
|
|
|
|
|
* @var int
|
|
|
|
|
*/
|
|
|
|
|
const CI_BLOCK = 256;
|
2010-08-19 12:02:15 +03:00
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* Префикс плагина
|
|
|
|
|
* @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;
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* Объекты
|
2011-07-05 16:33:59 +03:00
|
|
|
|
* CI_ACTION | CI_MAPPER | CI_HOOK | CI_PLUGIN | CI_ACTION | CI_MODULE | CI_ENTITY | CI_BLOCK
|
2010-08-19 12:02:15 +03:00
|
|
|
|
* @var int
|
|
|
|
|
*/
|
2011-07-05 16:33:59 +03:00
|
|
|
|
const CI_OBJECT = 351 ;
|
2010-08-19 12:02:15 +03:00
|
|
|
|
|
2008-09-21 09:36:57 +03:00
|
|
|
|
static protected $oInstance=null;
|
|
|
|
|
|
|
|
|
|
protected $aModules=array();
|
2010-04-03 19:44:12 +03:00
|
|
|
|
protected $aPlugins=array();
|
2008-09-21 09:36:57 +03:00
|
|
|
|
protected $aConfigModule;
|
|
|
|
|
public $iTimeLoadModule=0;
|
2010-06-05 15:24:37 +03:00
|
|
|
|
protected $iTimeInit=null;
|
2008-09-21 09:36:57 +03:00
|
|
|
|
|
2010-06-06 16:46:03 +03:00
|
|
|
|
|
2008-09-21 09:36:57 +03:00
|
|
|
|
/**
|
|
|
|
|
* При создании объекта делаем инициализацию
|
|
|
|
|
*
|
|
|
|
|
*/
|
|
|
|
|
protected function __construct() {
|
2010-06-05 15:24:37 +03:00
|
|
|
|
$this->iTimeInit=microtime(true);
|
2009-07-26 16:43:16 +03:00
|
|
|
|
if (get_magic_quotes_gpc()) {
|
|
|
|
|
func_stripslashes($_REQUEST);
|
2010-02-13 15:30:16 +02:00
|
|
|
|
func_stripslashes($_GET);
|
|
|
|
|
func_stripslashes($_POST);
|
|
|
|
|
func_stripslashes($_COOKIE);
|
2009-07-26 16:43:16 +03:00
|
|
|
|
}
|
2008-09-21 09:36:57 +03:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* Ограничиваем объект только одним экземпляром
|
|
|
|
|
*
|
|
|
|
|
* @return Engine
|
|
|
|
|
*/
|
|
|
|
|
static public function getInstance() {
|
|
|
|
|
if (isset(self::$oInstance) and (self::$oInstance instanceof self)) {
|
|
|
|
|
return self::$oInstance;
|
|
|
|
|
} else {
|
|
|
|
|
self::$oInstance= new self();
|
|
|
|
|
return self::$oInstance;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* Инициализация
|
|
|
|
|
*
|
|
|
|
|
*/
|
2009-07-26 16:43:16 +03:00
|
|
|
|
public function Init() {
|
2009-12-24 22:18:13 +02:00
|
|
|
|
/**
|
2010-04-03 19:44:12 +03:00
|
|
|
|
* Загружаем плагины
|
2009-12-24 22:18:13 +02:00
|
|
|
|
*/
|
2010-04-03 19:44:12 +03:00
|
|
|
|
$this->LoadPlugins();
|
2009-11-22 21:38:44 +02:00
|
|
|
|
/**
|
|
|
|
|
* Инициализируем хуки
|
|
|
|
|
*/
|
2009-12-24 22:18:13 +02:00
|
|
|
|
$this->InitHooks();
|
2009-11-22 21:38:44 +02:00
|
|
|
|
/**
|
|
|
|
|
* Загружаем модули автозагрузки
|
|
|
|
|
*/
|
2009-07-26 16:43:16 +03:00
|
|
|
|
$this->LoadModules();
|
2009-11-22 21:38:44 +02:00
|
|
|
|
/**
|
|
|
|
|
* Инициализируем загруженные модули
|
|
|
|
|
*/
|
2009-07-26 16:43:16 +03:00
|
|
|
|
$this->InitModules();
|
2010-04-03 19:44:12 +03:00
|
|
|
|
/**
|
|
|
|
|
* Инициализируем загруженные плагины
|
|
|
|
|
*/
|
|
|
|
|
$this->InitPlugins();
|
2009-11-22 21:38:44 +02:00
|
|
|
|
/**
|
|
|
|
|
* Запускаем хуки для события завершения инициализации Engine
|
|
|
|
|
*/
|
|
|
|
|
$this->Hook_Run('engine_init_complete');
|
2009-07-26 16:43:16 +03:00
|
|
|
|
}
|
|
|
|
|
/**
|
|
|
|
|
* Завершение работы модуля
|
|
|
|
|
*
|
|
|
|
|
*/
|
|
|
|
|
public function Shutdown() {
|
|
|
|
|
$this->ShutdownModules();
|
2008-09-21 09:36:57 +03:00
|
|
|
|
}
|
|
|
|
|
/**
|
|
|
|
|
* Производит инициализацию всех модулей
|
|
|
|
|
*
|
|
|
|
|
*/
|
2009-07-26 16:43:16 +03:00
|
|
|
|
protected function InitModules() {
|
2008-09-21 09:36:57 +03:00
|
|
|
|
foreach ($this->aModules as $oModule) {
|
2010-02-04 21:44:19 +02:00
|
|
|
|
if(!$oModule->isInit()) {
|
|
|
|
|
/**
|
|
|
|
|
* Замеряем время инициализации модуля
|
|
|
|
|
*/
|
|
|
|
|
$oProfiler=ProfilerSimple::getInstance();
|
|
|
|
|
$iTimeId=$oProfiler->Start('InitModule',get_class($oModule));
|
2010-08-19 12:02:15 +03:00
|
|
|
|
|
2010-08-13 18:40:21 +03:00
|
|
|
|
$this->InitModule($oModule);
|
2010-02-04 21:44:19 +02:00
|
|
|
|
|
|
|
|
|
$oProfiler->Stop($iTimeId);
|
2010-02-04 21:26:38 +02:00
|
|
|
|
}
|
2008-09-21 09:36:57 +03:00
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
2010-08-13 18:40:21 +03:00
|
|
|
|
/**
|
|
|
|
|
* Инициализирует модуль
|
2010-08-19 12:02:15 +03:00
|
|
|
|
*
|
2010-08-13 18:40:21 +03:00
|
|
|
|
* @param unknown_type $oModule
|
2010-08-19 12:02:15 +03:00
|
|
|
|
* @param unknown_type $bHookParent
|
2010-08-13 18:40:21 +03:00
|
|
|
|
*/
|
2010-08-19 12:02:15 +03:00
|
|
|
|
protected function InitModule($oModule, $bHookParent = true){
|
|
|
|
|
$sOrigClassName = $sClassName = get_class($oModule);
|
2010-08-13 18:40:21 +03:00
|
|
|
|
$bRunHooks = false;
|
2010-08-19 12:02:15 +03:00
|
|
|
|
|
2010-08-13 18:40:21 +03:00
|
|
|
|
if($this->isInitModule('ModuleHook')){
|
|
|
|
|
$bRunHooks = true;
|
2010-08-19 12:02:15 +03:00
|
|
|
|
if($bHookParent){
|
|
|
|
|
while(self::GetPluginName($sClassName)){
|
|
|
|
|
$sParentClassName = get_parent_class($sClassName);
|
|
|
|
|
if(!self::GetClassInfo($sParentClassName, self::CI_MODULE, true)){
|
|
|
|
|
break;
|
|
|
|
|
}
|
|
|
|
|
$sClassName = $sParentClassName;
|
2010-08-13 18:40:21 +03:00
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
if($bRunHooks || $sClassName == 'ModuleHook'){
|
|
|
|
|
$sHookPrefix = 'module_';
|
2010-08-19 12:02:15 +03:00
|
|
|
|
if($sPluginName = self::GetPluginName($sClassName)){
|
2010-08-13 18:40:21 +03:00
|
|
|
|
$sHookPrefix .= "plugin{$sPluginName}_";
|
|
|
|
|
}
|
2010-08-14 01:40:01 +03:00
|
|
|
|
$sHookPrefix .= self::GetModuleName($sClassName).'_init_';
|
2010-08-13 18:40:21 +03:00
|
|
|
|
}
|
|
|
|
|
if($bRunHooks){
|
|
|
|
|
$this->Hook_Run($sHookPrefix.'before');
|
|
|
|
|
}
|
|
|
|
|
$oModule->Init();
|
2010-08-19 12:02:15 +03:00
|
|
|
|
$oModule->SetInit();
|
2010-08-13 18:40:21 +03:00
|
|
|
|
if($bRunHooks || $sClassName == 'ModuleHook'){
|
|
|
|
|
$this->Hook_Run($sHookPrefix.'after');
|
2010-08-19 12:02:15 +03:00
|
|
|
|
}
|
2010-08-13 18:40:21 +03:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* Проверяет модуль на инициализацию
|
|
|
|
|
*
|
|
|
|
|
* @param unknown_type $sModuleClass
|
|
|
|
|
* @return unknown
|
|
|
|
|
*/
|
|
|
|
|
public function isInitModule($sModuleClass) {
|
|
|
|
|
if(!in_array($sModuleClass,array('ModulePlugin','ModuleHook'))) {
|
|
|
|
|
$sModuleClass=$this->Plugin_GetDelegate('module',$sModuleClass);
|
|
|
|
|
}
|
|
|
|
|
if(isset($this->aModules[$sModuleClass]) and $this->aModules[$sModuleClass]->isInit()){
|
|
|
|
|
return true;
|
|
|
|
|
}
|
|
|
|
|
return false;
|
|
|
|
|
}
|
|
|
|
|
|
2008-09-21 09:36:57 +03:00
|
|
|
|
/**
|
|
|
|
|
* Завершаем работу всех модулей
|
|
|
|
|
*
|
|
|
|
|
*/
|
2009-07-26 16:43:16 +03:00
|
|
|
|
protected function ShutdownModules() {
|
2009-11-22 20:59:19 +02:00
|
|
|
|
foreach ($this->aModules as $sKey => $oModule) {
|
2009-12-22 23:48:46 +02:00
|
|
|
|
/**
|
|
|
|
|
* Замеряем время shutdown`a модуля
|
|
|
|
|
*/
|
|
|
|
|
$oProfiler=ProfilerSimple::getInstance();
|
|
|
|
|
$iTimeId=$oProfiler->Start('ShutdownModule',get_class($oModule));
|
|
|
|
|
|
2008-09-21 09:36:57 +03:00
|
|
|
|
$oModule->Shutdown();
|
2009-12-22 23:48:46 +02:00
|
|
|
|
|
|
|
|
|
$oProfiler->Stop($iTimeId);
|
2008-09-21 09:36:57 +03:00
|
|
|
|
}
|
|
|
|
|
}
|
2010-08-19 12:02:15 +03:00
|
|
|
|
|
2008-09-21 09:36:57 +03:00
|
|
|
|
/**
|
|
|
|
|
* Выполняет загрузку модуля по его названию
|
|
|
|
|
*
|
2010-08-13 18:40:21 +03:00
|
|
|
|
* @param string $sModuleClass
|
2010-01-27 17:05:34 +02:00
|
|
|
|
* @param bool $bInit - инициализировать модуль или нет
|
|
|
|
|
* @return Module
|
2008-09-21 09:36:57 +03:00
|
|
|
|
*/
|
2010-08-13 18:40:21 +03:00
|
|
|
|
public function LoadModule($sModuleClass,$bInit=false) {
|
2009-11-22 20:59:19 +02:00
|
|
|
|
$tm1=microtime(true);
|
2009-12-24 22:18:13 +02:00
|
|
|
|
|
|
|
|
|
/**
|
2009-06-29 21:44:26 +03:00
|
|
|
|
* Создаем объект модуля
|
2009-12-24 22:18:13 +02:00
|
|
|
|
*/
|
2010-08-13 18:40:21 +03:00
|
|
|
|
$oModule=new $sModuleClass($this);
|
|
|
|
|
$this->aModules[$sModuleClass]=$oModule;
|
|
|
|
|
if ($bInit or $sModuleClass=='ModuleCache') {
|
|
|
|
|
$this->InitModule($oModule);
|
|
|
|
|
}
|
2008-09-21 09:36:57 +03:00
|
|
|
|
$tm2=microtime(true);
|
|
|
|
|
$this->iTimeLoadModule+=$tm2-$tm1;
|
2010-08-13 18:40:21 +03:00
|
|
|
|
dump("load $sModuleClass - \t\t".($tm2-$tm1)."");
|
2008-09-21 09:36:57 +03:00
|
|
|
|
return $oModule;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* Загружает все используемые модули и передает им в конструктор ядро
|
|
|
|
|
*
|
|
|
|
|
*/
|
|
|
|
|
protected function LoadModules() {
|
2009-05-04 22:07:02 +03:00
|
|
|
|
$this->LoadConfig();
|
2008-09-21 09:36:57 +03:00
|
|
|
|
foreach ($this->aConfigModule['autoLoad'] as $sModuleName) {
|
2010-06-23 10:11:45 +03:00
|
|
|
|
$sModuleClass='Module'.$sModuleName;
|
|
|
|
|
if(!in_array($sModuleName,array('Plugin','Hook'))) $sModuleClass=$this->Plugin_GetDelegate('module',$sModuleClass);
|
|
|
|
|
|
|
|
|
|
if (!isset($this->aModules[$sModuleClass])) {
|
|
|
|
|
$this->LoadModule($sModuleClass);
|
2010-02-13 15:09:48 +02:00
|
|
|
|
}
|
2008-09-21 09:36:57 +03:00
|
|
|
|
}
|
|
|
|
|
}
|
2009-05-04 22:07:02 +03:00
|
|
|
|
/**
|
|
|
|
|
* Выполняет загрузку конфигов
|
|
|
|
|
*
|
|
|
|
|
*/
|
|
|
|
|
protected function LoadConfig() {
|
2009-08-19 15:50:45 +03:00
|
|
|
|
$this->aConfigModule = Config::Get('module');
|
2009-05-04 22:07:02 +03:00
|
|
|
|
}
|
2009-05-09 20:04:04 +03:00
|
|
|
|
/**
|
|
|
|
|
* Регистрирует хуки из /classes/hooks/
|
|
|
|
|
*
|
|
|
|
|
*/
|
2009-07-26 16:43:16 +03:00
|
|
|
|
protected function InitHooks() {
|
2009-08-19 15:50:45 +03:00
|
|
|
|
$sDirHooks=Config::Get('path.root.server').'/classes/hooks/';
|
2009-12-24 22:18:13 +02:00
|
|
|
|
$aFiles=glob($sDirHooks.'Hook*.class.php');
|
|
|
|
|
|
|
|
|
|
if($aFiles and count($aFiles)) {
|
|
|
|
|
foreach ($aFiles as $sFile) {
|
2010-08-19 12:02:15 +03:00
|
|
|
|
if (preg_match("/Hook([^_]+)\.class\.php$/i",basename($sFile),$aMatch)) {
|
|
|
|
|
//require_once($sFile);
|
2009-12-24 22:18:13 +02:00
|
|
|
|
$sClassName='Hook'.$aMatch[1];
|
|
|
|
|
$oHook=new $sClassName;
|
|
|
|
|
$oHook->RegisterHook();
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* Подгружаем хуки активных плагинов
|
|
|
|
|
*/
|
|
|
|
|
$this->InitPluginHooks();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* Инициализация хуков активированных плагинов
|
|
|
|
|
*
|
|
|
|
|
*/
|
|
|
|
|
protected function InitPluginHooks() {
|
2010-08-19 12:02:15 +03:00
|
|
|
|
if($aPluginList = func_list_plugins()) {
|
2010-01-27 17:14:00 +02:00
|
|
|
|
|
2009-12-24 22:18:13 +02:00
|
|
|
|
$aFiles=array();
|
2010-01-08 22:01:40 +02:00
|
|
|
|
$sDirHooks=Config::Get('path.root.server').'/plugins/';
|
2009-12-24 22:18:13 +02:00
|
|
|
|
|
|
|
|
|
foreach ($aPluginList as $sPluginName) {
|
|
|
|
|
$aFiles=glob($sDirHooks.$sPluginName.'/classes/hooks/Hook*.class.php');
|
|
|
|
|
if($aFiles and count($aFiles)) {
|
|
|
|
|
foreach ($aFiles as $sFile) {
|
2010-08-19 12:02:15 +03:00
|
|
|
|
if (preg_match("/Hook([^_]+)\.class\.php$/i",basename($sFile),$aMatch)) {
|
|
|
|
|
//require_once($sFile);
|
2010-03-06 21:34:00 +02:00
|
|
|
|
$sPluginName = ucfirst($sPluginName);
|
2009-12-24 22:18:13 +02:00
|
|
|
|
$sClassName="Plugin{$sPluginName}_Hook{$aMatch[1]}";
|
|
|
|
|
$oHook=new $sClassName;
|
|
|
|
|
$oHook->RegisterHook();
|
|
|
|
|
}
|
2009-11-22 20:59:19 +02:00
|
|
|
|
}
|
2009-05-09 20:04:04 +03:00
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
2009-12-24 22:18:13 +02:00
|
|
|
|
|
|
|
|
|
/**
|
2010-04-03 19:44:12 +03:00
|
|
|
|
* Загрузка плагинов и делегирование
|
2009-12-24 22:18:13 +02:00
|
|
|
|
*
|
|
|
|
|
*/
|
2010-04-03 19:44:12 +03:00
|
|
|
|
protected function LoadPlugins() {
|
2010-08-19 12:02:15 +03:00
|
|
|
|
if($aPluginList = func_list_plugins()) {
|
2009-12-24 22:18:13 +02:00
|
|
|
|
foreach ($aPluginList as $sPluginName) {
|
2010-08-19 12:02:15 +03:00
|
|
|
|
$sClassName='Plugin'.ucfirst($sPluginName);
|
|
|
|
|
$oPlugin=new $sClassName;
|
|
|
|
|
$oPlugin->Delegate();
|
|
|
|
|
$this->aPlugins[$sPluginName]=$oPlugin;
|
2009-12-24 22:18:13 +02:00
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
2010-04-03 19:44:12 +03:00
|
|
|
|
/**
|
|
|
|
|
* Инициализация активированных плагинов
|
|
|
|
|
*
|
|
|
|
|
*/
|
|
|
|
|
protected function InitPlugins() {
|
|
|
|
|
foreach ($this->aPlugins as $oPlugin) {
|
|
|
|
|
$oPlugin->Init();
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
2010-05-04 13:08:49 +03:00
|
|
|
|
/**
|
|
|
|
|
* Возвращает список активных плагинов
|
|
|
|
|
*
|
|
|
|
|
* @return unknown
|
|
|
|
|
*/
|
|
|
|
|
public function GetPlugins() {
|
|
|
|
|
return $this->aPlugins;
|
|
|
|
|
}
|
|
|
|
|
|
2009-07-02 22:21:11 +03:00
|
|
|
|
/**
|
|
|
|
|
* Проверяет файл на существование, если используется кеширование memcache то кеширует результат работы
|
|
|
|
|
*
|
2009-12-24 22:18:13 +02:00
|
|
|
|
* @param string $sFile
|
|
|
|
|
* @return mixed
|
2009-07-02 22:21:11 +03:00
|
|
|
|
*/
|
2010-08-19 12:02:15 +03:00
|
|
|
|
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'
|
|
|
|
|
){
|
|
|
|
|
return file_exists($sFile);
|
2009-07-02 22:21:11 +03:00
|
|
|
|
}
|
2010-08-19 12:02:15 +03:00
|
|
|
|
if (false === ($data = $this->Cache_Get("file_exists_{$sFile}"))) {
|
|
|
|
|
$data=file_exists($sFile);
|
|
|
|
|
$this->Cache_Set((int)$data, "file_exists_{$sFile}", array(), $iTime);
|
2009-07-02 22:21:11 +03:00
|
|
|
|
}
|
2010-08-19 12:02:15 +03:00
|
|
|
|
return $data;
|
2009-07-02 22:21:11 +03:00
|
|
|
|
}
|
2008-09-21 09:36:57 +03:00
|
|
|
|
/**
|
|
|
|
|
* Вызывает метод нужного модуля
|
|
|
|
|
*
|
|
|
|
|
* @param string $sName
|
|
|
|
|
* @param array $aArgs
|
|
|
|
|
* @return unknown
|
|
|
|
|
*/
|
2010-01-10 16:26:44 +02:00
|
|
|
|
public function _CallModule($sName,$aArgs) {
|
2009-12-24 22:18:13 +02:00
|
|
|
|
list($oModule,$sModuleName,$sMethod)=$this->GetModule($sName);
|
2008-09-21 09:36:57 +03:00
|
|
|
|
|
2009-12-24 22:18:13 +02:00
|
|
|
|
if (!method_exists($oModule,$sMethod)) {
|
2010-08-13 18:40:21 +03:00
|
|
|
|
// comment for ORM testing
|
|
|
|
|
//throw new Exception("The module has no required method: ".$sModuleName.'->'.$sMethod.'()');
|
2009-12-24 22:18:13 +02:00
|
|
|
|
}
|
2010-03-26 16:08:16 +02:00
|
|
|
|
|
2009-07-26 16:43:16 +03:00
|
|
|
|
$oProfiler=ProfilerSimple::getInstance();
|
2009-12-24 22:18:13 +02:00
|
|
|
|
$iTimeId=$oProfiler->Start('callModule',$sModuleName.'->'.$sMethod.'()');
|
2010-03-26 16:08:16 +02:00
|
|
|
|
|
|
|
|
|
$sModuleName=strtolower($sModuleName);
|
|
|
|
|
$aResultHook=array();
|
|
|
|
|
if (!in_array($sModuleName,array('plugin','hook'))) {
|
2010-03-28 00:53:39 +02:00
|
|
|
|
$aResultHook=$this->_CallModule('Hook_Run',array('module_'.$sModuleName.'_'.strtolower($sMethod).'_before',&$aArgs));
|
2010-03-26 16:08:16 +02:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (array_key_exists('delegate_result',$aResultHook)) {
|
|
|
|
|
$result=$aResultHook['delegate_result'];
|
|
|
|
|
} else {
|
2010-03-30 23:28:29 +03:00
|
|
|
|
$aArgsRef=array();
|
|
|
|
|
foreach ($aArgs as $key=>$v) {
|
|
|
|
|
$aArgsRef[]=&$aArgs[$key];
|
|
|
|
|
}
|
|
|
|
|
$result=call_user_func_array(array($oModule,$sMethod),$aArgsRef);
|
2010-03-26 16:08:16 +02:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (!in_array($sModuleName,array('plugin','hook'))) {
|
2010-07-06 14:54:52 +03:00
|
|
|
|
$this->Hook_Run('module_'.$sModuleName.'_'.strtolower($sMethod).'_after',array('result'=>&$result,'params'=>$aArgs));
|
2010-03-26 16:08:16 +02:00
|
|
|
|
}
|
|
|
|
|
|
2009-07-26 16:43:16 +03:00
|
|
|
|
$oProfiler->Stop($iTimeId);
|
2009-12-24 22:18:13 +02:00
|
|
|
|
return $result;
|
2008-09-21 09:36:57 +03:00
|
|
|
|
}
|
|
|
|
|
|
2009-12-24 22:18:13 +02:00
|
|
|
|
/**
|
|
|
|
|
* Возвращает объект модуля, имя модуля и имя вызванного метода
|
|
|
|
|
*
|
|
|
|
|
* @param string $sName
|
|
|
|
|
* @return array
|
|
|
|
|
*/
|
|
|
|
|
public function GetModule($sName) {
|
2010-07-07 18:35:18 +03:00
|
|
|
|
/**
|
|
|
|
|
* Поддержка полного синтаксиса при вызове метода модуля
|
|
|
|
|
*/
|
2010-08-19 12:02:15 +03:00
|
|
|
|
$aInfo = self::GetClassInfo(
|
|
|
|
|
$sName,
|
|
|
|
|
self::CI_MODULE
|
|
|
|
|
|self::CI_PPREFIX
|
|
|
|
|
|self::CI_METHOD
|
|
|
|
|
);
|
|
|
|
|
if($aInfo[self::CI_MODULE] && $aInfo[self::CI_METHOD]){
|
|
|
|
|
$sName = $aInfo[self::CI_MODULE].'_'.$aInfo[self::CI_METHOD];
|
|
|
|
|
if($aInfo[self::CI_PPREFIX]){
|
|
|
|
|
$sName = $aInfo[self::CI_PPREFIX].$sName;
|
|
|
|
|
}
|
2010-07-07 18:35:18 +03:00
|
|
|
|
}
|
2010-08-19 12:02:15 +03:00
|
|
|
|
|
2009-12-24 22:18:13 +02:00
|
|
|
|
$aName=explode("_",$sName);
|
|
|
|
|
|
|
|
|
|
if(count($aName)==2) {
|
|
|
|
|
$sModuleName=$aName[0];
|
2010-06-01 19:20:30 +03:00
|
|
|
|
$sModuleClass='Module'.$aName[0];
|
2009-12-24 22:18:13 +02:00
|
|
|
|
$sMethod=$aName[1];
|
2010-08-19 12:02:15 +03:00
|
|
|
|
} elseif (count($aName)==3) {
|
2009-12-24 22:18:13 +02:00
|
|
|
|
$sModuleName=$aName[0].'_'.$aName[1];
|
2010-06-01 19:20:30 +03:00
|
|
|
|
$sModuleClass=$aName[0].'_Module'.$aName[1];
|
2009-12-24 22:18:13 +02:00
|
|
|
|
$sMethod=$aName[2];
|
2010-08-19 12:02:15 +03:00
|
|
|
|
} else {
|
|
|
|
|
throw new Exception("Undefined method module: ".$sName);
|
2009-12-24 22:18:13 +02:00
|
|
|
|
}
|
2010-01-10 16:26:44 +02:00
|
|
|
|
/**
|
|
|
|
|
* Подхватыем делегат модуля (в случае наличия такового)
|
|
|
|
|
*/
|
2010-08-19 12:02:15 +03:00
|
|
|
|
if(!in_array($sModuleName,array('Plugin','Hook'))){
|
|
|
|
|
$sModuleClass=$this->Plugin_GetDelegate('module',$sModuleClass);
|
|
|
|
|
}
|
2010-01-10 16:26:44 +02:00
|
|
|
|
|
2010-06-01 19:20:30 +03:00
|
|
|
|
if (isset($this->aModules[$sModuleClass])) {
|
|
|
|
|
$oModule=$this->aModules[$sModuleClass];
|
2009-12-24 22:18:13 +02:00
|
|
|
|
} else {
|
2010-06-01 19:20:30 +03:00
|
|
|
|
$oModule=$this->LoadModule($sModuleClass,true);
|
2009-12-24 22:18:13 +02:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return array($oModule,$sModuleName,$sMethod);
|
|
|
|
|
}
|
|
|
|
|
|
2009-07-26 16:43:16 +03:00
|
|
|
|
public function getStats() {
|
|
|
|
|
return array('sql'=>$this->Database_GetStats(),'cache'=>$this->Cache_GetStats(),'engine'=>array('time_load_module'=>round($this->iTimeLoadModule,3)));
|
|
|
|
|
}
|
2010-06-05 15:24:37 +03:00
|
|
|
|
|
|
|
|
|
public function GetTimeInit() {
|
|
|
|
|
return $this->iTimeInit;
|
|
|
|
|
}
|
2008-09-21 09:36:57 +03:00
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* Ставим хук на вызов неизвестного метода и считаем что хотели вызвать метод какого либо модуля
|
|
|
|
|
*
|
|
|
|
|
* @param string $sName
|
|
|
|
|
* @param array $aArgs
|
|
|
|
|
* @return unknown
|
|
|
|
|
*/
|
|
|
|
|
public function __call($sName,$aArgs) {
|
|
|
|
|
return $this->_CallModule($sName,$aArgs);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
2010-08-19 12:02:15 +03:00
|
|
|
|
* Блокируем копирование/клонирование объекта ядра
|
2008-09-21 09:36:57 +03:00
|
|
|
|
*
|
|
|
|
|
*/
|
|
|
|
|
protected function __clone() {
|
|
|
|
|
|
|
|
|
|
}
|
2009-09-07 00:14:16 +03:00
|
|
|
|
|
2010-05-27 23:40:30 +03:00
|
|
|
|
/**
|
|
|
|
|
* Получает объект маппера
|
|
|
|
|
*
|
|
|
|
|
* @param string $sClassName
|
|
|
|
|
* @param string $sName
|
|
|
|
|
* @return mixed
|
|
|
|
|
*/
|
|
|
|
|
public static function GetMapper($sClassName,$sName=null,$oConnect=null) {
|
2010-08-19 12:02:15 +03:00
|
|
|
|
$sModuleName = self::GetClassInfo(
|
|
|
|
|
$sClassName,
|
|
|
|
|
self::CI_MODULE,
|
|
|
|
|
true
|
|
|
|
|
);
|
|
|
|
|
if ($sModuleName) {
|
2010-05-27 23:40:30 +03:00
|
|
|
|
if (!$sName) {
|
2010-08-19 12:02:15 +03:00
|
|
|
|
$sName=$sModuleName;
|
2010-05-27 23:40:30 +03:00
|
|
|
|
}
|
|
|
|
|
$sClass=$sClassName.'_Mapper'.$sName;
|
|
|
|
|
if (!$oConnect) {
|
|
|
|
|
$oConnect=Engine::getInstance()->Database_GetConnect();
|
|
|
|
|
}
|
2010-06-06 17:09:21 +03:00
|
|
|
|
$sClass=self::getInstance()->Plugin_GetDelegate('mapper',$sClass);
|
2010-05-27 23:40:30 +03:00
|
|
|
|
return new $sClass($oConnect);
|
|
|
|
|
}
|
|
|
|
|
return null;
|
|
|
|
|
}
|
|
|
|
|
|
2009-09-07 00:14:16 +03:00
|
|
|
|
/**
|
|
|
|
|
* Создает объект сущности, контролируя варианты кастомизации
|
|
|
|
|
*
|
|
|
|
|
* @param string $sName
|
|
|
|
|
* @param mixed $aParams
|
|
|
|
|
* @return mixed
|
|
|
|
|
*/
|
2009-09-07 16:35:18 +03:00
|
|
|
|
public static function GetEntity($sName,$aParams=array()) {
|
2009-09-07 00:14:16 +03:00
|
|
|
|
/**
|
|
|
|
|
* Сущности, имеющие такое же название как модуль,
|
|
|
|
|
* можно вызывать сокращенно. Например, вместо User_User -> User
|
|
|
|
|
*/
|
2009-12-25 16:59:47 +02:00
|
|
|
|
switch (substr_count($sName,'_')) {
|
|
|
|
|
case 0:
|
|
|
|
|
$sEntity = $sModule = $sName;
|
|
|
|
|
break;
|
|
|
|
|
|
2010-08-19 12:02:15 +03:00
|
|
|
|
case 1:
|
2010-07-07 18:35:18 +03:00
|
|
|
|
/**
|
|
|
|
|
* Поддержка полного синтаксиса при вызове сущности
|
|
|
|
|
*/
|
2010-08-19 12:02:15 +03:00
|
|
|
|
$aInfo = self::GetClassInfo(
|
|
|
|
|
$sName,
|
|
|
|
|
self::CI_ENTITY
|
|
|
|
|
|self::CI_MODULE
|
|
|
|
|
|self::CI_PLUGIN
|
|
|
|
|
);
|
|
|
|
|
if ($aInfo[self::CI_MODULE]
|
|
|
|
|
&& $aInfo[self::CI_ENTITY]) {
|
|
|
|
|
$sName=$aInfo[self::CI_MODULE].'_'.$aInfo[self::CI_ENTITY];
|
2010-07-07 18:35:18 +03:00
|
|
|
|
}
|
|
|
|
|
|
2009-12-25 16:59:47 +02:00
|
|
|
|
list($sModule,$sEntity) = explode('_',$sName,2);
|
2010-03-15 22:02:23 +02:00
|
|
|
|
/**
|
|
|
|
|
* Обслуживание короткой записи сущностей плагинов
|
2010-05-27 18:16:20 +03:00
|
|
|
|
* PluginTest_Test -> PluginTest_ModuleTest_EntityTest
|
2010-03-15 22:02:23 +02:00
|
|
|
|
*/
|
2010-08-19 12:02:15 +03:00
|
|
|
|
if($aInfo[self::CI_PLUGIN]) {
|
|
|
|
|
$sPlugin = $aInfo[self::CI_PLUGIN];
|
2010-03-15 22:02:23 +02:00
|
|
|
|
$sModule = $sEntity;
|
|
|
|
|
}
|
2009-12-25 16:59:47 +02:00
|
|
|
|
break;
|
|
|
|
|
|
|
|
|
|
case 2:
|
2010-07-07 18:35:18 +03:00
|
|
|
|
/**
|
|
|
|
|
* Поддержка полного синтаксиса при вызове сущности плагина
|
|
|
|
|
*/
|
2010-08-19 12:02:15 +03:00
|
|
|
|
$aInfo = self::GetClassInfo(
|
|
|
|
|
$sName,
|
|
|
|
|
self::CI_ENTITY
|
|
|
|
|
|self::CI_MODULE
|
|
|
|
|
|self::CI_PLUGIN
|
|
|
|
|
);
|
|
|
|
|
if ($aInfo[self::CI_PLUGIN]
|
|
|
|
|
&& $aInfo[self::CI_MODULE]
|
|
|
|
|
&& $aInfo[self::CI_ENTITY]) {
|
|
|
|
|
$sName='Plugin'.$aInfo[self::CI_PLUGIN]
|
|
|
|
|
.'_'.$aInfo[self::CI_MODULE]
|
|
|
|
|
.'_'.$aInfo[self::CI_ENTITY]
|
|
|
|
|
;
|
2010-07-07 18:35:18 +03:00
|
|
|
|
}
|
2009-12-25 16:59:47 +02:00
|
|
|
|
/**
|
|
|
|
|
* Entity плагина
|
|
|
|
|
*/
|
2010-08-19 12:02:15 +03:00
|
|
|
|
if($aInfo[self::CI_PLUGIN]) {
|
|
|
|
|
list(,$sModule,$sEntity)=explode('_',$sName);
|
|
|
|
|
$sPlugin = $aInfo[self::CI_PLUGIN];
|
2009-12-25 16:59:47 +02:00
|
|
|
|
} else {
|
2010-01-10 16:26:44 +02:00
|
|
|
|
throw new Exception("Unknown entity '{$sName}' given.");
|
2009-12-25 16:59:47 +02:00
|
|
|
|
}
|
|
|
|
|
break;
|
|
|
|
|
|
|
|
|
|
default:
|
|
|
|
|
throw new Exception("Unknown entity '{$sName}' given.");
|
2009-09-07 00:14:16 +03:00
|
|
|
|
}
|
2010-06-06 16:46:03 +03:00
|
|
|
|
|
2009-12-25 16:59:47 +02:00
|
|
|
|
$sClass=isset($sPlugin)
|
2010-05-27 18:16:20 +03:00
|
|
|
|
? 'Plugin'.$sPlugin.'_Module'.$sModule.'_Entity'.$sEntity
|
|
|
|
|
: 'Module'.$sModule.'_Entity'.$sEntity;
|
2010-11-08 03:35:00 +02:00
|
|
|
|
|
|
|
|
|
/**
|
2010-11-18 19:09:22 +02:00
|
|
|
|
* If Plugin Entity doesn't exist, search among it's Module delegates
|
2010-11-08 03:35:00 +02:00
|
|
|
|
*/
|
|
|
|
|
if(isset($sPlugin) && !self::GetClassPath($sClass)) {
|
2010-11-18 19:09:22 +02:00
|
|
|
|
$aModulesChain = Engine::GetInstance()->Plugin_GetDelegationChain('module','Plugin'.$sPlugin.'_Module'.$sModule);
|
|
|
|
|
foreach($aModulesChain as $sModuleName) {
|
|
|
|
|
$sClassTest=$sModuleName.'_Entity'.$sEntity;
|
|
|
|
|
if(self::GetClassPath($sClassTest)) {
|
|
|
|
|
$sClass=$sClassTest;
|
|
|
|
|
break;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
if(!self::GetClassPath($sClass)) {
|
|
|
|
|
$sClass='Module'.$sModule.'_Entity'.$sEntity;
|
|
|
|
|
}
|
2010-11-08 03:35:00 +02:00
|
|
|
|
}
|
|
|
|
|
|
2010-03-15 22:02:23 +02:00
|
|
|
|
/**
|
|
|
|
|
* Определяем наличие делегата сущности
|
|
|
|
|
* Делегирование указывается только в полной форме!
|
|
|
|
|
*/
|
|
|
|
|
$sClass=self::getInstance()->Plugin_GetDelegate('entity',$sClass);
|
2010-11-13 07:44:45 +02:00
|
|
|
|
|
2009-09-07 00:14:16 +03:00
|
|
|
|
$oEntity=new $sClass($aParams);
|
|
|
|
|
return $oEntity;
|
|
|
|
|
}
|
2010-08-11 14:36:33 +03:00
|
|
|
|
|
|
|
|
|
|
2010-08-19 12:02:15 +03:00
|
|
|
|
public static function GetPluginName($oModule) {
|
|
|
|
|
return self::GetClassInfo($oModule, self::CI_PLUGIN, true);
|
2010-08-11 14:36:33 +03:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public static function GetPluginPrefix($oModule) {
|
2010-08-19 12:02:15 +03:00
|
|
|
|
return self::GetClassInfo($oModule, self::CI_PPREFIX, true);
|
2010-08-11 14:36:33 +03:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public static function GetModuleName($oModule) {
|
2010-08-19 12:02:15 +03:00
|
|
|
|
return self::GetClassInfo($oModule, self::CI_MODULE, true);
|
2010-08-11 14:36:33 +03:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public static function GetEntityName($oEntity) {
|
2010-08-19 12:02:15 +03:00
|
|
|
|
return self::GetClassInfo($oEntity, self::CI_ENTITY, true);
|
2008-09-21 09:36:57 +03:00
|
|
|
|
}
|
2010-05-27 18:16:20 +03:00
|
|
|
|
|
2010-08-19 12:02:15 +03:00
|
|
|
|
public static function GetActionName($oAction) {
|
|
|
|
|
return self::GetClassInfo($oAction, self::CI_ACTION, true);
|
2009-11-23 21:22:59 +02:00
|
|
|
|
}
|
2010-05-27 23:40:30 +03:00
|
|
|
|
|
2010-08-19 12:02:15 +03:00
|
|
|
|
public static function GetClassInfo($oObject,$iFlag=self::CI_DEFAULT,$bSingle=false){
|
|
|
|
|
$sClassName = is_string($oObject) ? $oObject : get_class($oObject);
|
|
|
|
|
$aResult = array();
|
|
|
|
|
if($iFlag & self::CI_PLUGIN){
|
|
|
|
|
$aResult[self::CI_PLUGIN] = preg_match('/^Plugin([^_]+)/',$sClassName,$aMatches)
|
|
|
|
|
? $aMatches[1]
|
|
|
|
|
: null
|
|
|
|
|
;
|
|
|
|
|
}
|
|
|
|
|
if($iFlag & self::CI_ACTION){
|
|
|
|
|
$aResult[self::CI_ACTION] = preg_match('/^(?:Plugin[^_]+_|)Action([^_]+)/',$sClassName,$aMatches)
|
|
|
|
|
? $aMatches[1]
|
|
|
|
|
: null
|
|
|
|
|
;
|
|
|
|
|
}
|
|
|
|
|
if($iFlag & self::CI_MODULE){
|
|
|
|
|
$aResult[self::CI_MODULE] = preg_match('/^(?:Plugin[^_]+_|)Module(?:ORM|)([^_]+)/',$sClassName,$aMatches)
|
|
|
|
|
? $aMatches[1]
|
|
|
|
|
: null
|
|
|
|
|
;
|
|
|
|
|
}
|
|
|
|
|
if($iFlag & self::CI_ENTITY){
|
|
|
|
|
$aResult[self::CI_ENTITY] = preg_match('/_Entity(?:ORM|)([^_]+)/',$sClassName,$aMatches)
|
|
|
|
|
? $aMatches[1]
|
|
|
|
|
: null
|
|
|
|
|
;
|
|
|
|
|
}
|
|
|
|
|
if($iFlag & self::CI_MAPPER){
|
|
|
|
|
$aResult[self::CI_MAPPER] = preg_match('/_Mapper(?:ORM|)([^_]+)/',$sClassName,$aMatches)
|
|
|
|
|
? $aMatches[1]
|
|
|
|
|
: null
|
|
|
|
|
;
|
|
|
|
|
}
|
|
|
|
|
if($iFlag & self::CI_HOOK){
|
|
|
|
|
$aResult[self::CI_HOOK] = preg_match('/^(?:Plugin[^_]+_|)Hook([^_]+)$/',$sClassName,$aMatches)
|
|
|
|
|
? $aMatches[1]
|
|
|
|
|
: null
|
|
|
|
|
;
|
2011-07-05 16:33:59 +03:00
|
|
|
|
}
|
|
|
|
|
if($iFlag & self::CI_BLOCK){
|
|
|
|
|
$aResult[self::CI_BLOCK] = preg_match('/^(?:Plugin[^_]+_|)Block([^_]+)$/',$sClassName,$aMatches)
|
|
|
|
|
? $aMatches[1]
|
|
|
|
|
: null
|
|
|
|
|
;
|
2010-08-19 12:02:15 +03:00
|
|
|
|
}
|
|
|
|
|
if($iFlag & self::CI_METHOD){
|
|
|
|
|
$sModuleName = isset($aResult[self::CI_MODULE])
|
|
|
|
|
? $aResult[self::CI_MODULE]
|
|
|
|
|
: self::GetClassInfo($sClassName, self::CI_MODULE, true)
|
|
|
|
|
;
|
|
|
|
|
$aResult[self::CI_METHOD] = preg_match('/_([^_]+)$/',$sClassName,$aMatches)
|
|
|
|
|
? ($sModuleName && strtolower($aMatches[1]) == strtolower('module'.$sModuleName)
|
|
|
|
|
? null
|
|
|
|
|
: $aMatches[1]
|
|
|
|
|
)
|
|
|
|
|
: null
|
|
|
|
|
;
|
|
|
|
|
}
|
|
|
|
|
if($iFlag & self::CI_PPREFIX){
|
|
|
|
|
$sPluginName = isset($aResult[self::CI_PLUGIN])
|
|
|
|
|
? $aResult[self::CI_PLUGIN]
|
|
|
|
|
: self::GetClassInfo($sClassName, self::CI_PLUGIN, true)
|
|
|
|
|
;
|
|
|
|
|
$aResult[self::CI_PPREFIX] = $sPluginName
|
|
|
|
|
? "Plugin{$sPluginName}_"
|
|
|
|
|
: ''
|
|
|
|
|
;
|
|
|
|
|
}
|
|
|
|
|
if($iFlag & self::CI_INHERIT){
|
|
|
|
|
$aResult[self::CI_INHERIT] = preg_match('/_Inherits?_(\w+)$/',$sClassName,$aMatches)
|
|
|
|
|
? $aMatches[1]
|
|
|
|
|
: null
|
|
|
|
|
;
|
|
|
|
|
}
|
|
|
|
|
if($iFlag & self::CI_INHERITS){
|
|
|
|
|
$sInherit = isset($aResult[self::CI_INHERIT])
|
|
|
|
|
? $aResult[self::CI_INHERIT]
|
|
|
|
|
: self::GetClassInfo($sClassName, self::CI_INHERIT, true)
|
|
|
|
|
;
|
|
|
|
|
$aResult[self::CI_INHERITS] = $sInherit
|
|
|
|
|
? self::GetClassInfo(
|
2010-09-15 17:06:52 +03:00
|
|
|
|
$sInherit,
|
2010-08-19 12:02:15 +03:00
|
|
|
|
self::CI_OBJECT,
|
|
|
|
|
false)
|
|
|
|
|
: null
|
|
|
|
|
;
|
|
|
|
|
}
|
|
|
|
|
if($iFlag & self::CI_CLASSPATH){
|
|
|
|
|
$aResult[self::CI_CLASSPATH] = self::GetClassPath($sClassName);
|
2010-05-27 23:40:30 +03:00
|
|
|
|
}
|
2010-08-19 12:02:15 +03:00
|
|
|
|
|
|
|
|
|
return $bSingle ? array_pop($aResult) : $aResult;
|
2010-05-27 23:40:30 +03:00
|
|
|
|
}
|
|
|
|
|
|
2010-06-01 19:20:30 +03:00
|
|
|
|
|
2010-08-19 12:02:15 +03:00
|
|
|
|
public static function GetClassPath($oObject){
|
|
|
|
|
$aInfo = self::GetClassInfo(
|
|
|
|
|
$oObject,
|
|
|
|
|
self::CI_OBJECT
|
|
|
|
|
);
|
|
|
|
|
$sPath = Config::get('path.root.server').'/';
|
|
|
|
|
if($aInfo[self::CI_ENTITY]){
|
|
|
|
|
// Сущность
|
|
|
|
|
if($aInfo[self::CI_PLUGIN]){
|
|
|
|
|
// Сущность модуля плагина
|
|
|
|
|
$sPath .= 'plugins/'.strtolower($aInfo[self::CI_PLUGIN])
|
|
|
|
|
.'/classes/modules/'.strtolower($aInfo[self::CI_MODULE])
|
|
|
|
|
.'/entity/'.$aInfo[self::CI_ENTITY].'.entity.class.php'
|
|
|
|
|
;
|
|
|
|
|
}else{
|
|
|
|
|
// Сущность модуля ядра
|
|
|
|
|
$sPath .= 'classes/modules/'.strtolower($aInfo[self::CI_MODULE])
|
|
|
|
|
.'/entity/'.$aInfo[self::CI_ENTITY].'.entity.class.php'
|
|
|
|
|
;
|
|
|
|
|
}
|
|
|
|
|
}elseif($aInfo[self::CI_MAPPER]){
|
|
|
|
|
// Маппер
|
|
|
|
|
if($aInfo[self::CI_PLUGIN]){
|
|
|
|
|
// Маппер модуля плагина
|
|
|
|
|
$sPath .= 'plugins/'.strtolower($aInfo[self::CI_PLUGIN])
|
|
|
|
|
.'/classes/modules/'.strtolower($aInfo[self::CI_MODULE])
|
|
|
|
|
.'/mapper/'.$aInfo[self::CI_MAPPER].'.mapper.class.php'
|
|
|
|
|
;
|
|
|
|
|
}else{
|
|
|
|
|
// Маппер модуля ядра
|
|
|
|
|
$sPath .= 'classes/modules/'.strtolower($aInfo[self::CI_MODULE])
|
|
|
|
|
.'/mapper/'.$aInfo[self::CI_MAPPER].'.mapper.class.php'
|
|
|
|
|
;
|
|
|
|
|
}
|
|
|
|
|
}elseif($aInfo[self::CI_ACTION]){
|
|
|
|
|
// Экшн
|
|
|
|
|
if($aInfo[self::CI_PLUGIN]){
|
|
|
|
|
// Экшн плагина
|
|
|
|
|
$sPath .= 'plugins/'.strtolower($aInfo[self::CI_PLUGIN])
|
|
|
|
|
.'/classes/actions/Action'.$aInfo[self::CI_ACTION].'.class.php'
|
|
|
|
|
;
|
|
|
|
|
}else{
|
|
|
|
|
// Экшн ядра
|
|
|
|
|
$sPath .= 'classes/actions/Action'
|
|
|
|
|
.$aInfo[self::CI_ACTION].'.class.php'
|
|
|
|
|
;
|
|
|
|
|
}
|
|
|
|
|
}elseif($aInfo[self::CI_MODULE]){
|
|
|
|
|
// Модуль
|
|
|
|
|
if($aInfo[self::CI_PLUGIN]){
|
|
|
|
|
// Модуль плагина
|
|
|
|
|
$sPath .= 'plugins/'.strtolower($aInfo[self::CI_PLUGIN])
|
|
|
|
|
.'/classes/modules/'.strtolower($aInfo[self::CI_MODULE])
|
|
|
|
|
.'/'.$aInfo[self::CI_MODULE].'.class.php';
|
|
|
|
|
;
|
|
|
|
|
}else{
|
|
|
|
|
// Модуль ядра
|
|
|
|
|
$sPath .= 'classes/modules/'.strtolower($aInfo[self::CI_MODULE])
|
|
|
|
|
.'/'.$aInfo[self::CI_MODULE].'.class.php'
|
|
|
|
|
;
|
|
|
|
|
if(!is_file($sPath)){
|
|
|
|
|
$sPath = str_replace('/classes/modules/','/engine/modules/',$sPath);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}elseif($aInfo[self::CI_HOOK]){
|
|
|
|
|
// Хук
|
|
|
|
|
if($aInfo[self::CI_PLUGIN]){
|
|
|
|
|
// Хук плагина
|
|
|
|
|
$sPath .= 'plugins/'.strtolower($aInfo[self::CI_PLUGIN])
|
|
|
|
|
.'/classes/hooks/Hook'.$aInfo[self::CI_HOOK]
|
|
|
|
|
.'.class.php';
|
|
|
|
|
;
|
|
|
|
|
}else{
|
|
|
|
|
// Хук ядра
|
|
|
|
|
$sPath .= 'classes/hooks/Hook'.$aInfo[self::CI_HOOK].'.class.php';
|
|
|
|
|
}
|
2011-07-05 16:33:59 +03:00
|
|
|
|
}elseif($aInfo[self::CI_BLOCK]){
|
|
|
|
|
// Блок
|
|
|
|
|
if($aInfo[self::CI_PLUGIN]){
|
|
|
|
|
// Блок плагина
|
|
|
|
|
$sPath .= 'plugins/'.strtolower($aInfo[self::CI_PLUGIN])
|
|
|
|
|
.'/classes/blocks/Block'.$aInfo[self::CI_BLOCK]
|
|
|
|
|
.'.class.php';
|
|
|
|
|
;
|
|
|
|
|
}else{
|
|
|
|
|
// Блок ядра
|
|
|
|
|
$sPath .= 'classes/blocks/Block'.$aInfo[self::CI_BLOCK].'.class.php';
|
|
|
|
|
}
|
2010-08-19 12:02:15 +03:00
|
|
|
|
}elseif($aInfo[self::CI_PLUGIN]){
|
|
|
|
|
// Плагин
|
|
|
|
|
$sPath .= 'plugins/'.strtolower($aInfo[self::CI_PLUGIN])
|
|
|
|
|
.'/Plugin'.$aInfo[self::CI_PLUGIN]
|
|
|
|
|
.'.class.php';
|
|
|
|
|
;
|
|
|
|
|
}else{
|
|
|
|
|
$sClassName = is_string($oObject) ? $oObject : get_class($oObject);
|
|
|
|
|
$sPath .= 'engine/classes/'.$sClassName.'.class.php';
|
|
|
|
|
}
|
|
|
|
|
return is_file($sPath) ? $sPath : null;
|
2010-05-27 23:40:30 +03:00
|
|
|
|
}
|
2010-05-28 18:20:55 +03:00
|
|
|
|
|
|
|
|
|
|
2011-04-27 13:47:28 +03:00
|
|
|
|
/**
|
|
|
|
|
* Автозагрузка классов
|
|
|
|
|
*
|
|
|
|
|
* @param unknown_type $sClassName
|
|
|
|
|
*/
|
|
|
|
|
public static function autoload($sClassName) {
|
|
|
|
|
$aInfo = Engine::GetClassInfo(
|
|
|
|
|
$sClassName,
|
|
|
|
|
Engine::CI_CLASSPATH|Engine::CI_INHERIT
|
|
|
|
|
);
|
|
|
|
|
if($aInfo[Engine::CI_INHERIT]){
|
|
|
|
|
$sInheritClass = $aInfo[Engine::CI_INHERIT];
|
|
|
|
|
$sParentClass = Engine::getInstance()->Plugin_GetParentInherit($sInheritClass);
|
|
|
|
|
class_alias($sParentClass,$sClassName);
|
|
|
|
|
}elseif($aInfo[Engine::CI_CLASSPATH]){
|
|
|
|
|
require_once $aInfo[Engine::CI_CLASSPATH];
|
|
|
|
|
}elseif(!class_exists($sClassName)){
|
|
|
|
|
dump("(autoload $sClassName) Can not load CLASS-file");
|
|
|
|
|
dump($aInfo);
|
|
|
|
|
//throw new Exception("(autoload '$sClassName') Can not load CLASS-file");
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
2010-08-19 12:02:15 +03:00
|
|
|
|
}
|
|
|
|
|
|
2011-04-27 13:47:28 +03:00
|
|
|
|
spl_autoload_register(array('Engine','autoload'));
|
|
|
|
|
|
2010-11-13 07:44:45 +02:00
|
|
|
|
/**
|
|
|
|
|
* Short aliases for Engine basic methods
|
|
|
|
|
*
|
|
|
|
|
*/
|
|
|
|
|
class LS {
|
|
|
|
|
|
|
|
|
|
static protected $oInstance=null;
|
|
|
|
|
|
|
|
|
|
static public function getInstance() {
|
|
|
|
|
if (isset(self::$oInstance) and (self::$oInstance instanceof self)) {
|
|
|
|
|
return self::$oInstance;
|
|
|
|
|
} else {
|
|
|
|
|
self::$oInstance = new self();
|
|
|
|
|
return self::$oInstance;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public function E() {
|
|
|
|
|
return Engine::GetInstance();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public function Ent($sName,$aParams=array()) {
|
|
|
|
|
return Engine::GetEntity($sName,$aParams);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public function Mpr($sClassName,$sName=null,$oConnect=null) {
|
|
|
|
|
return Engine::GetMapper($sClassName,$sName,$oConnect);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public function CurUsr() {
|
|
|
|
|
return self::E()->User_GetUserCurrent();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
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();
|
|
|
|
|
*
|
|
|
|
|
*/
|
|
|
|
|
public function __call($sName,$aArgs=array()) {
|
2011-03-25 16:45:09 +02:00
|
|
|
|
return call_user_func_array(array(self::E(),$sName),$aArgs);
|
2010-11-13 07:44:45 +02:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* With PHP 5.3+ we can use LS::Module_Method() instead of LS::E()->Module_Method();
|
|
|
|
|
*
|
|
|
|
|
*/
|
|
|
|
|
public static function __callStatic($sName,$aArgs=array()) {
|
2011-03-25 16:45:09 +02:00
|
|
|
|
return call_user_func_array(array(self::E(),$sName),$aArgs);
|
2010-11-13 07:44:45 +02:00
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
2008-09-21 09:36:57 +03:00
|
|
|
|
?>
|