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");
|
|
|
|
|
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");
|
|
|
|
|
|
2008-09-21 09:36:57 +03:00
|
|
|
|
/**
|
|
|
|
|
* Основной класс движка, который позволяет напрямую обращаться к любому модулю
|
|
|
|
|
*
|
|
|
|
|
*/
|
|
|
|
|
class Engine extends Object {
|
|
|
|
|
|
|
|
|
|
static protected $oInstance=null;
|
|
|
|
|
|
|
|
|
|
protected $aModules=array();
|
|
|
|
|
protected $aConfigModule;
|
|
|
|
|
public $iTimeLoadModule=0;
|
|
|
|
|
|
2009-09-07 00:14:16 +03:00
|
|
|
|
/**
|
|
|
|
|
* Массив содержит меппер кастомизации сущностей
|
|
|
|
|
*
|
|
|
|
|
* @var arrat
|
|
|
|
|
*/
|
|
|
|
|
static protected $aEntityCustoms=array();
|
2008-09-21 09:36:57 +03:00
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* При создании объекта делаем инициализацию
|
|
|
|
|
*
|
|
|
|
|
*/
|
|
|
|
|
protected function __construct() {
|
2009-07-26 16:43:16 +03:00
|
|
|
|
if (get_magic_quotes_gpc()) {
|
|
|
|
|
func_stripslashes($_REQUEST);
|
|
|
|
|
}
|
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-11-22 21:38:44 +02:00
|
|
|
|
/**
|
|
|
|
|
* Инициализируем хуки
|
|
|
|
|
*/
|
|
|
|
|
$this->InitHooks();
|
|
|
|
|
/**
|
|
|
|
|
* Загружаем модули автозагрузки
|
|
|
|
|
*/
|
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();
|
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) {
|
2009-12-22 23:48:46 +02:00
|
|
|
|
/**
|
|
|
|
|
* Замеряем время инициализации модуля
|
|
|
|
|
*/
|
|
|
|
|
$oProfiler=ProfilerSimple::getInstance();
|
|
|
|
|
$iTimeId=$oProfiler->Start('InitModule',get_class($oModule));
|
|
|
|
|
|
2008-09-21 09:36:57 +03:00
|
|
|
|
$oModule->Init();
|
2009-12-22 23:48:46 +02:00
|
|
|
|
|
|
|
|
|
$oProfiler->Stop($iTimeId);
|
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
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
/**
|
|
|
|
|
* Выполняет загрузку модуля по его названию
|
|
|
|
|
*
|
|
|
|
|
* @param string $sModuleName
|
|
|
|
|
* @param bool $bInit - инициализировать модуль или нет
|
|
|
|
|
* @return unknown
|
|
|
|
|
*/
|
|
|
|
|
protected function LoadModule($sModuleName,$bInit=false) {
|
2009-11-22 20:59:19 +02:00
|
|
|
|
$tm1=microtime(true);
|
2009-08-19 15:50:45 +03:00
|
|
|
|
if ($this->isFileExists(Config::Get('path.root.engine')."/modules/".strtolower($sModuleName)."/".$sModuleName.".class.php")) {
|
|
|
|
|
require_once(Config::Get('path.root.engine')."/modules/".strtolower($sModuleName)."/".$sModuleName.".class.php");
|
|
|
|
|
} elseif ($this->isFileExists(Config::Get('path.root.server')."/classes/modules/".strtolower($sModuleName)."/".$sModuleName.".class.php")) {
|
|
|
|
|
require_once(Config::Get('path.root.server')."/classes/modules/".strtolower($sModuleName)."/".$sModuleName.".class.php");
|
2008-09-21 09:36:57 +03:00
|
|
|
|
} else {
|
2009-11-22 16:49:34 +02:00
|
|
|
|
throw new Exception("Can not find module class - ".$sModuleName);
|
2009-08-18 12:10:14 +03:00
|
|
|
|
}
|
2009-06-29 21:44:26 +03:00
|
|
|
|
/**
|
2009-08-18 12:10:14 +03:00
|
|
|
|
* Проверяем наличие кастомного класса. Также можно переопределить системный модуль
|
2009-06-29 21:44:26 +03:00
|
|
|
|
*/
|
|
|
|
|
$sPrefixCustom='';
|
2009-08-19 15:50:45 +03:00
|
|
|
|
if ($this->isFileExists(Config::Get('path.root.server')."/classes/modules/".strtolower($sModuleName)."/".$sModuleName.".class.custom.php")) {
|
|
|
|
|
require_once(Config::Get('path.root.server')."/classes/modules/".strtolower($sModuleName)."/".$sModuleName.".class.custom.php");
|
2009-06-29 21:44:26 +03:00
|
|
|
|
$sPrefixCustom='_custom';
|
|
|
|
|
}
|
|
|
|
|
/**
|
|
|
|
|
* Создаем объект модуля
|
|
|
|
|
*/
|
|
|
|
|
$sModuleNameClass='Ls'.$sModuleName.$sPrefixCustom;
|
2009-03-21 15:48:00 +02:00
|
|
|
|
$oModule=new $sModuleNameClass($this);
|
2009-07-02 22:21:11 +03:00
|
|
|
|
if ($bInit or $sModuleName=='Cache') {
|
2008-09-21 09:36:57 +03:00
|
|
|
|
$oModule->Init();
|
|
|
|
|
}
|
|
|
|
|
$this->aModules[$sModuleName]=$oModule;
|
|
|
|
|
$tm2=microtime(true);
|
|
|
|
|
$this->iTimeLoadModule+=$tm2-$tm1;
|
|
|
|
|
dump("load $sModuleName - \t\t".($tm2-$tm1)."");
|
|
|
|
|
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) {
|
|
|
|
|
$this->LoadModule($sModuleName);
|
|
|
|
|
}
|
|
|
|
|
}
|
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-05-09 20:04:04 +03:00
|
|
|
|
if ($hDir = opendir($sDirHooks)) {
|
|
|
|
|
while (false !== ($sFile = readdir($hDir))) {
|
|
|
|
|
if ($sFile !='.' and $sFile !='..' and is_file($sDirHooks.$sFile)) {
|
|
|
|
|
if (preg_match("/^Hook([\w]+)\.class\.php$/i",$sFile,$aMatch)) {
|
|
|
|
|
require_once($sDirHooks.$sFile);
|
|
|
|
|
$sClassName='Hook'.$aMatch[1];
|
|
|
|
|
$oHook=new $sClassName;
|
|
|
|
|
$oHook->RegisterHook();
|
2009-11-22 20:59:19 +02:00
|
|
|
|
}
|
2009-05-09 20:04:04 +03:00
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
closedir($hDir);
|
|
|
|
|
}
|
|
|
|
|
}
|
2009-07-02 22:21:11 +03:00
|
|
|
|
/**
|
|
|
|
|
* Проверяет файл на существование, если используется кеширование memcache то кеширует результат работы
|
|
|
|
|
*
|
|
|
|
|
* @param unknown_type $sFile
|
|
|
|
|
* @return unknown
|
|
|
|
|
*/
|
2009-07-26 16:43:16 +03:00
|
|
|
|
public function isFileExists($sFile,$iTime=3600) { return file_exists($sFile);
|
2009-07-02 22:21:11 +03:00
|
|
|
|
if (strpos($sFile,'/Cache.class.')!==false) {
|
|
|
|
|
return file_exists($sFile);
|
|
|
|
|
}
|
|
|
|
|
if (SYS_CACHE_USE and SYS_CACHE_TYPE==SYS_CACHE_TYPE_MEMORY) {
|
|
|
|
|
if (false === ($data = $this->Cache_Get("file_exists_{$sFile}"))) {
|
|
|
|
|
$data=file_exists($sFile);
|
|
|
|
|
$this->Cache_Set((int)$data, "file_exists_{$sFile}", array(), $iTime);
|
|
|
|
|
}
|
|
|
|
|
return $data;
|
|
|
|
|
} else {
|
|
|
|
|
return file_exists($sFile);
|
|
|
|
|
}
|
|
|
|
|
}
|
2008-09-21 09:36:57 +03:00
|
|
|
|
/**
|
|
|
|
|
* Вызывает метод нужного модуля
|
|
|
|
|
*
|
|
|
|
|
* @param string $sName
|
|
|
|
|
* @param array $aArgs
|
|
|
|
|
* @return unknown
|
|
|
|
|
*/
|
|
|
|
|
public function _CallModule($sName,$aArgs) {
|
|
|
|
|
$sArgs='';
|
|
|
|
|
$aStrArgs=array();
|
|
|
|
|
foreach ($aArgs as $sKey => $arg) {
|
|
|
|
|
$aStrArgs[]='$aArgs['.$sKey.']';
|
|
|
|
|
}
|
|
|
|
|
$sArgs=join(',',$aStrArgs);
|
|
|
|
|
|
|
|
|
|
$aName=explode("_",$sName);
|
|
|
|
|
|
|
|
|
|
$sModuleName=$aName[0];
|
|
|
|
|
if (isset($this->aModules[$sModuleName])) {
|
|
|
|
|
$oModule=$this->aModules[$sModuleName];
|
|
|
|
|
} else {
|
|
|
|
|
$oModule=$this->LoadModule($sModuleName,true);
|
2009-07-26 16:43:16 +03:00
|
|
|
|
}
|
|
|
|
|
if (!method_exists($oModule,$aName[1])) {
|
2009-11-22 16:49:34 +02:00
|
|
|
|
throw new Exception("The module has no required method: ".$sModuleName.'->'.$aName[1].'()');
|
2009-07-26 16:43:16 +03:00
|
|
|
|
}
|
|
|
|
|
$sCmd='$result=$oModule->'.$aName[1].'('.$sArgs.');';
|
|
|
|
|
$oProfiler=ProfilerSimple::getInstance();
|
2009-11-22 20:59:19 +02:00
|
|
|
|
$iTimeId=$oProfiler->Start('callModule',$sModuleName.'->'.$aName[1].'()');
|
2008-09-21 09:36:57 +03:00
|
|
|
|
eval($sCmd);
|
2009-07-26 16:43:16 +03:00
|
|
|
|
$oProfiler->Stop($iTimeId);
|
|
|
|
|
return $result;
|
2008-09-21 09:36:57 +03:00
|
|
|
|
}
|
|
|
|
|
|
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)));
|
|
|
|
|
}
|
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);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* Блокируем копирование/клонирование объекта роутинга
|
|
|
|
|
*
|
|
|
|
|
*/
|
|
|
|
|
protected function __clone() {
|
|
|
|
|
|
|
|
|
|
}
|
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
|
|
|
|
|
*/
|
|
|
|
|
if(substr_count($sName,'_')==0) {
|
|
|
|
|
$sEntity = $sModule = $sName;
|
|
|
|
|
} else {
|
|
|
|
|
list($sModule,$sEntity) = explode('_',$sName,2);
|
|
|
|
|
}
|
|
|
|
|
/**
|
|
|
|
|
* Проверяем наличие сущности в меппере кастомизации
|
|
|
|
|
*/
|
|
|
|
|
if(array_key_exists($sName,self::$aEntityCustoms)) {
|
2009-09-07 16:35:18 +03:00
|
|
|
|
$sEntity = (self::$aEntityCustoms[$sName]=='custom')
|
|
|
|
|
? $sEntity.'_custom'
|
|
|
|
|
: $sEntity;
|
|
|
|
|
//$sFileClass=Config::get('path.root.server').'/classes/modules/'.strtolower($sModule).'/entity/'.$sEntity.'.entity.class.'.((self::$aEntityCustoms[$sName]=='custom')?'custom.':'').'php';
|
2009-09-07 00:14:16 +03:00
|
|
|
|
} else {
|
|
|
|
|
$sFileDefaultClass=Config::get('path.root.server').'/classes/modules/'.strtolower($sModule).'/entity/'.$sEntity.'.entity.class.php';
|
2009-09-07 16:35:18 +03:00
|
|
|
|
$sFileCustomClass = Config::get('path.root.server').'/classes/modules/'.strtolower($sModule).'/entity/'.$sEntity.'.entity.class.custom.php';
|
2009-09-07 00:14:16 +03:00
|
|
|
|
/**
|
2009-09-07 16:35:18 +03:00
|
|
|
|
* Пытаемся найти кастомизированную сущность
|
2009-09-07 00:14:16 +03:00
|
|
|
|
*/
|
|
|
|
|
if(file_exists($sFileCustomClass)) {
|
|
|
|
|
$sFileClass=$sFileCustomClass;
|
2009-09-07 16:35:18 +03:00
|
|
|
|
$sEntity.='_custom';
|
|
|
|
|
self::$aEntityCustoms[$sName]='custom';
|
2009-09-07 00:14:16 +03:00
|
|
|
|
} elseif(file_exists($sFileDefaultClass)) {
|
|
|
|
|
$sFileClass=$sFileDefaultClass;
|
2009-09-07 16:35:18 +03:00
|
|
|
|
self::$aEntityCustoms[$sName]='default';
|
2009-09-07 00:14:16 +03:00
|
|
|
|
} else {
|
|
|
|
|
throw new Exception('Entity class not found');
|
|
|
|
|
return null;
|
|
|
|
|
}
|
2009-09-07 16:35:18 +03:00
|
|
|
|
/**
|
|
|
|
|
* Подгружаем нужный файл
|
|
|
|
|
*/
|
|
|
|
|
require_once($sFileClass);
|
2009-09-07 00:14:16 +03:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
$sClass=$sModule.'Entity_'.$sEntity;
|
|
|
|
|
$oEntity=new $sClass($aParams);
|
|
|
|
|
return $oEntity;
|
|
|
|
|
}
|
2008-09-21 09:36:57 +03:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* Автозагрузка кслассов
|
|
|
|
|
*
|
|
|
|
|
* @param unknown_type $sClassName
|
|
|
|
|
*/
|
|
|
|
|
function __autoload($sClassName) {
|
|
|
|
|
/**
|
2009-11-21 16:19:22 +02:00
|
|
|
|
* Если класс подходит под шблон класса сущности то загружаем его
|
2008-09-21 09:36:57 +03:00
|
|
|
|
*/
|
2009-11-21 16:19:22 +02:00
|
|
|
|
if (preg_match("/^(\w+)Entity\_(\w+)$/i",$sClassName,$aMatch)) {
|
2008-09-21 09:36:57 +03:00
|
|
|
|
$tm1=microtime(true);
|
2009-11-21 16:19:22 +02:00
|
|
|
|
|
|
|
|
|
$sFileClass= (substr($aMatch[2],-7)=='_custom')
|
|
|
|
|
? Config::get('path.root.server').'/classes/modules/'.strtolower($aMatch[1]).'/entity/'.substr($aMatch[2],0,strlen($aMatch[2])-7).'.entity.class.custom.php'
|
|
|
|
|
: Config::get('path.root.server').'/classes/modules/'.strtolower($aMatch[1]).'/entity/'.$aMatch[2].'.entity.class.php';
|
|
|
|
|
|
2008-09-21 09:36:57 +03:00
|
|
|
|
if (file_exists($sFileClass)) {
|
|
|
|
|
require_once($sFileClass);
|
|
|
|
|
$tm2=microtime(true);
|
|
|
|
|
dump($sClassName." - \t\t".($tm2-$tm1));
|
|
|
|
|
}
|
|
|
|
|
}
|
2009-11-23 21:22:59 +02:00
|
|
|
|
/**
|
|
|
|
|
* Если класс подходит под шаблон модуля, то загружаем его
|
|
|
|
|
*/
|
|
|
|
|
if(preg_match("/^Ls(\w+)$/i",$sClassName,$aMatch)) {
|
|
|
|
|
$sName = ucfirst(strtolower($aMatch[1]));
|
|
|
|
|
$sFileClass= (substr($sName,-7)=='_custom')
|
2009-11-25 16:10:54 +02:00
|
|
|
|
? Config::get('path.root.server').'/classes/modules/'.strtolower($sName).'/'.substr($sName,0,strlen($sName)-7).'.class.custom.php'
|
|
|
|
|
: Config::get('path.root.server').'/classes/modules/'.strtolower($sName).'/'.$sName.'.class.php';
|
2009-11-23 21:22:59 +02:00
|
|
|
|
|
|
|
|
|
if (file_exists($sFileClass)) {
|
|
|
|
|
require_once($sFileClass);
|
|
|
|
|
} else {
|
|
|
|
|
$sFileClass = str_replace('/classes/modules/','/engine/modules/',$sFileClass);
|
|
|
|
|
if(file_exists($sFileClass)) require_once($sFileClass);
|
|
|
|
|
}
|
|
|
|
|
}
|
2008-09-21 09:36:57 +03:00
|
|
|
|
}
|
|
|
|
|
?>
|