1
0
Fork 0
mirror of https://github.com/Oreolek/ifhub.club.git synced 2024-06-26 03:30:48 +03:00

Документация классов

This commit is contained in:
Mzhelskiy Maxim 2012-04-27 14:23:02 +04:00
parent 47f17cd5f3
commit 8f84688a07
13 changed files with 525 additions and 455 deletions

View file

@ -99,11 +99,11 @@ class ModuleCache extends Module {
* @var array
*/
protected $aStats=array(
'time' =>0,
'count' => 0,
'count_get' => 0,
'count_set' => 0,
);
'time' =>0,
'count' => 0,
'count_get' => 0,
'count_set' => 0,
);
/**
* Хранилище для кеша на время сессии
* @see SetLife
@ -128,7 +128,7 @@ class ModuleCache extends Module {
public function Init() {
$this->bUseCache=Config::Get('sys.cache.use');
$this->sCacheType=Config::Get('sys.cache.type');
if (!$this->bUseCache) {
return false;
}
@ -142,28 +142,28 @@ class ModuleCache extends Module {
'cache_dir' => Config::Get('sys.cache.dir'),
'file_name_prefix' => Config::Get('sys.cache.prefix'),
'read_control_type' => 'crc32',
'hashed_directory_level' => Config::Get('sys.cache.directory_level'),
'hashed_directory_level' => Config::Get('sys.cache.directory_level'),
'read_control' => true,
'file_locking' => true,
)
);
$this->oBackendCache = new Dklab_Cache_Backend_Profiler($oCahe,array($this,'CalcStats'));
/**
* Кеш на основе Memcached
*/
/**
* Кеш на основе Memcached
*/
} elseif ($this->sCacheType==SYS_CACHE_TYPE_MEMORY) {
require_once(LS_DKCACHE_PATH.'Zend/Cache/Backend/Memcached.php');
$aConfigMem=Config::Get('memcache');
$oCahe = new Dklab_Cache_Backend_MemcachedMultiload($aConfigMem);
$this->oBackendCache = new Dklab_Cache_Backend_TagEmuWrapper(new Dklab_Cache_Backend_Profiler($oCahe,array($this,'CalcStats')));
/**
* Кеш на основе XCache
*/
/**
* Кеш на основе XCache
*/
} elseif ($this->sCacheType==SYS_CACHE_TYPE_XCACHE) {
require_once(LS_DKCACHE_PATH.'Zend/Cache/Backend/Xcache.php');
$aConfigMem=Config::Get('xcache');
$oCahe = new Zend_Cache_Backend_Xcache(is_array($aConfigMem) ? $aConfigMem : array());
$this->oBackendCache = new Dklab_Cache_Backend_TagEmuWrapper(new Dklab_Cache_Backend_Profiler($oCahe,array($this,'CalcStats')));
} else {
@ -172,8 +172,8 @@ class ModuleCache extends Module {
/**
* Дабы не засорять место протухшим кешем, удаляем его в случайном порядке, например 1 из 50 раз
*/
if (rand(1,50)==33) {
$this->Clean(Zend_Cache::CLEANING_MODE_OLD);
if (rand(1,50)==33) {
$this->Clean(Zend_Cache::CLEANING_MODE_OLD);
}
}
/**
@ -242,7 +242,7 @@ class ModuleCache extends Module {
if ($data and is_array($data)) {
$aData=array();
foreach ($data as $key => $value) {
$aData[$aKv[$key]]=$value;
$aData[$aKv[$key]]=$value;
}
if (count($aData)>0) {
return $aData;
@ -271,7 +271,7 @@ class ModuleCache extends Module {
* @param int $iTimeLife Время жизни кеша в секундах
* @return bool
*/
public function Set($data,$sName,$aTags=array(),$iTimeLife=false) {
public function Set($data,$sName,$aTags=array(),$iTimeLife=false) {
if (!$this->bUseCache) {
return false;
}
@ -279,7 +279,7 @@ class ModuleCache extends Module {
* Т.к. название кеша может быть любым то предварительно хешируем имя кеша
*/
$sName=md5(Config::Get('sys.cache.prefix').$sName);
if ($this->sCacheType==SYS_CACHE_TYPE_FILE) {
if ($this->sCacheType==SYS_CACHE_TYPE_FILE) {
$data=serialize($data);
}
return $this->oBackendCache->save($data,$sName,$aTags,$iTimeLife);
@ -335,13 +335,13 @@ class ModuleCache extends Module {
*/
public function CalcStats($iTime,$sMethod) {
$this->aStats['time']+=$iTime;
$this->aStats['count']++;
$this->aStats['count']++;
if ($sMethod=='Dklab_Cache_Backend_Profiler::load') {
$this->aStats['count_get']++;
}
if ($sMethod=='Dklab_Cache_Backend_Profiler::save') {
$this->aStats['count_set']++;
}
}
}
/**
* Возвращает статистику использования кеша
@ -360,7 +360,7 @@ class ModuleCache extends Module {
public function SetLife($data,$sName) {
$this->aStoreLife[$sName]=$data;
}
/**
* Получает значение из текущего кеша сессии
*

View file

@ -34,13 +34,13 @@ class ModuleDatabase extends Module {
* @var array
*/
protected $aInstance=array();
/**
* Инициализация модуля
*
*/
public function Init() {
public function Init() {
}
/**
* Получает объект БД
@ -55,7 +55,7 @@ class ModuleDatabase extends Module {
if (is_null($aConfig)) {
$aConfig = Config::Get('db.params');
}
$sDSN=$aConfig['type'].'wrapper://'.$aConfig['user'].':'.$aConfig['pass'].'@'.$aConfig['host'].':'.$aConfig['port'].'/'.$aConfig['dbname'];
$sDSN=$aConfig['type'].'wrapper://'.$aConfig['user'].':'.$aConfig['pass'].'@'.$aConfig['host'].':'.$aConfig['port'].'/'.$aConfig['dbname'];
/**
* Создаём хеш подключения, уникальный для каждого конфига
*/
@ -69,7 +69,7 @@ class ModuleDatabase extends Module {
/**
* Если такого коннекта еще не было то создаём его
*/
$oDbSimple=DbSimple_Generic::connect($sDSN);
$oDbSimple=DbSimple_Generic::connect($sDSN);
/**
* Устанавливаем хук на перехват ошибок при работе с БД
*/
@ -80,20 +80,20 @@ class ModuleDatabase extends Module {
if (Config::Get('sys.logs.sql_query')) {
$oDbSimple->setLogger('databaseLogger');
}
/**
* Устанавливаем настройки соединения, по хорошему этого здесь не должно быть :)
* считайте это костылём
*/
$oDbSimple->query("set character_set_client='utf8', character_set_results='utf8', collation_connection='utf8_bin' ");
/**
* Сохраняем коннект
*/
$this->aInstance[$sDSNKey]=$oDbSimple;
/**
* Устанавливаем настройки соединения, по хорошему этого здесь не должно быть :)
* считайте это костылём
*/
$oDbSimple->query("set character_set_client='utf8', character_set_results='utf8', collation_connection='utf8_bin' ");
/**
* Сохраняем коннект
*/
$this->aInstance[$sDSNKey]=$oDbSimple;
/**
* Возвращаем коннект
*/
return $oDbSimple;
}
}
}
/**
* Возвращает статистику использования БД - время и количество запросов
@ -127,7 +127,7 @@ class ModuleDatabase extends Module {
$sFileQuery = file_get_contents($sFilePath);
return $this->ExportSQLQuery($sFileQuery,$aConfig);
}
/**
* Экспорт SQL в БД
*
@ -155,14 +155,14 @@ class ModuleDatabase extends Module {
* Заменяем движек, если таковой указан в запросе
*/
if(Config::Get('db.tables.engine')!='InnoDB') $sQuery=str_ireplace('ENGINE=InnoDB', "ENGINE=".Config::Get('db.tables.engine'),$sQuery);
if($sQuery!='') {
$bResult=$this->GetConnect($aConfig)->query($sQuery);
if($bResult===false) $aErrors[] = mysql_error();
}
}
/**
* Возвращаем результат выполнения, взависимости от количества ошибок
* Возвращаем результат выполнения, взависимости от количества ошибок
*/
if(count($aErrors)==0) {
return array('result'=>true,'errors'=>null);
@ -213,9 +213,9 @@ class ModuleDatabase extends Module {
* @param array|null $aConfig Конфиг подключения к БД
*/
public function addEnumType($sTableName,$sFieldName,$sType,$aConfig=null) {
$sTableName = str_replace('prefix_', Config::Get('db.table.prefix'), $sTableName);
$sTableName = str_replace('prefix_', Config::Get('db.table.prefix'), $sTableName);
$sQuery="SHOW COLUMNS FROM `{$sTableName}`";
if ($aRows=$this->GetConnect($aConfig)->select($sQuery)) {
foreach ($aRows as $aRow){
if ($aRow['Field'] == $sFieldName) break;
@ -229,7 +229,7 @@ class ModuleDatabase extends Module {
}
}
}
}
/**
@ -238,11 +238,11 @@ class ModuleDatabase extends Module {
* @param string $message Сообщение об ошибке
* @param array $info Список информации об ошибке
*/
function databaseErrorHandler($message, $info) {
function databaseErrorHandler($message, $info) {
/**
* Записываем информацию об ошибке в переменную $msg
*/
$msg="SQL Error: $message<br>\n";
*/
$msg="SQL Error: $message<br>\n";
$msg.=print_r($info,true);
/**
* Если нужно логировать SQL ошибке то пишем их в лог
@ -278,8 +278,8 @@ function databaseLogger($db, $sql) {
/**
* Получаем информацию о запросе и сохраняем её в переменной $msg
*/
$caller = $db->findLibraryCaller();
$msg=print_r($sql,true);
$caller = $db->findLibraryCaller();
$msg=print_r($sql,true);
/**
* Получаем ядро и сохраняем в логе SQL запрос
*/

View file

@ -72,7 +72,7 @@
* @package engine.modules
* @since 1.0
*/
class ModuleHook extends Module {
class ModuleHook extends Module {
/**
* Содержит список хуков
*
@ -98,8 +98,8 @@ class ModuleHook extends Module {
* Инициализация модуля
*
*/
public function Init() {
public function Init() {
}
/**
* Добавление обработчика на хук
@ -223,13 +223,13 @@ class ModuleHook extends Module {
/**
* Все хуки делим на обычные(exec) и делигирующие(delegate)
*/
for ($i=0;$i<count($this->aHooks[$sName]);$i++) {
for ($i=0;$i<count($this->aHooks[$sName]);$i++) {
if (isset($this->aHooks[$sName][$i]['params']['delegate']) and $this->aHooks[$sName][$i]['params']['delegate']) {
$aHookNumDelegate[$i]=$this->aHooks[$sName][$i]['priority'];
} else {
$aHookNum[$i]=$this->aHooks[$sName][$i]['priority'];
}
}
}
}
arsort($aHookNum,SORT_NUMERIC);
arsort($aHookNumDelegate,SORT_NUMERIC);
/**
@ -239,7 +239,7 @@ class ModuleHook extends Module {
$aHook=$this->aHooks[$sName][$iKey];
if ($bTemplateHook) {
/**
* Если это шаблонных хук то сохраняем результат
* Если это шаблонных хук то сохраняем результат
*/
$result['template_result'][]=$this->RunType($aHook,$aVars);
} else {
@ -249,10 +249,10 @@ class ModuleHook extends Module {
/**
* Теперь запускаем делигирующие
* Делегирующий хук должен вернуть результат в формате:
*
*
*/
foreach ($aHookNumDelegate as $iKey => $iPr) {
$aHook=$this->aHooks[$sName][$iKey];
$aHook=$this->aHooks[$sName][$iKey];
$result=array(
'delegate_result'=>$this->RunType($aHook,$aVars)
);

View file

@ -21,6 +21,8 @@ require_once Config::Get('path.root.engine').'/lib/external/LiveImage/Image.php'
* Модуль обработки изображений
* Использует библиотеку LiveImage
*
* @package engine.modules
* @since 1.0
*/
class ModuleImage extends Module {
/**
@ -39,25 +41,24 @@ class ModuleImage extends Module {
* Ошибка чтения файла при загрузке изображения
*/
const UPLOAD_IMAGE_ERROR_READ = 8;
/**
* Настройки модуля по умолчанию
*
* @var array
*/
protected $aParamsDefault = array();
/**
* Тескт последней ошибки
*
* @var unknown_type
* @var string
*/
protected $sLastErrorText = null;
/**
* Инициализация модуля
*/
public function Init() {
public function Init() {
$this->aParamsDefault = array(
'watermark_use'=>false,
'round_corner' =>false
@ -66,7 +67,7 @@ class ModuleImage extends Module {
/**
* Получает текст последней ошибки
*
* @return unknown
* @return string
*/
public function GetLastError() {
return $this->sLastErrorText;
@ -74,7 +75,7 @@ class ModuleImage extends Module {
/**
* Устанавливает текст последней ошибки
*
* @param unknown_type $sText
* @param string $sText Текст ошибки
*/
public function SetLastError($sText) {
$this->sLastErrorText=$sText;
@ -87,36 +88,36 @@ class ModuleImage extends Module {
$this->sLastErrorText=null;
}
/**
* Merge default and named params for images
* Возврашает параметры для группы, если каких то параметров в группе нет, то используются дефолтные
*
* @param string $sName
* @param string $sName Имя группы
* @return array
*/
public function BuildParams($sName=null) {
if(is_null($sName)) {
return Config::Get('module.image.default');
}
$aDefault = (array)Config::Get('module.image.default');
$aNamed = (array)Config::Get('module.image.'.strtolower($sName));
return func_array_merge_assoc($aDefault,$aNamed);
}
/**
* Resize,copy image,
* Resize,copy image,
* make rounded corners and add watermark
*
* @param string $sFileSrc
* @param string $sDirDest
* @param string $sFileDest
* @param int $iWidthMax
* @param int $iHeightMax
* @param int $iWidthDest
* @param int $iHeightDest
* @param bool $bForcedMinSize
* @param array $aParams
* @param object $oImage
* @return string
* @param string $sFileSrc Исходный файл изображения
* @param string $sDirDest Директория куда нужно сохранить изображение относительно корня сайта (path.root.server)
* @param string $sFileDest Имя файла для сохранения, без расширения
* @param int $iWidthMax Максимально допустимая ширина изображения
* @param int $iHeightMax Максимало допустимая высота изображения
* @param int|null $iWidthDest Ширина необходимого изображения на выходе
* @param int|null $iHeightDest Высота необходимого изображения на выходе
* @param bool $bForcedMinSize Растягивать изображение по ширине или нет, если исходное меньше. При false - изображение будет растянуто
* @param array|null $aParams Параметры
* @param LiveImage|null $oImage Объект изображения, если null то будет содано автоматически
* @return string|bool Полный серверный путь до сохраненного изображения
*/
public function Resize($sFileSrc,$sDirDest,$sFileDest,$iWidthMax,$iHeightMax,$iWidthDest=null,$iHeightDest=null,$bForcedMinSize=true,$aParams=null,$oImage=null) {
$this->ClearLastError();
@ -127,22 +128,22 @@ class ModuleImage extends Module {
$aParams=$this->aParamsDefault;
}
/**
* Если объект не передан как параметр,
* Если объект не передан как параметр,
* создаем новый
*/
if(!$oImage) $oImage=new LiveImage($sFileSrc);
if($oImage->get_last_error()){
$this->SetLastError($oImage->get_last_error());
return false;
}
$sFileDest.='.'.$oImage->get_image_params('format');
if (($oImage->get_image_params('width')>$iWidthMax)
if (($oImage->get_image_params('width')>$iWidthMax)
or ($oImage->get_image_params('height')>$iHeightMax)) {
return false;
return false;
}
if ($iWidthDest) {
if ($bForcedMinSize and ($iWidthDest>$oImage->get_image_params('width'))) {
$iWidthDest=$oImage->get_image_params('width');
@ -153,7 +154,7 @@ class ModuleImage extends Module {
* Если нужно добавить Watermark, то запрещаем ручное управление alfa-каналом
*/
$oImage->resize($iWidthDest,$iHeightDest,(!$iHeightDest),(!$aParams['watermark_use']));
/**
* Добавляем watermark согласно в конфигурации заданым параметрам
*/
@ -209,7 +210,7 @@ class ModuleImage extends Module {
/**
* Вырезает максимально возможный квадрат
*
* @param LiveImage $oImage
* @param LiveImage $oImage Объект изображения
* @return LiveImage
*/
public function CropSquare(LiveImage $oImage,$bCenter=true) {
@ -222,15 +223,15 @@ class ModuleImage extends Module {
* Если высота и ширина совпадают, то возвращаем изначальный вариант
*/
if($iWidth==$iHeight){ return $oImage; }
/**
* Вырезаем квадрат из центра
*/
$iNewSize = min($iWidth,$iHeight);
if ($bCenter) {
if ($bCenter) {
$oImage->crop($iNewSize,$iNewSize,($iWidth-$iNewSize)/2,($iHeight-$iNewSize)/2);
} else {
} else {
$oImage->crop($iNewSize,$iNewSize,0,0);
}
/**
@ -238,18 +239,17 @@ class ModuleImage extends Module {
*/
return $oImage;
}
/**
* Вырезает максимально возможный прямоугольный в нужной пропорции
*
* @param LiveImage $oImage
* @param int $iW
* @param int $iH
* @param bool $bCenter
* @return unknown
* @param LiveImage $oImage Объект изображения
* @param int $iW Ширина для определения пропорции
* @param int $iH Высота для определения пропорции
* @param bool $bCenter Вырезать из центра
* @return LiveImage
*/
public function CropProportion(LiveImage $oImage,$iW,$iH,$bCenter=true) {
if(!$oImage || $oImage->get_last_error()) {
return false;
}
@ -260,21 +260,21 @@ class ModuleImage extends Module {
*/
$iProp=round($iW/$iH, 2);
if(round($iWidth/$iHeight, 2)==$iProp){ return $oImage; }
/**
* Вырезаем прямоугольник из центра
*/
*/
if (round($iWidth/$iHeight, 2)<=$iProp) {
$iNewWidth=$iWidth;
$iNewHeight=round($iNewWidth/$iProp);
} else {
} else {
$iNewHeight=$iHeight;
$iNewWidth=$iNewHeight*$iProp;
}
if ($bCenter) {
if ($bCenter) {
$oImage->crop($iNewWidth,$iNewHeight,($iWidth-$iNewWidth)/2,($iHeight-$iNewHeight)/2);
} else {
} else {
$oImage->crop($iNewWidth,$iNewHeight,0,0);
}
/**
@ -283,20 +283,20 @@ class ModuleImage extends Module {
return $oImage;
}
/**
* Сохраняет(копирует) файл изображения
* Сохраняет(копирует) файл изображения на сервер
* Если переопределить данный метод, то можно сохранять изображения, например, на Amazon S3
*
* @param $sFileSource Полный путь до исходного файла
* @param $sDirDest Каталог для сохранения файла относительно корня сайта
* @param $sFileDest
* @param null $iMode
* @param bool $bRemoveSource
* @param string $sFileSource Полный путь до исходного файла
* @param string $sDirDest Каталог для сохранения файла относительно корня сайта
* @param string $sFileDest Имя файла для сохранения
* @param int|null $iMode Права chmod для файла, например, 0777
* @param bool $bRemoveSource Удалять исходный файл или нет
* @return bool | string
*/
public function SaveFile($sFileSource,$sDirDest,$sFileDest,$iMode=null,$bRemoveSource=false) {
$sFileDestFullPath=rtrim(Config::Get('path.root.server'),"/").'/'.trim($sDirDest,"/").'/'.$sFileDest;
$this->CreateDirectory($sDirDest);
$bResult=copy($sFileSource,$sFileDestFullPath);
if ($bResult and !is_null($iMode)) {
chmod($sFileDestFullPath,$iMode);
@ -315,7 +315,7 @@ class ModuleImage extends Module {
/**
* Удаление файла изображения
*
* @param $sFile
* @param string $sFile Полный серверный путь до файла
* @return bool
*/
public function RemoveFile($sFile) {
@ -327,20 +327,20 @@ class ModuleImage extends Module {
/**
* Создает каталог по указанному адресу (с учетом иерархии)
*
* @param string $sDirDest
* @param string $sDirDest Каталог относительно корня сайта
*/
public function CreateDirectory($sDirDest) {
@func_mkdir(Config::Get('path.root.server'),$sDirDest);
@func_mkdir(Config::Get('path.root.server'),$sDirDest);
}
/**
* Возвращает серверный адрес по переданному web-адресу
*
* @param string $sPath
* @param string $sPath WEB адрес изображения
* @return string
*/
public function GetServerPath($sPath) {
/**
* Определяем, принадлежит ли этот адрес основному домену
* Определяем, принадлежит ли этот адрес основному домену
*/
if(parse_url($sPath,PHP_URL_HOST)!=parse_url(Config::Get('path.root.web'),PHP_URL_HOST)) {
return $sPath;
@ -355,9 +355,9 @@ class ModuleImage extends Module {
return rtrim(Config::Get('path.root.server'),'/').'/'.$sPath;
}
/**
* Возвращает серверный адрес по переданному web-адресу
* Возвращает WEB адрес по переданному серверному адресу
*
* @param string $sPath
* @param string $sPath Серверный адрес(путь) изображения
* @return string
*/
public function GetWebPath($sPath) {
@ -368,21 +368,21 @@ class ModuleImage extends Module {
/**
* Получает директорию для данного пользователя
* Используется фомат хранения данных (/images/us/er/id/yyyy/mm/dd/file.jpg)
*
* @param string $sUserId
*
* @param int $sId Целое число, обычно это ID пользователя
* @return string
*/
public function GetIdDir($sUserId) {
return Config::Get('path.uploads.images').'/'.preg_replace('~(.{2})~U', "\\1/", str_pad($sUserId, 6, "0", STR_PAD_LEFT)).date('Y/m/d');
public function GetIdDir($sId) {
return Config::Get('path.uploads.images').'/'.preg_replace('~(.{2})~U', "\\1/", str_pad($sId, 6, "0", STR_PAD_LEFT)).date('Y/m/d');
}
/**
* Возвращает валидный Html код тега <img>
*
* @param string $sPath
* @param array $aParams
* @param string $sPath WEB адрес изображения
* @param array $aParams Параметры
* @return string
*/
public function BuildHTML($sPath,$aParams) {
public function BuildHTML($sPath,$aParams) {
$sText='<img src="'.$sPath.'" ';
if (isset($aParams['title']) and $aParams['title']!='') {
$sText.=' title="'.htmlspecialchars($aParams['title']).'" ';
@ -402,14 +402,8 @@ class ModuleImage extends Module {
? ' alt="'.htmlspecialchars($aParams['alt']).'"'
: ' alt=""';
$sText.=$sAlt.' />';
return $sText;
}
/**
* Завершение работы модуля
*/
public function Shutdown() {
}
}
?>

View file

@ -17,6 +17,8 @@
/**
* Модуль поддержки языковых файлов
*
* @package engine.modules
* @since 1.0
*/
class ModuleLang extends Module {
/**
@ -29,29 +31,30 @@ class ModuleLang extends Module {
* Язык ресурса, используемый по умолчанию
*
* @var string
*/
*/
protected $sDefaultLang;
/**
* Путь к языковым файлам
*
* @var string
*/
*/
protected $sLangPath;
/**
* Список языковых текстовок
*
* @var array
*/
protected $aLangMsg=array();
/**
* Список текстовок для JS
*
* @var unknown_type
* @var array
*/
protected $aLangMsgJs=array();
/**
* Инициализация модуля
*
* @return null
*/
public function Init() {
$this->Hook_Run('lang_init_start');
@ -64,7 +67,6 @@ class ModuleLang extends Module {
/**
* Инициализирует языковой файл
*
* @return null
*/
protected function InitLang() {
/**
@ -112,7 +114,7 @@ class ModuleLang extends Module {
/**
* Добавляет текстовку к JS
*
* @param unknown_type $aKeys
* @param array $aKeys Список текстовок
*/
public function AddLangJs($aKeys) {
if (!is_array($aKeys)) {
@ -123,7 +125,7 @@ class ModuleLang extends Module {
/**
* Загружает текстовки из языковых файлов
*
* @return null
* @param $sLangName Язык для загрузки
*/
protected function LoadLangFiles($sLangName) {
$sLangFilePath = $this->sLangPath.'/'.$sLangName.'.php';
@ -145,7 +147,6 @@ class ModuleLang extends Module {
}
closedir($hDirConfig);
}
/**
* Ищет языковые файлы актвиированных плагинов
*/
@ -165,17 +166,15 @@ class ModuleLang extends Module {
}
}
/**
* Ищет языковой файл текущего шаблона
*/
$this->LoadLangFileTemplate($sLangName);
}
/**
* Загружает языковой файл текущего шаблона
*
* @param unknown_type $sLangName
* @param string $sLangName Язык для загрузки
*/
public function LoadLangFileTemplate($sLangName) {
$sFile=Config::Get('path.smarty.template').'/settings/language/'.$sLangName.'.php';
@ -186,7 +185,7 @@ class ModuleLang extends Module {
/**
* Установить текущий язык
*
* @param string $sLang
* @param string $sLang Название языка
*/
public function SetLang($sLang) {
$this->sCurrentLang=$sLang;
@ -202,7 +201,7 @@ class ModuleLang extends Module {
}
/**
* Получить дефолтный язык
*
*
* @return string
*/
public function GetLangDefault() {
@ -211,17 +210,17 @@ class ModuleLang extends Module {
/**
* Получить список текстовок
*
* @return unknown
* @return array
*/
public function GetLangMsg() {
return $this->aLangMsg;
}
/**
* Получает текстовку по её имени
*
* @param string $sName
* @param array $aReplace
* @param string $sName Имя текстовки
* @param array $aReplace Список параметром для замены в текстовке
* @param bool $bDelete Удалять или нет параметры, которые не были заменены
* @return string
*/
public function Get($sName,$aReplace=array(),$bDelete=true) {
@ -255,12 +254,12 @@ class ModuleLang extends Module {
}
return $sLang;
}
/**
* Добавить к текстовкам массив сообщений
*
* @param array $aMessages
*/
* Добавить к текстовкам массив сообщений
*
* @param array $aMessages Список текстовок для добавления
* @param array|null $aBlock Параметры, позволяют хранить текстовки в структурированном виде, например, тестовки плагина "test" получать как Get('plugin.name.test')
*/
public function AddMessages($aMessages, $aBlock = null) {
if (is_array($aMessages)) {
if (!Config::Get('lang.disable_blocks') && is_array($aBlock)) {
@ -268,7 +267,7 @@ class ModuleLang extends Module {
if (!isset($this->aLangMsg[$aBlock['category']]) || !$this->aLangMsg[$aBlock['category']]) {$this->aLangMsg[$aBlock['category']] = array();}
$this->aLangMsg[$aBlock['category']][$aBlock['name']] = $aMessages;
} else {
$this->aLangMsg [$aBlock['name']] = $aMessages;
$this->aLangMsg[$aBlock['name']] = $aMessages;
}
}
if (count($this->aLangMsg)==0) {
@ -278,17 +277,15 @@ class ModuleLang extends Module {
}
}
}
/**
* Добавить к текстовкам отдельное сообщение
*
* @param string $sKey
* @param string $sMessage
*/
* Добавить к текстовкам отдельное сообщение
*
* @param string $sKey Имя текстовки
* @param string $sMessage Значение текстовки
*/
public function AddMessage($sKey, $sMessage) {
$this->aLangMsg[$sKey] = $sMessage;
}
/**
* Завершаем работу модуля
*

View file

@ -18,9 +18,14 @@
/**
* Модуль логирования
* Имеет 3 уровня логирования: 'DEBUG','NOTICE','ERROR'
* <pre>
* $this->Logger_Debug('Debug message');
* </pre>
*
* @package engine.modules
* @since 1.0
*/
class ModuleLogger extends Module {
class ModuleLogger extends Module {
/**
* Уровни логгирования
*
@ -66,25 +71,23 @@ class ModuleLogger extends Module {
/**
* Случайное число
*
* @var unknown_type
* @var int
*/
protected $iRandom;
/**
* Инициализация, устанавливает имя файла лога
*
*/
public function Init() {
$this->sPathLogs=Config::Get('path.root.server').'/logs/';
$this->SetFileName(Config::Get('sys.logs.file'));
$this->iRandom=rand(1000,9999);
public function Init() {
$this->sPathLogs=Config::Get('path.root.server').'/logs/';
$this->SetFileName(Config::Get('sys.logs.file'));
$this->iRandom=rand(1000,9999);
}
/**
* Уставливает текущий уровень лога, тот уровень при котором будет производиться запись в файл лога
*
* @param int, string('DEBUG','NOTICE','ERROR') $level
* @param int, string('DEBUG','NOTICE','ERROR') $level Уровень логирования
* @return bool
*/
public function SetWriteLevel($level) {
@ -99,7 +102,6 @@ class ModuleLogger extends Module {
}
return false;
}
/**
* Возвращает текущий уровень лога
*
@ -108,16 +110,14 @@ class ModuleLogger extends Module {
public function GetWriteLevel() {
return $this->writeLevel;
}
/**
* Использовать трассировку или нет
*
* @param bool $bool
* @param bool $bool Использовать или нет троссировку в логах
*/
public function SetUseTrace($bool) {
$this->bUseTrace=(bool)$bool;
}
/**
* Использует трассировку или нет
*
@ -126,7 +126,6 @@ class ModuleLogger extends Module {
public function GetUseTrace() {
return $this->bUseTrace;
}
/**
* Использовать ротацию логов или нет
*
@ -135,7 +134,6 @@ class ModuleLogger extends Module {
public function SetUseRotate($bool) {
$this->bUseRotate=(bool)$bool;
}
/**
* Использует ротацию логов или нет
*
@ -144,16 +142,14 @@ class ModuleLogger extends Module {
public function GetUseRotate() {
return $this->bUseRotate;
}
/**
* Устанавливает имя файла лога
*
* @param string $sFile
*/
public function SetFileName($sFile){
$this->sFileName=$sFile;
public function SetFileName($sFile){
$this->sFileName=$sFile;
}
/**
* Получает имя файла лога
*
@ -162,39 +158,35 @@ class ModuleLogger extends Module {
public function GetFileName(){
return $this->sFileName;
}
/**
* Запись в лог с уровнем логирования 'DEBUG'
*
* @param string $msg
* @param string $msg Сообщение для записи в лог
*/
public function Debug($msg) {
$this->log($msg,'DEBUG');
}
/**
* Запись в лог с уровнем логирования 'ERROR'
*
* @param string $msg
* @param string $msg Сообщение для записи в лог
*/
public function Error($msg) {
$this->log($msg,'ERROR');
}
/**
* Запись в лог с уровнем логирования 'NOTICE'
*
* @param string $msg
* @param string $msg Сообщение для записи в лог
*/
public function Notice($msg) {
$this->log($msg,'NOTICE');
}
/**
* Записывает лог
*
* @param string $msg
* @param string $sLevel
* @param string $msg Сообщение для записи в лог
* @param string $sLevel Уровень логирования
*/
protected function log($msg,$sLevel) {
/**
@ -212,21 +204,20 @@ class ModuleLogger extends Module {
/**
* Если нужно то трассируем
*/
if ($this->getUseTrace()) {
if ($this->getUseTrace()) {
$msgOut.='['.$this->parserTrace(debug_backtrace()).']';
}
/**
* Записываем
*/
$this->write($msgOut);
}
}
}
/**
* Выполняет форматирование трассировки
*
* @param array $aTrace
* @return unknown
* @return string
*/
protected function parserTrace($aTrace) {
$msg='';
@ -243,12 +234,11 @@ class ModuleLogger extends Module {
}
return $msg;
}
/**
* Производит сохранение в файл
*
* @param string $msg
* @return unknown
* @param string $msg Сообщение
* @return bool
*/
protected function write($msg) {
/**
@ -268,41 +258,41 @@ class ModuleLogger extends Module {
* Запись в файл
*/
if ($fp=fopen($this->sPathLogs.$this->sFileName,"a")) {
fwrite($fp,$msg."\n");
fclose($fp);
/**
* Если нужно то делаем ротацию
*/
if ($this->bUseRotate) {
$this->rotate();
}
fwrite($fp,$msg."\n");
fclose($fp);
/**
* Если нужно то делаем ротацию
*/
if ($this->bUseRotate) {
$this->rotate();
}
}
}
return true;
}
/**
* Производит ротацию логов
*
*/
protected function rotate() {
protected function rotate() {
clearstatcache();
/**
* Если размер файло лога привысил максимальный то сохраняем текущий файл в архивный, а текущий становится пустым
* Если размер файла лога привысил максимальный то сохраняем текущий файл в архивный, а текущий становится пустым
*/
if (filesize($this->sPathLogs.$this->sFileName)>=$this->iSizeForRotate) {
$pathinfo=pathinfo($this->sPathLogs.$this->getFileName());
$pathinfo=pathinfo($this->sPathLogs.$this->getFileName());
$name=$pathinfo['basename'];
$aName=explode('.',$name);
$i=1;
while (1) {
$sNameNew=$aName[0].".$i.".$aName[1];
$sFullNameNew=$pathinfo['dirname'].'/'.$sNameNew;
if (!file_exists($sFullNameNew)) {
$sFullNameNew=$pathinfo['dirname'].'/'.$sNameNew;
if (!file_exists($sFullNameNew)) {
$this->rotateRename($i-1);
break;
}
}
$i++;
}
}
}
}
/**
@ -310,10 +300,10 @@ class ModuleLogger extends Module {
*
* @param int $numberLast
*/
protected function rotateRename($numberLast) {
$pathinfo=pathinfo($this->sPathLogs.$this->getFileName());
$aName=explode('.',$pathinfo['basename']);
for ($i=$numberLast;$i>0;$i--) {
protected function rotateRename($numberLast) {
$pathinfo=pathinfo($this->sPathLogs.$this->getFileName());
$aName=explode('.',$pathinfo['basename']);
for ($i=$numberLast;$i>0;$i--) {
$sFullNameCur=$pathinfo['dirname'].'/'.$aName[0].".$i.".$aName[1];
$sFullNameNew=$pathinfo['dirname'].'/'.$aName[0].'.'.($i+1).'.'.$aName[1];
rename($sFullNameCur,$sFullNameNew);

View file

@ -23,14 +23,23 @@
* Так же вы можете благодаря этому получать уведомления о новых версиях установленных плагинов и шаблонов.
* Вы всегда можете отключить передачу данных в конфиге, но просим этого не далать, тем самым вы поможете развитию LS CMS. Это важно для нас.
*
* @package engine.modules
* @since 1.0
*/
class ModuleLs extends Module {
/**
* Адрес шлюза
*
* @var string
*/
protected $sUrlLs='http://sender.livestreetcms.com/push/';
/**
* Список данных для отправки
*
* @var array
*/
protected $aDataForSend=array();
protected $oMapper;
/**
* Инициализируем модуль
*
@ -38,7 +47,6 @@ class ModuleLs extends Module {
public function Init() {
}
/**
* Запуск сбора данных
*
@ -48,7 +56,6 @@ class ModuleLs extends Module {
if (!Config::Get('module.ls.send_general')) {
return false;
}
/**
* Вставка счетчика
*/
@ -56,13 +63,11 @@ class ModuleLs extends Module {
// лучше вставлять в html_head_end, но здесь нужно постараться вставить код в самом конце, чтобы уменьшить вероятность повторного вызова GA, если сайт его использует
$this->Hook_AddExecModule('template_body_end','Ls_InjectCounter',-10000);
}
/**
* Отправка данных
*/
$this->SendToLs();
}
/**
* Вставка счетчика GA с учетом его возможного повторного использования
*
@ -92,9 +97,8 @@ class ModuleLs extends Module {
return $sCounter;
}
/**
* Отправка данных на сервер LS
* Отправка данных на шлюз LS
*/
protected function SendToLs() {
/**
@ -134,7 +138,6 @@ class ModuleLs extends Module {
$this->ErrorSendToLs();
}
}
/**
* Отмечает факт ошибки при отправки данных, увеличиваем число попыток
*/
@ -149,18 +152,16 @@ class ModuleLs extends Module {
}
$this->SetMarkerFile(date("Y-m-d"),$aData);
}
/**
* Отмечает факт успешной отправки данных
*/
protected function SuccessfulSendToLs() {
$this->SetMarkerFile(date("Y-m-d"),array('is_send'=>1));
}
/**
* Читает данные из файла
*
* @param $sDate
* @param string $sDate Дата под которой сохранен файл
* @return bool|mixed
*/
protected function GetMarkerFile($sDate) {
@ -173,12 +174,11 @@ class ModuleLs extends Module {
}
return false;
}
/**
* Записывает данные в файл
*
* @param $sDate
* @param $aData
* @param string $sDate Дата
* @param array $aData Данные
* @return bool
*/
protected function SetMarkerFile($sDate,$aData) {
@ -188,7 +188,6 @@ class ModuleLs extends Module {
}
return false;
}
/**
* Возвращает строчку для инжекции в шаблон
*
@ -199,7 +198,6 @@ class ModuleLs extends Module {
$sUrl=$this->sUrlLs.'img/?'.$this->makeGetParams($this->aDataForSend);
return '<img width="1" height="1" src="'.$sUrl.'">';
}
/**
* Возвращает данные для отправки
*
@ -227,13 +225,12 @@ class ModuleLs extends Module {
return $aData;
}
/**
* Чтение URL
*
* @param $sUrl
* @param $aParams
* @return bool|mixed|string
* @param string $sUrl Урл
* @param array $aParams параметры
* @return bool|string
*/
protected function getUrl($sUrl,$aParams) {
if (function_exists('curl_init')) {
@ -283,12 +280,11 @@ class ModuleLs extends Module {
return $sData;
}
}
/**
* Формирует строку GET параметров
*
* @param array $aParams
* @return array|string
* @param array $aParams Параметры
* @return string
*/
protected function makeGetParams($aParams=array()) {
$sGetParams='';
@ -297,7 +293,5 @@ class ModuleLs extends Module {
}
return $sGetParams;
}
}
?>

View file

@ -19,19 +19,63 @@ require_once(Config::Get('path.root.engine').'/lib/external/phpMailer/class.phpm
/**
* Модуль для отправки почты(e-mail) через phpMailer
* <pre>
* $this->Mail_SetAdress('claus@mail.ru','Claus');
* $this->Mail_SetSubject('Hi!');
* $this->Mail_SetBody('How are you?');
* $this->Mail_setHTML();
* $this->Mail_Send();
* </pre>
*
* @package engine.modules
* @since 1.0
*/
class ModuleMail extends Module {
protected $oMailer;
/**
* Настройки SMTP сервера для отправки писем
*
* Основной объект рассылбщика
*
* @var phpmailer
*/
protected $oMailer;
/**
* Настройки SMTP сервера для отправки писем
*
*/
/**
* Хост smtp
*
* @var string
*/
protected $sHost;
/**
* Порт smtp
*
* @var int
*/
protected $iPort;
/**
* Логин smtp
*
* @var string
*/
protected $sUsername;
/**
* Пароль smtp
*
* @var string
*/
protected $sPassword;
/**
* Треубется или нет авторизация на smtp
*
* @var bool
*/
protected $bSmtpAuth;
/**
* Префикс соединения к smtp - "", "ssl" или "tls"
*
* @var string
*/
protected $sSmtpSecure;
/**
* Метод отправки почты
@ -51,7 +95,7 @@ class ModuleMail extends Module {
* @var int
*/
protected $iWordWrap=0;
/**
* Мыло от кого отправляется вся почта
*
@ -64,22 +108,32 @@ class ModuleMail extends Module {
* @var string
*/
protected $sFromName;
/**
* Тема письма
*
* @var string
*/
protected $sSubject='';
/**
* Текст письма
*
* @var string
*/
protected $sBody='';
/**
* Инициализация модуля
*
*/
public function Init() {
public function Init() {
/**
* Настройки SMTP сервера для отправки писем
*/
* Настройки SMTP сервера для отправки писем
*/
$this->sHost = Config::Get('sys.mail.smtp.host');
$this->iPort = Config::Get('sys.mail.smtp.port');
$this->sUsername = Config::Get('sys.mail.smtp.user');
$this->sPassword = Config::Get('sys.mail.smtp.password');
$this->bSmtpAuth = Config::Get('sys.mail.smtp.auth');
$this->bSmtpAuth = Config::Get('sys.mail.smtp.auth');
$this->sSmtpSecure = Config::Get('sys.mail.smtp.secure');
/**
* Метод отправки почты
@ -88,7 +142,7 @@ class ModuleMail extends Module {
/**
* Кодировка писем
*/
$this->sCharSet=Config::Get('sys.mail.charset');
$this->sCharSet=Config::Get('sys.mail.charset');
/**
* Мыло от кого отправляется вся почта
*/
@ -97,12 +151,12 @@ class ModuleMail extends Module {
* Имя от кого отправляется вся почта
*/
$this->sFromName=Config::Get('sys.mail.from_name');
/**
* Создаём объект phpMailer и устанвливаем ему необходимые настройки
*/
$this->oMailer = new phpmailer();
$this->oMailer->Host=$this->sHost;
$this->oMailer = new phpmailer();
$this->oMailer->Host=$this->sHost;
$this->oMailer->Port=$this->iPort;
$this->oMailer->Username=$this->sUsername;
$this->oMailer->Password=$this->sPassword;
@ -111,50 +165,45 @@ class ModuleMail extends Module {
$this->oMailer->Mailer=$this->sMailerType;
$this->oMailer->WordWrap=$this->iWordWrap;
$this->oMailer->CharSet=$this->sCharSet;
$this->oMailer->From=$this->sFrom;
$this->oMailer->FromName=$this->sFromName;
$this->oMailer->FromName=$this->sFromName;
}
/**
* Устанавливает тему сообщения
*
* @param string $sText
* @param string $sText Тема сообщения
*/
public function SetSubject($sText) {
$this->sSubject=$sText;
}
/**
* Устанавливает текст сообщения
*
* @param string $sText
* @param string $sText Текст сообщения
*/
public function SetBody($sText) {
$this->sBody=$sText;
}
/**
* Добавляем новый адрес получателя
*
* @param string $sMail
* @param string $sName
* @param string $sMail Емайл
* @param string $sName Имя
*/
public function AddAdress($sMail,$sName=null) {
$this->oMailer->AddAddress($sMail,$sName);
}
/**
* Отправляет сообщение(мыло)
*
* @return unknown
* @return bool
*/
public function Send() {
$this->oMailer->Subject=$this->sSubject;
$this->oMailer->Body=$this->sBody;
return $this->oMailer->Send();
}
/**
* Очищает все адреса получателей
*
@ -162,18 +211,16 @@ class ModuleMail extends Module {
public function ClearAddresses() {
$this->oMailer->ClearAddresses();
}
/**
* Устанавливает единственный адрес получателя
*
* @param string $sMail
* @param string $sName
* @param string $sMail Емайл
* @param string $sName Имя
*/
public function SetAdress($sMail,$sName=null) {
$this->ClearAddresses();
$this->oMailer->AddAddress($sMail,$sName);
}
/**
* Устанавливает режим отправки письма как HTML
*
@ -181,7 +228,6 @@ class ModuleMail extends Module {
public function setHTML() {
$this->oMailer->IsHTML(true);
}
/**
* Устанавливает режим отправки письма как Text(Plain)
*

View file

@ -17,7 +17,13 @@
/**
* Модуль системных сообщений
* Позволяет показывать пользователю сообщения двух видов - об ошибке и об успешном действии.
* <pre>
* $this->Message_AddErrorSingle($this->Lang_Get('not_access'),$this->Lang_Get('error'));
* </pre>
*
* @package engine.modules
* @since 1.0
*/
class ModuleMessage extends Module {
/**
@ -32,103 +38,100 @@ class ModuleMessage extends Module {
* @var array
*/
protected $aMsgNotice=array();
/**
* Массив сообщений, который будут показаны на СЛЕДУЮЩЕЙ страничке
*
* @var array
*/
protected $aMsgNoticeSession=array();
/**
* Массив ошибок, который будут показаны на СЛЕДУЮЩЕЙ страничке
*
* @var array
*/
protected $aMsgErrorSession=array();
/**
* Инициализация модуля
*
*/
public function Init() {
public function Init() {
/**
* Добавляем сообщения и ошибки, которые содержались в сессии
*/
$aNoticeSession = $this->Session_Get('message_notice_session');
$aNoticeSession = $this->Session_Get('message_notice_session');
if(is_array($aNoticeSession) and count($aNoticeSession)) {
$this->aMsgNotice = $aNoticeSession;
}
$this->aMsgNotice = $aNoticeSession;
}
$aErrorSession = $this->Session_Get('message_error_session');
if(is_array($aErrorSession) and count($aErrorSession)) {
$this->aMsgError = $aErrorSession;
$this->aMsgError = $aErrorSession;
}
}
/**
* При завершении работы модуля передаем списки сообщений в шаблоны Smarty
*
*/
public function Shutdown() {
public function Shutdown() {
/**
* Добавляем в сессию те соощения, которые были отмечены для сессионого использования
*/
$this->Session_Set('message_notice_session', $this->GetNoticeSession());
$this->Session_Set('message_error_session', $this->GetErrorSession());
$this->Viewer_Assign('aMsgError',$this->GetError());
$this->Viewer_Assign('aMsgNotice',$this->GetNotice());
$this->Session_Set('message_notice_session', $this->GetNoticeSession());
$this->Session_Set('message_error_session', $this->GetErrorSession());
$this->Viewer_Assign('aMsgError',$this->GetError());
$this->Viewer_Assign('aMsgNotice',$this->GetNotice());
}
/**
* Добавляет новое сообщение об ошибке
*
* @param string $sMsg
* @param string $sTitle
* @param bool $bUseSession
* @param string $sMsg Сообщение
* @param string $sTitle Заголовок
* @param bool $bUseSession Показать сообщение при следующем обращии пользователя к сайту
*/
public function AddError($sMsg,$sTitle=null,$bUseSession=false) {
if(!$bUseSession) {
if(!$bUseSession) {
$this->aMsgError[]=array('msg'=>$sMsg,'title'=>$sTitle);
} else {
$this->aMsgErrorSession[]=array('msg'=>$sMsg,'title'=>$sTitle);
}
}
/**
* Создаёт идинственное сообщение об ошибке(т.е. очищает все предыдущие)
*
* @param string $sMsg
* @param string $sTitle
* @param bool $bUseSession
* @param string $sMsg Сообщение
* @param string $sTitle Заголовок
* @param bool $bUseSession Показать сообщение при следующем обращии пользователя к сайту
*/
public function AddErrorSingle($sMsg,$sTitle=null,$bUseSession=false) {
$this->ClearError();
$this->AddError($sMsg,$sTitle,$bUseSession);
$this->AddError($sMsg,$sTitle,$bUseSession);
}
/**
* Добавляет новое сообщение
*
* @param string $sMsg
* @param string $sTitle
* @param bool $bUseSession
* @param string $sMsg Сообщение
* @param string $sTitle Заголовок
* @param bool $bUseSession Показать сообщение при следующем обращии пользователя к сайту
*/
public function AddNotice($sMsg,$sTitle=null,$bUseSession=false) {
if(!$bUseSession) {
if(!$bUseSession) {
$this->aMsgNotice[]=array('msg'=>$sMsg,'title'=>$sTitle);
} else {
$this->aMsgNoticeSession[]=array('msg'=>$sMsg,'title'=>$sTitle);
$this->aMsgNoticeSession[]=array('msg'=>$sMsg,'title'=>$sTitle);
}
}
/**
* Создаёт идинственное сообщение, удаляя предыдущие
*
* @param string $sMsg
* @param string $sTitle
* @param bool $bUseSession
* @param string $sMsg Сообщение
* @param string $sTitle Заголовок
* @param bool $bUseSession Показать сообщение при следующем обращии пользователя к сайту
*/
public function AddNoticeSingle($sMsg,$sTitle=null,$bUseSession=false) {
$this->ClearNotice();
$this->AddNotice($sMsg,$sTitle,$bUseSession);
$this->AddNotice($sMsg,$sTitle,$bUseSession);
}
/**
* Очищает стек сообщений
*
@ -137,7 +140,6 @@ class ModuleMessage extends Module {
$this->aMsgNotice=array();
$this->aMsgNoticeSession=array();
}
/**
* Очищает стек ошибок
*
@ -146,7 +148,6 @@ class ModuleMessage extends Module {
$this->aMsgError=array();
$this->aMsgErrorSession=array();
}
/**
* Получает список сообщений об ошибке
*
@ -155,7 +156,6 @@ class ModuleMessage extends Module {
public function GetError() {
return $this->aMsgError;
}
/**
* Получает список сообщений
*
@ -164,25 +164,23 @@ class ModuleMessage extends Module {
public function GetNotice() {
return $this->aMsgNotice;
}
/**
* Возвращает список сообщений,
* Возвращает список сообщений,
* которые необходимо поместить в сессию
*
*
* @return array
*/
public function GetNoticeSession() {
return $this->aMsgNoticeSession;
}
return $this->aMsgNoticeSession;
}
/**
* Возвращает список ошибок,
* Возвращает список ошибок,
* которые необходимо поместить в сессию
*
*
* @return array
*/
public function GetErrorSession() {
return $this->aMsgErrorSession;
}
return $this->aMsgErrorSession;
}
}
?>

View file

@ -16,8 +16,10 @@
*/
/**
* Модуль управления плагинами сообщений
* Модуль управления плагинами
*
* @package engine.modules
* @since 1.0
*/
class ModulePlugin extends Module {
/**
@ -32,16 +34,15 @@ class ModulePlugin extends Module {
* @var string
*/
protected $sPluginsDir;
/**
* Список плагинов
*
* @var unknown_type
* @var array
*/
protected $aPluginsList=array();
/**
* Список engine-rewrite`ов (модули, экшены, сущности, шаблоны)
* Определяет типы объектов, которые может переопределить/унаследовать плагин
*
* @var array
*/
@ -53,7 +54,6 @@ class ModulePlugin extends Module {
'template' => array(),
'block' => array(),
);
/**
* Стек наследований
*
@ -68,7 +68,6 @@ class ModulePlugin extends Module {
public function Init() {
$this->sPluginsDir=Config::Get('path.root.server').'/plugins/';
}
/**
* Получает список информации о всех плагинах, загруженных в plugin-директорию
*
@ -122,13 +121,12 @@ class ModulePlugin extends Module {
}
return $this->aPluginsList;
}
/**
* Получает значение параметра из XML на основе языковой разметки
*
* @param SimpleXMLElement $oXml
* @param string $sProperty
* @param string $sLang
* @param SimpleXMLElement $oXml XML узел
* @param string $sProperty Свойство, которое нужно вернуть
* @param string $sLang Название языка
*/
protected function Xlang($oXml,$sProperty,$sLang) {
$sProperty=trim($sProperty);
@ -138,7 +136,13 @@ class ModulePlugin extends Module {
}
$oXml->$sProperty->data=$this->Text_Parser(trim((string)array_shift($data)));
}
/**
* Переключает состояние плагина активный/не активный
*
* @param string $sPlugin Название плагина(код)
* @param $sAction Действие - activate/deactivate
* @return null|bool
*/
public function Toggle($sPlugin,$sAction) {
$aPlugins=$this->GetList();
if(!isset($aPlugins[$sPlugin])) return null;
@ -309,7 +313,6 @@ class ModulePlugin extends Module {
return null;
}
}
/**
* Возвращает список активированных плагинов в системе
*
@ -324,16 +327,15 @@ class ModulePlugin extends Module {
return $aPlugins;
}
/**
* Записывает список активных плагинов в файл PLUGINS.DAT
*
* @param array|string $aPlugins
* @param array|string $aPlugins Список плагинов
* @return bool
*/
public function SetActivePlugins($aPlugins) {
if(!is_array($aPlugins)) $aPlugins = array($aPlugins);
$aPlugins=array_unique(array_map('trim',$aPlugins));
/**
* Записываем данные в файл PLUGINS.DAT
*/
@ -342,11 +344,10 @@ class ModulePlugin extends Module {
}
return false;
}
/**
* Удаляет плагины с сервера
*
* @param array $aPlugins
* @param array $aPlugins Список плагинов для удаления
*/
public function Delete($aPlugins) {
if(!is_array($aPlugins)) $aPlugins=array($aPlugins);
@ -364,7 +365,6 @@ class ModulePlugin extends Module {
func_rmdir($this->sPluginsDir.$sPluginCode);
}
}
/**
* Перенаправление вызовов на модули, экшены, сущности
*
@ -385,7 +385,6 @@ class ModulePlugin extends Module {
'sign'=>$sSign
);
}
/**
* Добавляет в стек наследника класса
*
@ -403,13 +402,12 @@ class ModulePlugin extends Module {
);
$this->aInherits[trim($sFrom)]['position']=count($this->aInherits[trim($sFrom)]['items'])-1;
}
/**
* Получает следующего родителя у наследника.
* ВНИМАНИЕ! Данный метод нужно вызвать только из __autoload()
*
* @param unknown_type $sFrom
* @return unknown
* @param string $sFrom
* @return string
*/
public function GetParentInherit($sFrom) {
if (!isset($this->aInherits[$sFrom]['items']) or count($this->aInherits[$sFrom]['items'])<=1 or $this->aInherits[$sFrom]['position']<1) {
@ -418,14 +416,24 @@ class ModulePlugin extends Module {
$this->aInherits[$sFrom]['position']--;
return $this->aInherits[$sFrom]['items'][$this->aInherits[$sFrom]['position']]['inherit'];
}
/**
* Возвращает список наследуемых классов
*
* @param string $sFrom
* @return null|array
*/
public function GetInherits($sFrom) {
if (isset($this->aInherits[trim($sFrom)])) {
return $this->aInherits[trim($sFrom)]['items'];
}
return null;
}
/**
* Возвращает последнего наследника в цепочке
*
* @param $sFrom
* @return null|string
*/
public function GetLastInherit($sFrom) {
if (isset($this->aInherits[trim($sFrom)])) {
return $this->aInherits[trim($sFrom)]['items'][count($this->aInherits[trim($sFrom)]['items'])-1];
@ -448,7 +456,11 @@ class ModulePlugin extends Module {
}
return $sFrom;
}
/**
* @param string $sType
* @param string $sFrom
* @return array|null
*/
public function GetDelegates($sType,$sFrom) {
if (isset($this->aDelegates[$sType][$sFrom]['delegate'])) {
return array($this->aDelegates[$sType][$sFrom]['delegate']);
@ -457,12 +469,24 @@ class ModulePlugin extends Module {
}
return null;
}
/**
* Возвращает цепочку делегатов
*
* @param string $sType
* @param string $sTo
* @return array
*/
public function GetDelegationChain($sType,$sTo) {
$sRootDelegater = $this->GetRootDelegater($sType,$sTo);
return $this->collectAllDelegatesRecursive($sType,array($sRootDelegater));
}
/**
* Возвращает делегируемый класс
*
* @param string $sType
* @param string $sTo
* @return string
*/
public function GetRootDelegater($sType,$sTo) {
$sItem = $sTo;
$sItemDelegater = $this->GetDelegater($sType,$sTo);
@ -475,7 +499,13 @@ class ModulePlugin extends Module {
}
return $sRootDelegater;
}
/**
* Составляет цепочку делегатов
*
* @param string $sType
* @param string $aDelegates
* @return array
*/
public function collectAllDelegatesRecursive($sType,$aDelegates) {
foreach($aDelegates as $sClass) {
if($aNewDelegates=$this->GetDelegates($sType,$sClass)) {
@ -484,7 +514,6 @@ class ModulePlugin extends Module {
}
return $aDelegates;
}
/**
* Возвращает делегирующий объект по имени делегата
*
@ -511,7 +540,6 @@ class ModulePlugin extends Module {
}
return $sTo;
}
/**
* Возвращает подпись делегата модуля, экшена, сущности.
*
@ -528,7 +556,6 @@ class ModulePlugin extends Module {
}
return null;
}
/**
* Возвращает true, если установлено правило делегирования
* и класс является базовым в данном правиле
@ -545,7 +572,6 @@ class ModulePlugin extends Module {
}
return false;
}
/**
* Возвращает true, если устано
*
@ -555,7 +581,7 @@ class ModulePlugin extends Module {
*/
public function isDelegated($sType,$sTo) {
/**
* Фильтруем меппер делегатов/наследников
* Фильтруем маппер делегатов/наследников
* @var array
*/
$aDelegateMapper=array_filter(
@ -576,7 +602,6 @@ class ModulePlugin extends Module {
}
return false;
}
/**
* Возвращает список объектов, доступных для делегирования
*
@ -585,12 +610,5 @@ class ModulePlugin extends Module {
public function GetDelegateObjectList() {
return array_keys($this->aDelegates);
}
/**
* При завершении работы модуля
*
*/
public function Shutdown() {
}
}
?>

View file

@ -16,8 +16,18 @@
*/
/**
* Модуль безопасности
* Модуль безопасности
* Необходимо использовать перед обработкой отправленной формы:
* <pre>
* if (getRequest('submit_add')) {
* $this->Security_ValidateSendForm();
* // далее код обработки формы
* ......
* }
* </pre>
*
* @package engine.modules
* @since 1.0
*/
class ModuleSecurity extends Module {
/**
@ -25,23 +35,28 @@ class ModuleSecurity extends Module {
*
*/
public function Init() {
}
/**
* Производит валидацию отправки формы/запроса от пользователя, позволяет избежать атаки CSRF
*/
public function ValidateSendForm() {
if (!($this->ValidateSessionKey() && 1)) {
if (!($this->ValidateSessionKey())) {
die("Hacking attemp!");
}
}
/**
* Проверка на соотвествие реферала
*
* @return bool
*/
public function ValidateReferal() {
if (isset($_SERVER['HTTP_REFERER'])) {
$aUrl=parse_url($_SERVER['HTTP_REFERER']);
$aUrl=parse_url($_SERVER['HTTP_REFERER']);
if (strcasecmp($aUrl['host'],$_SERVER['HTTP_HOST'])==0) {
return true;
} elseif (preg_match("/\.".quotemeta($_SERVER['HTTP_HOST'])."$/i",$aUrl['host'])) {
return true;
} elseif (preg_match("/\.".quotemeta($_SERVER['HTTP_HOST'])."$/i",$aUrl['host'])) {
return true;
}
}
return false;
@ -49,6 +64,7 @@ class ModuleSecurity extends Module {
/**
* Проверяет наличие security-ключа в сессии
*
* @param null|string $sCode Код для проверки, если нет то берется из реквеста
* @return bool
*/
public function ValidateSessionKey($sCode=null) {
@ -63,7 +79,7 @@ class ModuleSecurity extends Module {
public function SetSessionKey() {
$sCode = $this->GenerateSessionKey();
$this->Viewer_Assign('LIVESTREET_SECURITY_KEY',$sCode);
return $sCode;
}
/**
@ -74,9 +90,11 @@ class ModuleSecurity extends Module {
protected function GenerateSessionKey() {
return md5($this->Session_GetId().Config::Get('module.security.hash'));
}
/**
* Завершение модуля
*/
public function Shutdown() {
$this->SetSessionKey();
}
}
}
?>

View file

@ -17,28 +17,41 @@
/**
* Модуль для работы с сессиями
* Заменяет стандартный механизм сессий(session)
* Выступает в качестве врапера для стандартного механизма сессий
*
* @package engine.modules
* @since 1.0
*/
class ModuleSession extends Module {
/**
* ID сессии
*
* @var null|string
*/
protected $sId=null;
protected $aData=array();
/**
* Данные сессии
*
* @var array
*/
protected $aData=array();
/**
* Список user-agent'ов для флеш плеера
* Используется для передачи ID сессии при обращениии к сайту через flash, например, загрузка файлов через flash
*
* @var array
*/
protected $aFlashUserAgent=array(
'Shockwave Flash'
);
/**
* Использовать или нет стандартный механизм сессий
* ВНИМАНИЕ! Не рекомендуется ставить false - т.к. этот режим до конца не протестирован
*
* @var bool
*/
protected $bUseStandartSession;
protected $bUseStandartSession=true;
/**
* Инициализация модуля
*
@ -50,14 +63,13 @@ class ModuleSession extends Module {
*/
$this->Start();
}
/**
* Старт сессии
*
*/
protected function Start() {
if ($this->bUseStandartSession) {
session_name(Config::Get('sys.session.name'));
session_name(Config::Get('sys.session.name'));
session_set_cookie_params(
Config::Get('sys.session.timeout'),
Config::Get('sys.session.path'),
@ -67,7 +79,7 @@ class ModuleSession extends Module {
/**
* Даем возможность флешу задавать id сессии
*/
$sUserAgent=isset($_SERVER['HTTP_USER_AGENT']) ? $_SERVER['HTTP_USER_AGENT'] : null;
$sUserAgent=isset($_SERVER['HTTP_USER_AGENT']) ? $_SERVER['HTTP_USER_AGENT'] : null;
if ($sUserAgent and (in_array($sUserAgent,$this->aFlashUserAgent) or strpos($sUserAgent,"Adobe Flash Player")===0) and preg_match("/^[\w\d]{5,40}$/",getRequest('SSID'))) {
session_id(getRequest('SSID'));
} else {
@ -80,8 +92,6 @@ class ModuleSession extends Module {
$this->ReadData();
}
}
/**
* Устанавливает уникальный идентификатор сессии
*
@ -105,11 +115,10 @@ class ModuleSession extends Module {
);
}
}
/**
* Получает идентификатор текущей сессии
*
*/
*/
public function GetId() {
if ($this->bUseStandartSession) {
return session_id();
@ -117,24 +126,21 @@ class ModuleSession extends Module {
return $this->sId;
}
}
/**
* Гинерирует уникальный идентификатор
*
* @return unknown
* @return string
*/
protected function GenerateId() {
return md5(func_generator().time());
}
/**
* Читает данные сессии
* Читает данные сессии в aData
*
*/
protected function ReadData() {
$this->aData=$this->Cache_Get($this->sId);
}
/**
* Сохраняет данные сессии
*
@ -142,12 +148,11 @@ class ModuleSession extends Module {
protected function Save() {
$this->Cache_Set($this->aData,$this->sId,array(),Config::Get('sys.session.timeout'));
}
/**
* Получает значение из сессии
*
* @param string $sName
* @return unknown
* @param string $sName Имя параметра
* @return mixed|null
*/
public function Get($sName) {
if ($this->bUseStandartSession) {
@ -156,12 +161,11 @@ class ModuleSession extends Module {
return isset($this->aData[$sName]) ? $this->aData[$sName] : null;
}
}
/**
* Записывает значение в сессию
*
* @param string $sName
* @param unknown_type $data
* @param string $sName Имя параметра
* @param mixed $data Данные
*/
public function Set($sName,$data) {
if ($this->bUseStandartSession) {
@ -169,13 +173,12 @@ class ModuleSession extends Module {
} else {
$this->aData[$sName]=$data;
$this->Save();
}
}
}
/**
* Удаляет значение из сессии
*
* @param string $sName
* @param string $sName Имя параметра
*/
public function Drop($sName) {
if ($this->bUseStandartSession) {
@ -185,7 +188,6 @@ class ModuleSession extends Module {
$this->Save();
}
}
/**
* Получает разом все данные сессии
*
@ -198,7 +200,6 @@ class ModuleSession extends Module {
return $this->aData;
}
}
/**
* Завершает сессию, дропая все данные
*

View file

@ -19,7 +19,14 @@ require_once(Config::Get('path.root.engine').'/lib/external/Jevix/jevix.class.ph
/**
* Модуль обработки текста на основе типографа Jevix
* Позволяет вырезать из текста лишние HTML теги и предотвращает различные попытки внедрить в текст JavaScript
* <pre>
* $sText=$this->Text_Parser($sTestSource);
* </pre>
* Настройки парсинга находятся в конфиге /config/jevix.php
*
* @package engine.modules
* @since 1.0
*/
class ModuleText extends Module {
/**
@ -27,20 +34,19 @@ class ModuleText extends Module {
*
* @var Jevix
*/
protected $oJevix;
protected $oJevix;
/**
* Инициализация модуля
*
*/
public function Init() {
public function Init() {
/**
* Создаем объект типографа и запускаем его конфигурацию
*/
$this->oJevix = new Jevix();
$this->oJevix = new Jevix();
$this->JevixConfig();
}
/**
* Конфигурирует типограф
*
@ -49,12 +55,11 @@ class ModuleText extends Module {
// загружаем конфиг
$this->LoadJevixConfig();
}
/**
* Загружает конфиг Jevix'а
*
* @param string $sType Тип конфига
* @param bool $bClear
* @param bool $bClear Очищать предыдущий конфиг или нет
*/
public function LoadJevixConfig($sType='default',$bClear=true) {
if ($bClear) {
@ -81,11 +86,10 @@ class ModuleText extends Module {
}
}
}
/**
* Возвращает объект Jevix
*
* @return unknown
* @return Jevix
*/
public function GetJevix() {
return $this->oJevix;
@ -93,8 +97,8 @@ class ModuleText extends Module {
/**
* Парсинг текста с помощью Jevix
*
* @param string $sText
* @param array $aError
* @param string $sText Исходный текст
* @param array $aError Возвращает список возникших ошибок
* @return string
*/
public function JevixParser($sText,&$aError=null) {
@ -105,57 +109,59 @@ class ModuleText extends Module {
$sResult=$this->oJevix->parse($sText,$aError);
return $sResult;
}
/**
* Парсинг текста на предмет видео
* Находит теги <pre><video></video></pre> и реобразовываетих в видео
*
* @param string $sText
* @param string $sText Исходный текст
* @return string
*/
public function VideoParser($sText) {
/**
* youtube.com
*/
$sText = preg_replace('/<video>http:\/\/(?:www\.|)youtube\.com\/watch\?v=([a-zA-Z0-9_\-]+)(&.+)?<\/video>/Ui', '<object width="425" height="344"><param name="movie" value="http://www.youtube.com/v/$1&hl=en"></param><param name="wmode" value="opaque"></param><embed src="http://www.youtube.com/v/$1&hl=en" type="application/x-shockwave-flash" wmode="opaque" width="425" height="344"></embed></object>', $sText);
*/
$sText = preg_replace('/<video>http:\/\/(?:www\.|)youtube\.com\/watch\?v=([a-zA-Z0-9_\-]+)(&.+)?<\/video>/Ui', '<object width="425" height="344"><param name="movie" value="http://www.youtube.com/v/$1&hl=en"></param><param name="wmode" value="opaque"></param><embed src="http://www.youtube.com/v/$1&hl=en" type="application/x-shockwave-flash" wmode="opaque" width="425" height="344"></embed></object>', $sText);
/**
* rutube.ru
*/
$sText = preg_replace('/<video>http:\/\/(?:www\.|)rutube.ru\/tracks\/\d+.html\?v=([a-zA-Z0-9_\-]+)(&.+)?<\/video>/Ui', '<OBJECT width="470" height="353"><PARAM name="movie" value="http://video.rutube.ru/$1"></PARAM><PARAM name="wmode" value="opaque"></PARAM><PARAM name="allowFullScreen" value="true"></PARAM><PARAM name="flashVars" value="uid=662118"></PARAM><EMBED src="http://video.rutube.ru/$1" type="application/x-shockwave-flash" wmode="opaque" width="470" height="353" allowFullScreen="true" flashVars="uid=662118"></EMBED></OBJECT>', $sText);
*/
$sText = preg_replace('/<video>http:\/\/(?:www\.|)rutube.ru\/tracks\/\d+.html\?v=([a-zA-Z0-9_\-]+)(&.+)?<\/video>/Ui', '<OBJECT width="470" height="353"><PARAM name="movie" value="http://video.rutube.ru/$1"></PARAM><PARAM name="wmode" value="opaque"></PARAM><PARAM name="allowFullScreen" value="true"></PARAM><PARAM name="flashVars" value="uid=662118"></PARAM><EMBED src="http://video.rutube.ru/$1" type="application/x-shockwave-flash" wmode="opaque" width="470" height="353" allowFullScreen="true" flashVars="uid=662118"></EMBED></OBJECT>', $sText);
return $sText;
}
/**
* Парсит текст
* Парсит текст, применя все парсеры
*
* @param string $sText
* @param string $sText Исходный текст
* @return string
*/
public function Parser($sText) {
$sResult=$this->FlashParamParser($sText);
$sResult=$this->JevixParser($sResult);
$sResult=$this->VideoParser($sResult);
$sResult=$this->FlashParamParser($sText);
$sResult=$this->JevixParser($sResult);
$sResult=$this->VideoParser($sResult);
$sResult=$this->CodeSourceParser($sResult);
return $sResult;
}
/**
* Заменяет все вхождения короткого тега <param/> на длиную версию <param></param>
* Заменяет все вхождения короткого тега <embed/> на длиную версию <embed></embed>
*
*
* @param string $sText Исходный текст
* @return string
*/
protected function FlashParamParser($sText) {
if (preg_match_all("@(<\s*param\s*name\s*=\s*(?:\"|').*(?:\"|')\s*value\s*=\s*(?:\"|').*(?:\"|'))\s*/?\s*>(?!</param>)@Ui",$sText,$aMatch)) {
protected function FlashParamParser($sText) {
if (preg_match_all("@(<\s*param\s*name\s*=\s*(?:\"|').*(?:\"|')\s*value\s*=\s*(?:\"|').*(?:\"|'))\s*/?\s*>(?!</param>)@Ui",$sText,$aMatch)) {
foreach ($aMatch[1] as $key => $str) {
$str_new=$str.'></param>';
$sText=str_replace($aMatch[0][$key],$str_new,$sText);
}
$str_new=$str.'></param>';
$sText=str_replace($aMatch[0][$key],$str_new,$sText);
}
}
if (preg_match_all("@(<\s*embed\s*.*)\s*/?\s*>(?!</embed>)@Ui",$sText,$aMatch)) {
if (preg_match_all("@(<\s*embed\s*.*)\s*/?\s*>(?!</embed>)@Ui",$sText,$aMatch)) {
foreach ($aMatch[1] as $key => $str) {
$str_new=$str.'></embed>';
$sText=str_replace($aMatch[0][$key],$str_new,$sText);
}
}
$str_new=$str.'></embed>';
$sText=str_replace($aMatch[0][$key],$str_new,$sText);
}
}
/**
* Удаляем все <param name="wmode" value="*"></param>
* Удаляем все <param name="wmode" value="*"></param>
*/
if (preg_match_all("@(<param\s.*name=(?:\"|')wmode(?:\"|').*>\s*</param>)@Ui",$sText,$aMatch)) {
foreach ($aMatch[1] as $key => $str) {
@ -171,56 +177,64 @@ class ModuleText extends Module {
$sText=str_replace($aMatch[0][$key],$aMatch[0][$key].'<param name="wmode" value="opaque"></param>',$sText);
}
}
return $sText;
}
/**
* Подсветка исходного кода
*
* @param string $sText Исходный текст
* @return mixed
*/
public function CodeSourceParser($sText) {
$sText=str_replace("<code>",'<pre class="prettyprint"><code>',$sText);
$sText=str_replace("</code>",'</code></pre>',$sText);
return $sText;
}
/**
* Производить резрезание текста по тегу <cut>.
* Производить резрезание текста по тегу cut.
* Возвращаем массив вида:
* <pre>
* array(
* $sTextShort - текст до тега <cut>
* $sTextNew - весь текст за исключением удаленного тега
* $sTextCut - именованное значение <cut>
* $sTextCut - именованное значение <cut>
* )
* </pre>
*
* @param string $sText
* @param string $sText Исходный текст
* @return array
*/
public function Cut($sText) {
$sTextShort = $sText;
$sTextNew = $sText;
$sTextCut = null;
$sTextTemp=str_replace("\r\n",'[<rn>]',$sText);
$sTextTemp=str_replace("\n",'[<n>]',$sTextTemp);
if (preg_match("/^(.*)<cut(.*)>(.*)$/Ui",$sTextTemp,$aMatch)) {
if (preg_match("/^(.*)<cut(.*)>(.*)$/Ui",$sTextTemp,$aMatch)) {
$aMatch[1]=str_replace('[<rn>]',"\r\n",$aMatch[1]);
$aMatch[1]=str_replace('[<n>]',"\r\n",$aMatch[1]);
$aMatch[3]=str_replace('[<rn>]',"\r\n",$aMatch[3]);
$aMatch[3]=str_replace('[<n>]',"\r\n",$aMatch[3]);
$aMatch[3]=str_replace('[<n>]',"\r\n",$aMatch[3]);
$sTextShort=$aMatch[1];
$sTextNew=$aMatch[1].' <a name="cut"></a> '.$aMatch[3];
if (preg_match('/^\s*name\s*=\s*"(.+)"\s*\/?$/Ui',$aMatch[2],$aMatchCut)) {
if (preg_match('/^\s*name\s*=\s*"(.+)"\s*\/?$/Ui',$aMatch[2],$aMatchCut)) {
$sTextCut=trim($aMatchCut[1]);
}
}
}
return array($sTextShort,$sTextNew,$sTextCut ? htmlspecialchars($sTextCut) : null);
}
/**
* Обработка тега <ls> в тексте
* Обработка тега ls в тексте
* <pre>
* <ls user="admin" />
* </pre>
*
* @param unknown_type $sTag
* @param unknown_type $aParams
* @return unknown
* @param string $sTag Тег на ктором сработал колбэк
* @param array $aParams Список параметров тега
* @return string
*/
public function CallbackTagLs($sTag,$aParams) {
$sText='';