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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

@ -19,19 +19,63 @@ require_once(Config::Get('path.root.engine').'/lib/external/phpMailer/class.phpm
/** /**
* Модуль для отправки почты(e-mail) через phpMailer * Модуль для отправки почты(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 { class ModuleMail extends Module {
protected $oMailer;
/** /**
* Настройки SMTP сервера для отправки писем * Основной объект рассылбщика
* *
* @var phpmailer
*/
protected $oMailer;
/**
* Настройки SMTP сервера для отправки писем
*
*/
/**
* Хост smtp
*
* @var string
*/ */
protected $sHost; protected $sHost;
/**
* Порт smtp
*
* @var int
*/
protected $iPort; protected $iPort;
/**
* Логин smtp
*
* @var string
*/
protected $sUsername; protected $sUsername;
/**
* Пароль smtp
*
* @var string
*/
protected $sPassword; protected $sPassword;
/**
* Треубется или нет авторизация на smtp
*
* @var bool
*/
protected $bSmtpAuth; protected $bSmtpAuth;
/**
* Префикс соединения к smtp - "", "ssl" или "tls"
*
* @var string
*/
protected $sSmtpSecure; protected $sSmtpSecure;
/** /**
* Метод отправки почты * Метод отправки почты
@ -51,7 +95,7 @@ class ModuleMail extends Module {
* @var int * @var int
*/ */
protected $iWordWrap=0; protected $iWordWrap=0;
/** /**
* Мыло от кого отправляется вся почта * Мыло от кого отправляется вся почта
* *
@ -64,22 +108,32 @@ class ModuleMail extends Module {
* @var string * @var string
*/ */
protected $sFromName; protected $sFromName;
/**
* Тема письма
*
* @var string
*/
protected $sSubject=''; protected $sSubject='';
/**
* Текст письма
*
* @var string
*/
protected $sBody=''; protected $sBody='';
/** /**
* Инициализация модуля * Инициализация модуля
* *
*/ */
public function Init() { public function Init() {
/** /**
* Настройки SMTP сервера для отправки писем * Настройки SMTP сервера для отправки писем
*/ */
$this->sHost = Config::Get('sys.mail.smtp.host'); $this->sHost = Config::Get('sys.mail.smtp.host');
$this->iPort = Config::Get('sys.mail.smtp.port'); $this->iPort = Config::Get('sys.mail.smtp.port');
$this->sUsername = Config::Get('sys.mail.smtp.user'); $this->sUsername = Config::Get('sys.mail.smtp.user');
$this->sPassword = Config::Get('sys.mail.smtp.password'); $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'); $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'); $this->sFromName=Config::Get('sys.mail.from_name');
/** /**
* Создаём объект phpMailer и устанвливаем ему необходимые настройки * Создаём объект phpMailer и устанвливаем ему необходимые настройки
*/ */
$this->oMailer = new phpmailer(); $this->oMailer = new phpmailer();
$this->oMailer->Host=$this->sHost; $this->oMailer->Host=$this->sHost;
$this->oMailer->Port=$this->iPort; $this->oMailer->Port=$this->iPort;
$this->oMailer->Username=$this->sUsername; $this->oMailer->Username=$this->sUsername;
$this->oMailer->Password=$this->sPassword; $this->oMailer->Password=$this->sPassword;
@ -111,50 +165,45 @@ class ModuleMail extends Module {
$this->oMailer->Mailer=$this->sMailerType; $this->oMailer->Mailer=$this->sMailerType;
$this->oMailer->WordWrap=$this->iWordWrap; $this->oMailer->WordWrap=$this->iWordWrap;
$this->oMailer->CharSet=$this->sCharSet; $this->oMailer->CharSet=$this->sCharSet;
$this->oMailer->From=$this->sFrom; $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) { public function SetSubject($sText) {
$this->sSubject=$sText; $this->sSubject=$sText;
} }
/** /**
* Устанавливает текст сообщения * Устанавливает текст сообщения
* *
* @param string $sText * @param string $sText Текст сообщения
*/ */
public function SetBody($sText) { public function SetBody($sText) {
$this->sBody=$sText; $this->sBody=$sText;
} }
/** /**
* Добавляем новый адрес получателя * Добавляем новый адрес получателя
* *
* @param string $sMail * @param string $sMail Емайл
* @param string $sName * @param string $sName Имя
*/ */
public function AddAdress($sMail,$sName=null) { public function AddAdress($sMail,$sName=null) {
$this->oMailer->AddAddress($sMail,$sName); $this->oMailer->AddAddress($sMail,$sName);
} }
/** /**
* Отправляет сообщение(мыло) * Отправляет сообщение(мыло)
* *
* @return unknown * @return bool
*/ */
public function Send() { public function Send() {
$this->oMailer->Subject=$this->sSubject; $this->oMailer->Subject=$this->sSubject;
$this->oMailer->Body=$this->sBody; $this->oMailer->Body=$this->sBody;
return $this->oMailer->Send(); return $this->oMailer->Send();
} }
/** /**
* Очищает все адреса получателей * Очищает все адреса получателей
* *
@ -162,18 +211,16 @@ class ModuleMail extends Module {
public function ClearAddresses() { public function ClearAddresses() {
$this->oMailer->ClearAddresses(); $this->oMailer->ClearAddresses();
} }
/** /**
* Устанавливает единственный адрес получателя * Устанавливает единственный адрес получателя
* *
* @param string $sMail * @param string $sMail Емайл
* @param string $sName * @param string $sName Имя
*/ */
public function SetAdress($sMail,$sName=null) { public function SetAdress($sMail,$sName=null) {
$this->ClearAddresses(); $this->ClearAddresses();
$this->oMailer->AddAddress($sMail,$sName); $this->oMailer->AddAddress($sMail,$sName);
} }
/** /**
* Устанавливает режим отправки письма как HTML * Устанавливает режим отправки письма как HTML
* *
@ -181,7 +228,6 @@ class ModuleMail extends Module {
public function setHTML() { public function setHTML() {
$this->oMailer->IsHTML(true); $this->oMailer->IsHTML(true);
} }
/** /**
* Устанавливает режим отправки письма как Text(Plain) * Устанавливает режим отправки письма как 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 { class ModuleMessage extends Module {
/** /**
@ -32,103 +38,100 @@ class ModuleMessage extends Module {
* @var array * @var array
*/ */
protected $aMsgNotice=array(); protected $aMsgNotice=array();
/** /**
* Массив сообщений, который будут показаны на СЛЕДУЮЩЕЙ страничке * Массив сообщений, который будут показаны на СЛЕДУЮЩЕЙ страничке
*
* @var array * @var array
*/ */
protected $aMsgNoticeSession=array(); protected $aMsgNoticeSession=array();
/** /**
* Массив ошибок, который будут показаны на СЛЕДУЮЩЕЙ страничке * Массив ошибок, который будут показаны на СЛЕДУЮЩЕЙ страничке
*
* @var array * @var array
*/ */
protected $aMsgErrorSession=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)) { if(is_array($aNoticeSession) and count($aNoticeSession)) {
$this->aMsgNotice = $aNoticeSession; $this->aMsgNotice = $aNoticeSession;
} }
$aErrorSession = $this->Session_Get('message_error_session'); $aErrorSession = $this->Session_Get('message_error_session');
if(is_array($aErrorSession) and count($aErrorSession)) { if(is_array($aErrorSession) and count($aErrorSession)) {
$this->aMsgError = $aErrorSession; $this->aMsgError = $aErrorSession;
} }
} }
/** /**
* При завершении работы модуля передаем списки сообщений в шаблоны Smarty * При завершении работы модуля передаем списки сообщений в шаблоны Smarty
* *
*/ */
public function Shutdown() { public function Shutdown() {
/** /**
* Добавляем в сессию те соощения, которые были отмечены для сессионого использования * Добавляем в сессию те соощения, которые были отмечены для сессионого использования
*/ */
$this->Session_Set('message_notice_session', $this->GetNoticeSession()); $this->Session_Set('message_notice_session', $this->GetNoticeSession());
$this->Session_Set('message_error_session', $this->GetErrorSession()); $this->Session_Set('message_error_session', $this->GetErrorSession());
$this->Viewer_Assign('aMsgError',$this->GetError()); $this->Viewer_Assign('aMsgError',$this->GetError());
$this->Viewer_Assign('aMsgNotice',$this->GetNotice()); $this->Viewer_Assign('aMsgNotice',$this->GetNotice());
} }
/** /**
* Добавляет новое сообщение об ошибке * Добавляет новое сообщение об ошибке
* *
* @param string $sMsg * @param string $sMsg Сообщение
* @param string $sTitle * @param string $sTitle Заголовок
* @param bool $bUseSession * @param bool $bUseSession Показать сообщение при следующем обращии пользователя к сайту
*/ */
public function AddError($sMsg,$sTitle=null,$bUseSession=false) { public function AddError($sMsg,$sTitle=null,$bUseSession=false) {
if(!$bUseSession) { if(!$bUseSession) {
$this->aMsgError[]=array('msg'=>$sMsg,'title'=>$sTitle); $this->aMsgError[]=array('msg'=>$sMsg,'title'=>$sTitle);
} else { } else {
$this->aMsgErrorSession[]=array('msg'=>$sMsg,'title'=>$sTitle); $this->aMsgErrorSession[]=array('msg'=>$sMsg,'title'=>$sTitle);
} }
} }
/** /**
* Создаёт идинственное сообщение об ошибке(т.е. очищает все предыдущие) * Создаёт идинственное сообщение об ошибке(т.е. очищает все предыдущие)
* *
* @param string $sMsg * @param string $sMsg Сообщение
* @param string $sTitle * @param string $sTitle Заголовок
* @param bool $bUseSession * @param bool $bUseSession Показать сообщение при следующем обращии пользователя к сайту
*/ */
public function AddErrorSingle($sMsg,$sTitle=null,$bUseSession=false) { public function AddErrorSingle($sMsg,$sTitle=null,$bUseSession=false) {
$this->ClearError(); $this->ClearError();
$this->AddError($sMsg,$sTitle,$bUseSession); $this->AddError($sMsg,$sTitle,$bUseSession);
} }
/** /**
* Добавляет новое сообщение * Добавляет новое сообщение
* *
* @param string $sMsg * @param string $sMsg Сообщение
* @param string $sTitle * @param string $sTitle Заголовок
* @param bool $bUseSession * @param bool $bUseSession Показать сообщение при следующем обращии пользователя к сайту
*/ */
public function AddNotice($sMsg,$sTitle=null,$bUseSession=false) { public function AddNotice($sMsg,$sTitle=null,$bUseSession=false) {
if(!$bUseSession) { if(!$bUseSession) {
$this->aMsgNotice[]=array('msg'=>$sMsg,'title'=>$sTitle); $this->aMsgNotice[]=array('msg'=>$sMsg,'title'=>$sTitle);
} else { } else {
$this->aMsgNoticeSession[]=array('msg'=>$sMsg,'title'=>$sTitle); $this->aMsgNoticeSession[]=array('msg'=>$sMsg,'title'=>$sTitle);
} }
} }
/** /**
* Создаёт идинственное сообщение, удаляя предыдущие * Создаёт идинственное сообщение, удаляя предыдущие
* *
* @param string $sMsg * @param string $sMsg Сообщение
* @param string $sTitle * @param string $sTitle Заголовок
* @param bool $bUseSession * @param bool $bUseSession Показать сообщение при следующем обращии пользователя к сайту
*/ */
public function AddNoticeSingle($sMsg,$sTitle=null,$bUseSession=false) { public function AddNoticeSingle($sMsg,$sTitle=null,$bUseSession=false) {
$this->ClearNotice(); $this->ClearNotice();
$this->AddNotice($sMsg,$sTitle,$bUseSession); $this->AddNotice($sMsg,$sTitle,$bUseSession);
} }
/** /**
* Очищает стек сообщений * Очищает стек сообщений
* *
@ -137,7 +140,6 @@ class ModuleMessage extends Module {
$this->aMsgNotice=array(); $this->aMsgNotice=array();
$this->aMsgNoticeSession=array(); $this->aMsgNoticeSession=array();
} }
/** /**
* Очищает стек ошибок * Очищает стек ошибок
* *
@ -146,7 +148,6 @@ class ModuleMessage extends Module {
$this->aMsgError=array(); $this->aMsgError=array();
$this->aMsgErrorSession=array(); $this->aMsgErrorSession=array();
} }
/** /**
* Получает список сообщений об ошибке * Получает список сообщений об ошибке
* *
@ -155,7 +156,6 @@ class ModuleMessage extends Module {
public function GetError() { public function GetError() {
return $this->aMsgError; return $this->aMsgError;
} }
/** /**
* Получает список сообщений * Получает список сообщений
* *
@ -164,25 +164,23 @@ class ModuleMessage extends Module {
public function GetNotice() { public function GetNotice() {
return $this->aMsgNotice; return $this->aMsgNotice;
} }
/** /**
* Возвращает список сообщений, * Возвращает список сообщений,
* которые необходимо поместить в сессию * которые необходимо поместить в сессию
* *
* @return array * @return array
*/ */
public function GetNoticeSession() { public function GetNoticeSession() {
return $this->aMsgNoticeSession; return $this->aMsgNoticeSession;
} }
/** /**
* Возвращает список ошибок, * Возвращает список ошибок,
* которые необходимо поместить в сессию * которые необходимо поместить в сессию
* *
* @return array * @return array
*/ */
public function GetErrorSession() { 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 { class ModulePlugin extends Module {
/** /**
@ -32,16 +34,15 @@ class ModulePlugin extends Module {
* @var string * @var string
*/ */
protected $sPluginsDir; protected $sPluginsDir;
/** /**
* Список плагинов * Список плагинов
* *
* @var unknown_type * @var array
*/ */
protected $aPluginsList=array(); protected $aPluginsList=array();
/** /**
* Список engine-rewrite`ов (модули, экшены, сущности, шаблоны) * Список engine-rewrite`ов (модули, экшены, сущности, шаблоны)
* Определяет типы объектов, которые может переопределить/унаследовать плагин
* *
* @var array * @var array
*/ */
@ -53,7 +54,6 @@ class ModulePlugin extends Module {
'template' => array(), 'template' => array(),
'block' => array(), 'block' => array(),
); );
/** /**
* Стек наследований * Стек наследований
* *
@ -68,7 +68,6 @@ class ModulePlugin extends Module {
public function Init() { public function Init() {
$this->sPluginsDir=Config::Get('path.root.server').'/plugins/'; $this->sPluginsDir=Config::Get('path.root.server').'/plugins/';
} }
/** /**
* Получает список информации о всех плагинах, загруженных в plugin-директорию * Получает список информации о всех плагинах, загруженных в plugin-директорию
* *
@ -122,13 +121,12 @@ class ModulePlugin extends Module {
} }
return $this->aPluginsList; return $this->aPluginsList;
} }
/** /**
* Получает значение параметра из XML на основе языковой разметки * Получает значение параметра из XML на основе языковой разметки
* *
* @param SimpleXMLElement $oXml * @param SimpleXMLElement $oXml XML узел
* @param string $sProperty * @param string $sProperty Свойство, которое нужно вернуть
* @param string $sLang * @param string $sLang Название языка
*/ */
protected function Xlang($oXml,$sProperty,$sLang) { protected function Xlang($oXml,$sProperty,$sLang) {
$sProperty=trim($sProperty); $sProperty=trim($sProperty);
@ -138,7 +136,13 @@ class ModulePlugin extends Module {
} }
$oXml->$sProperty->data=$this->Text_Parser(trim((string)array_shift($data))); $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) { public function Toggle($sPlugin,$sAction) {
$aPlugins=$this->GetList(); $aPlugins=$this->GetList();
if(!isset($aPlugins[$sPlugin])) return null; if(!isset($aPlugins[$sPlugin])) return null;
@ -309,7 +313,6 @@ class ModulePlugin extends Module {
return null; return null;
} }
} }
/** /**
* Возвращает список активированных плагинов в системе * Возвращает список активированных плагинов в системе
* *
@ -324,16 +327,15 @@ class ModulePlugin extends Module {
return $aPlugins; return $aPlugins;
} }
/** /**
* Записывает список активных плагинов в файл PLUGINS.DAT * Записывает список активных плагинов в файл PLUGINS.DAT
* *
* @param array|string $aPlugins * @param array|string $aPlugins Список плагинов
* @return bool
*/ */
public function SetActivePlugins($aPlugins) { public function SetActivePlugins($aPlugins) {
if(!is_array($aPlugins)) $aPlugins = array($aPlugins); if(!is_array($aPlugins)) $aPlugins = array($aPlugins);
$aPlugins=array_unique(array_map('trim',$aPlugins)); $aPlugins=array_unique(array_map('trim',$aPlugins));
/** /**
* Записываем данные в файл PLUGINS.DAT * Записываем данные в файл PLUGINS.DAT
*/ */
@ -342,11 +344,10 @@ class ModulePlugin extends Module {
} }
return false; return false;
} }
/** /**
* Удаляет плагины с сервера * Удаляет плагины с сервера
* *
* @param array $aPlugins * @param array $aPlugins Список плагинов для удаления
*/ */
public function Delete($aPlugins) { public function Delete($aPlugins) {
if(!is_array($aPlugins)) $aPlugins=array($aPlugins); if(!is_array($aPlugins)) $aPlugins=array($aPlugins);
@ -364,7 +365,6 @@ class ModulePlugin extends Module {
func_rmdir($this->sPluginsDir.$sPluginCode); func_rmdir($this->sPluginsDir.$sPluginCode);
} }
} }
/** /**
* Перенаправление вызовов на модули, экшены, сущности * Перенаправление вызовов на модули, экшены, сущности
* *
@ -385,7 +385,6 @@ class ModulePlugin extends Module {
'sign'=>$sSign 'sign'=>$sSign
); );
} }
/** /**
* Добавляет в стек наследника класса * Добавляет в стек наследника класса
* *
@ -403,13 +402,12 @@ class ModulePlugin extends Module {
); );
$this->aInherits[trim($sFrom)]['position']=count($this->aInherits[trim($sFrom)]['items'])-1; $this->aInherits[trim($sFrom)]['position']=count($this->aInherits[trim($sFrom)]['items'])-1;
} }
/** /**
* Получает следующего родителя у наследника. * Получает следующего родителя у наследника.
* ВНИМАНИЕ! Данный метод нужно вызвать только из __autoload() * ВНИМАНИЕ! Данный метод нужно вызвать только из __autoload()
* *
* @param unknown_type $sFrom * @param string $sFrom
* @return unknown * @return string
*/ */
public function GetParentInherit($sFrom) { public function GetParentInherit($sFrom) {
if (!isset($this->aInherits[$sFrom]['items']) or count($this->aInherits[$sFrom]['items'])<=1 or $this->aInherits[$sFrom]['position']<1) { 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']--; $this->aInherits[$sFrom]['position']--;
return $this->aInherits[$sFrom]['items'][$this->aInherits[$sFrom]['position']]['inherit']; return $this->aInherits[$sFrom]['items'][$this->aInherits[$sFrom]['position']]['inherit'];
} }
/**
* Возвращает список наследуемых классов
*
* @param string $sFrom
* @return null|array
*/
public function GetInherits($sFrom) { public function GetInherits($sFrom) {
if (isset($this->aInherits[trim($sFrom)])) { if (isset($this->aInherits[trim($sFrom)])) {
return $this->aInherits[trim($sFrom)]['items']; return $this->aInherits[trim($sFrom)]['items'];
} }
return null; return null;
} }
/**
* Возвращает последнего наследника в цепочке
*
* @param $sFrom
* @return null|string
*/
public function GetLastInherit($sFrom) { public function GetLastInherit($sFrom) {
if (isset($this->aInherits[trim($sFrom)])) { if (isset($this->aInherits[trim($sFrom)])) {
return $this->aInherits[trim($sFrom)]['items'][count($this->aInherits[trim($sFrom)]['items'])-1]; return $this->aInherits[trim($sFrom)]['items'][count($this->aInherits[trim($sFrom)]['items'])-1];
@ -448,7 +456,11 @@ class ModulePlugin extends Module {
} }
return $sFrom; return $sFrom;
} }
/**
* @param string $sType
* @param string $sFrom
* @return array|null
*/
public function GetDelegates($sType,$sFrom) { public function GetDelegates($sType,$sFrom) {
if (isset($this->aDelegates[$sType][$sFrom]['delegate'])) { if (isset($this->aDelegates[$sType][$sFrom]['delegate'])) {
return array($this->aDelegates[$sType][$sFrom]['delegate']); return array($this->aDelegates[$sType][$sFrom]['delegate']);
@ -457,12 +469,24 @@ class ModulePlugin extends Module {
} }
return null; return null;
} }
/**
* Возвращает цепочку делегатов
*
* @param string $sType
* @param string $sTo
* @return array
*/
public function GetDelegationChain($sType,$sTo) { public function GetDelegationChain($sType,$sTo) {
$sRootDelegater = $this->GetRootDelegater($sType,$sTo); $sRootDelegater = $this->GetRootDelegater($sType,$sTo);
return $this->collectAllDelegatesRecursive($sType,array($sRootDelegater)); return $this->collectAllDelegatesRecursive($sType,array($sRootDelegater));
} }
/**
* Возвращает делегируемый класс
*
* @param string $sType
* @param string $sTo
* @return string
*/
public function GetRootDelegater($sType,$sTo) { public function GetRootDelegater($sType,$sTo) {
$sItem = $sTo; $sItem = $sTo;
$sItemDelegater = $this->GetDelegater($sType,$sTo); $sItemDelegater = $this->GetDelegater($sType,$sTo);
@ -475,7 +499,13 @@ class ModulePlugin extends Module {
} }
return $sRootDelegater; return $sRootDelegater;
} }
/**
* Составляет цепочку делегатов
*
* @param string $sType
* @param string $aDelegates
* @return array
*/
public function collectAllDelegatesRecursive($sType,$aDelegates) { public function collectAllDelegatesRecursive($sType,$aDelegates) {
foreach($aDelegates as $sClass) { foreach($aDelegates as $sClass) {
if($aNewDelegates=$this->GetDelegates($sType,$sClass)) { if($aNewDelegates=$this->GetDelegates($sType,$sClass)) {
@ -484,7 +514,6 @@ class ModulePlugin extends Module {
} }
return $aDelegates; return $aDelegates;
} }
/** /**
* Возвращает делегирующий объект по имени делегата * Возвращает делегирующий объект по имени делегата
* *
@ -511,7 +540,6 @@ class ModulePlugin extends Module {
} }
return $sTo; return $sTo;
} }
/** /**
* Возвращает подпись делегата модуля, экшена, сущности. * Возвращает подпись делегата модуля, экшена, сущности.
* *
@ -528,7 +556,6 @@ class ModulePlugin extends Module {
} }
return null; return null;
} }
/** /**
* Возвращает true, если установлено правило делегирования * Возвращает true, если установлено правило делегирования
* и класс является базовым в данном правиле * и класс является базовым в данном правиле
@ -545,7 +572,6 @@ class ModulePlugin extends Module {
} }
return false; return false;
} }
/** /**
* Возвращает true, если устано * Возвращает true, если устано
* *
@ -555,7 +581,7 @@ class ModulePlugin extends Module {
*/ */
public function isDelegated($sType,$sTo) { public function isDelegated($sType,$sTo) {
/** /**
* Фильтруем меппер делегатов/наследников * Фильтруем маппер делегатов/наследников
* @var array * @var array
*/ */
$aDelegateMapper=array_filter( $aDelegateMapper=array_filter(
@ -576,7 +602,6 @@ class ModulePlugin extends Module {
} }
return false; return false;
} }
/** /**
* Возвращает список объектов, доступных для делегирования * Возвращает список объектов, доступных для делегирования
* *
@ -585,12 +610,5 @@ class ModulePlugin extends Module {
public function GetDelegateObjectList() { public function GetDelegateObjectList() {
return array_keys($this->aDelegates); 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 { class ModuleSecurity extends Module {
/** /**
@ -25,23 +35,28 @@ class ModuleSecurity extends Module {
* *
*/ */
public function Init() { public function Init() {
} }
/**
* Производит валидацию отправки формы/запроса от пользователя, позволяет избежать атаки CSRF
*/
public function ValidateSendForm() { public function ValidateSendForm() {
if (!($this->ValidateSessionKey() && 1)) { if (!($this->ValidateSessionKey())) {
die("Hacking attemp!"); die("Hacking attemp!");
} }
} }
/**
* Проверка на соотвествие реферала
*
* @return bool
*/
public function ValidateReferal() { public function ValidateReferal() {
if (isset($_SERVER['HTTP_REFERER'])) { 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) { if (strcasecmp($aUrl['host'],$_SERVER['HTTP_HOST'])==0) {
return true; return true;
} elseif (preg_match("/\.".quotemeta($_SERVER['HTTP_HOST'])."$/i",$aUrl['host'])) { } elseif (preg_match("/\.".quotemeta($_SERVER['HTTP_HOST'])."$/i",$aUrl['host'])) {
return true; return true;
} }
} }
return false; return false;
@ -49,6 +64,7 @@ class ModuleSecurity extends Module {
/** /**
* Проверяет наличие security-ключа в сессии * Проверяет наличие security-ключа в сессии
* *
* @param null|string $sCode Код для проверки, если нет то берется из реквеста
* @return bool * @return bool
*/ */
public function ValidateSessionKey($sCode=null) { public function ValidateSessionKey($sCode=null) {
@ -63,7 +79,7 @@ class ModuleSecurity extends Module {
public function SetSessionKey() { public function SetSessionKey() {
$sCode = $this->GenerateSessionKey(); $sCode = $this->GenerateSessionKey();
$this->Viewer_Assign('LIVESTREET_SECURITY_KEY',$sCode); $this->Viewer_Assign('LIVESTREET_SECURITY_KEY',$sCode);
return $sCode; return $sCode;
} }
/** /**
@ -74,9 +90,11 @@ class ModuleSecurity extends Module {
protected function GenerateSessionKey() { protected function GenerateSessionKey() {
return md5($this->Session_GetId().Config::Get('module.security.hash')); return md5($this->Session_GetId().Config::Get('module.security.hash'));
} }
/**
* Завершение модуля
*/
public function Shutdown() { public function Shutdown() {
$this->SetSessionKey(); $this->SetSessionKey();
} }
} }
?> ?>

View file

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

View file

@ -19,7 +19,14 @@ require_once(Config::Get('path.root.engine').'/lib/external/Jevix/jevix.class.ph
/** /**
* Модуль обработки текста на основе типографа Jevix * Модуль обработки текста на основе типографа Jevix
* Позволяет вырезать из текста лишние HTML теги и предотвращает различные попытки внедрить в текст JavaScript
* <pre>
* $sText=$this->Text_Parser($sTestSource);
* </pre>
* Настройки парсинга находятся в конфиге /config/jevix.php
* *
* @package engine.modules
* @since 1.0
*/ */
class ModuleText extends Module { class ModuleText extends Module {
/** /**
@ -27,20 +34,19 @@ class ModuleText extends Module {
* *
* @var Jevix * @var Jevix
*/ */
protected $oJevix; protected $oJevix;
/** /**
* Инициализация модуля * Инициализация модуля
* *
*/ */
public function Init() { public function Init() {
/** /**
* Создаем объект типографа и запускаем его конфигурацию * Создаем объект типографа и запускаем его конфигурацию
*/ */
$this->oJevix = new Jevix(); $this->oJevix = new Jevix();
$this->JevixConfig(); $this->JevixConfig();
} }
/** /**
* Конфигурирует типограф * Конфигурирует типограф
* *
@ -49,12 +55,11 @@ class ModuleText extends Module {
// загружаем конфиг // загружаем конфиг
$this->LoadJevixConfig(); $this->LoadJevixConfig();
} }
/** /**
* Загружает конфиг Jevix'а * Загружает конфиг Jevix'а
* *
* @param string $sType Тип конфига * @param string $sType Тип конфига
* @param bool $bClear * @param bool $bClear Очищать предыдущий конфиг или нет
*/ */
public function LoadJevixConfig($sType='default',$bClear=true) { public function LoadJevixConfig($sType='default',$bClear=true) {
if ($bClear) { if ($bClear) {
@ -81,11 +86,10 @@ class ModuleText extends Module {
} }
} }
} }
/** /**
* Возвращает объект Jevix * Возвращает объект Jevix
* *
* @return unknown * @return Jevix
*/ */
public function GetJevix() { public function GetJevix() {
return $this->oJevix; return $this->oJevix;
@ -93,8 +97,8 @@ class ModuleText extends Module {
/** /**
* Парсинг текста с помощью Jevix * Парсинг текста с помощью Jevix
* *
* @param string $sText * @param string $sText Исходный текст
* @param array $aError * @param array $aError Возвращает список возникших ошибок
* @return string * @return string
*/ */
public function JevixParser($sText,&$aError=null) { public function JevixParser($sText,&$aError=null) {
@ -105,57 +109,59 @@ class ModuleText extends Module {
$sResult=$this->oJevix->parse($sText,$aError); $sResult=$this->oJevix->parse($sText,$aError);
return $sResult; return $sResult;
} }
/** /**
* Парсинг текста на предмет видео * Парсинг текста на предмет видео
* Находит теги <pre><video></video></pre> и реобразовываетих в видео
* *
* @param string $sText * @param string $sText Исходный текст
* @return string * @return string
*/ */
public function VideoParser($sText) { public function VideoParser($sText) {
/** /**
* youtube.com * 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 * 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; return $sText;
} }
/** /**
* Парсит текст * Парсит текст, применя все парсеры
* *
* @param string $sText * @param string $sText Исходный текст
* @return string
*/ */
public function Parser($sText) { public function Parser($sText) {
$sResult=$this->FlashParamParser($sText); $sResult=$this->FlashParamParser($sText);
$sResult=$this->JevixParser($sResult); $sResult=$this->JevixParser($sResult);
$sResult=$this->VideoParser($sResult); $sResult=$this->VideoParser($sResult);
$sResult=$this->CodeSourceParser($sResult); $sResult=$this->CodeSourceParser($sResult);
return $sResult; return $sResult;
} }
/** /**
* Заменяет все вхождения короткого тега <param/> на длиную версию <param></param> * Заменяет все вхождения короткого тега <param/> на длиную версию <param></param>
* Заменяет все вхождения короткого тега <embed/> на длиную версию <embed></embed> * Заменяет все вхождения короткого тега <embed/> на длиную версию <embed></embed>
* *
* @param string $sText Исходный текст
* @return string
*/ */
protected function FlashParamParser($sText) { protected function FlashParamParser($sText) {
if (preg_match_all("@(<\s*param\s*name\s*=\s*(?:\"|').*(?:\"|')\s*value\s*=\s*(?:\"|').*(?:\"|'))\s*/?\s*>(?!</param>)@Ui",$sText,$aMatch)) { 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) { foreach ($aMatch[1] as $key => $str) {
$str_new=$str.'></param>'; $str_new=$str.'></param>';
$sText=str_replace($aMatch[0][$key],$str_new,$sText); $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) { foreach ($aMatch[1] as $key => $str) {
$str_new=$str.'></embed>'; $str_new=$str.'></embed>';
$sText=str_replace($aMatch[0][$key],$str_new,$sText); $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)) { if (preg_match_all("@(<param\s.*name=(?:\"|')wmode(?:\"|').*>\s*</param>)@Ui",$sText,$aMatch)) {
foreach ($aMatch[1] as $key => $str) { 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); $sText=str_replace($aMatch[0][$key],$aMatch[0][$key].'<param name="wmode" value="opaque"></param>',$sText);
} }
} }
return $sText; return $sText;
} }
/**
* Подсветка исходного кода
*
* @param string $sText Исходный текст
* @return mixed
*/
public function CodeSourceParser($sText) { public function CodeSourceParser($sText) {
$sText=str_replace("<code>",'<pre class="prettyprint"><code>',$sText); $sText=str_replace("<code>",'<pre class="prettyprint"><code>',$sText);
$sText=str_replace("</code>",'</code></pre>',$sText); $sText=str_replace("</code>",'</code></pre>',$sText);
return $sText; return $sText;
} }
/** /**
* Производить резрезание текста по тегу <cut>. * Производить резрезание текста по тегу cut.
* Возвращаем массив вида: * Возвращаем массив вида:
* <pre>
* array( * array(
* $sTextShort - текст до тега <cut> * $sTextShort - текст до тега <cut>
* $sTextNew - весь текст за исключением удаленного тега * $sTextNew - весь текст за исключением удаленного тега
* $sTextCut - именованное значение <cut> * $sTextCut - именованное значение <cut>
* ) * )
* </pre>
* *
* @param string $sText * @param string $sText Исходный текст
* @return array * @return array
*/ */
public function Cut($sText) { public function Cut($sText) {
$sTextShort = $sText; $sTextShort = $sText;
$sTextNew = $sText; $sTextNew = $sText;
$sTextCut = null; $sTextCut = null;
$sTextTemp=str_replace("\r\n",'[<rn>]',$sText); $sTextTemp=str_replace("\r\n",'[<rn>]',$sText);
$sTextTemp=str_replace("\n",'[<n>]',$sTextTemp); $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('[<rn>]',"\r\n",$aMatch[1]);
$aMatch[1]=str_replace('[<n>]',"\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('[<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]; $sTextShort=$aMatch[1];
$sTextNew=$aMatch[1].' <a name="cut"></a> '.$aMatch[3]; $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]); $sTextCut=trim($aMatchCut[1]);
} }
} }
return array($sTextShort,$sTextNew,$sTextCut ? htmlspecialchars($sTextCut) : null); return array($sTextShort,$sTextNew,$sTextCut ? htmlspecialchars($sTextCut) : null);
} }
/** /**
* Обработка тега <ls> в тексте * Обработка тега ls в тексте
* <pre>
* <ls user="admin" />
* </pre>
* *
* @param unknown_type $sTag * @param string $sTag Тег на ктором сработал колбэк
* @param unknown_type $aParams * @param array $aParams Список параметров тега
* @return unknown * @return string
*/ */
public function CallbackTagLs($sTag,$aParams) { public function CallbackTagLs($sTag,$aParams) {
$sText=''; $sText='';