1
0
Fork 0
mirror of https://github.com/Oreolek/ifhub.club.git synced 2024-06-29 04:55:02 +03:00
ifhub.club/engine/modules/viewer/Viewer.class.php

539 lines
15 KiB
PHP
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

<?php
/*-------------------------------------------------------
*
* LiveStreet Engine Social Networking
* Copyright © 2008 Mzhelskiy Maxim
*
*--------------------------------------------------------
*
* Official site: www.livestreet.ru
* Contact e-mail: rus.engine@gmail.com
*
* GNU General Public License, version 2:
* http://www.gnu.org/licenses/old-licenses/gpl-2.0.html
*
---------------------------------------------------------
*/
require_once(Config::Get('path.root.engine').'/lib/external/Smarty-2.6.19/libs/Smarty.class.php');
/**
* Модуль обработки шаблонов используя шаблонизатор Smarty
*
*/
class LsViewer extends Module {
/**
* Объект Smarty
*
* @var Smarty
*/
protected $oSmarty;
/**
* Коллекция(массив) блоков
*
* @var array
*/
protected $aBlocks=array();
/**
* Массив правил организации блоков
*
* @var array
*/
protected $_aBlockRules = array();
/**
* Заголовок HTML страницы
*
* @var unknown_type
*/
protected $sHtmlTitle;
/**
* SEO ключевые слова страницы
*
* @var unknown_type
*/
protected $sHtmlKeywords;
/**
* SEO описание страницы
*
* @var unknown_type
*/
protected $sHtmlDescription;
/**
* Разделитель заголовка HTML страницы
*
* @var unknown_type
*/
protected $sHtmlTitleSeparation=' / ';
/**
* Альтернативный адрес страницы по RSS
*
* @var array
*/
protected $aHtmlRssAlternate=null;
/**
* Переменные для отдачи при ajax запросе
*
* @var unknown_type
*/
protected $aVarsAjax=array();
/**
* Определяет тип ответа при ajax запросе
*
* @var unknown_type
*/
protected $sResponseAjax=null;
/**
* Инициализация модуля
*
*/
public function Init() {
/**
* Заголовок HTML страницы
*/
$this->sHtmlTitle=Config::Get('view.name');
/**
* SEO ключевые слова страницы
*/
$this->sHtmlKeywords=Config::Get('view.keywords');
/**
* SEO описание страницы
*/
$this->sHtmlDescription=Config::Get('view.description');
/**
* Создаём объект Smarty и устанавливаем необходиму параметры
*/
$this->oSmarty = new Smarty();
$this->oSmarty->template_dir=Config::Get('path.smarty.template');
$this->oSmarty->compile_dir=Config::Get('path.smarty.compiled');
$this->oSmarty->cache_dir=Config::Get('path.smarty.cache');
$this->oSmarty->plugins_dir=array(Config::Get('path.smarty.plug'),'plugins');
/**
* Подключаем к Smarty небольшой плагинчик форматирования даты
*/
$this->oSmarty->register_function("date_format", "func_date_smarty");
/**
* Получаем настройки блоков
*/
$this->_InitBlockParams();
}
/**
* Выполняет загрузку необходимый(возможно даже системный :)) переменных в шалон
*
*/
public function VarAssign() {
/**
* Загружаем весь $_REQUEST, предварительно обработав его функцией func_htmlspecialchars()
*/
$aRequest=$_REQUEST;
func_htmlspecialchars($aRequest);
$this->Assign("_aRequest",$aRequest);
/**
* Параметры стандартной сессии
*/
$this->Assign("_sPhpSessionName",session_name());
$this->Assign("_sPhpSessionId",session_id());
/**
* Загружаем часть конфигурации
*/
$aConfig=Config::Get();
foreach ((array)Config::Get('view.no_assign') as $sGroup) {
unset($aConfig[$sGroup]);
}
$this->Assign("aConfig",$aConfig);
/**
* Загружаем роутинг с учетом правил rewrite
*/
$aRouter=array();
foreach ($aConfig['router']['page'] as $sPage=>$aAction) {
$aRouter[$sPage]=Router::GetPath($sPage);
}
$this->Assign("aRouter",$aRouter);
$this->Assign("aBlocks",$this->aBlocks);
/**
* Загружаем HTML заголовки
*/
$this->Assign("sHtmlTitle",htmlspecialchars($this->sHtmlTitle));
$this->Assign("sHtmlKeywords",htmlspecialchars($this->sHtmlKeywords));
$this->Assign("sHtmlDescription",htmlspecialchars($this->sHtmlDescription));
$this->Assign("aHtmlRssAlternate",$this->aHtmlRssAlternate);
}
/**
* Выводит на экран(браузер) обработанный шаблон
*
* @param string $sTemplate
*/
public function Display($sTemplate) {
if ($this->sResponseAjax) {
$this->DisplayAjax($this->sResponseAjax);
}
/**
* Если шаблон найден то выводим, иначе ошибка
*/
if ($this->TemplateExists($sTemplate)) {
$this->oSmarty->display($sTemplate);
} else {
throw new Exception($this->Lang_Get('system_error_template').': '.$sTemplate);
}
}
/**
* Ответ на ajax запрос
*
* @param unknown_type $sType - jsHttpRequest или json
*/
public function DisplayAjax($sType='jsHttpRequest') {
/**
* Загружаем статус ответа и сообщение
*/
$bStateError=false;
$sMsgTitle='';
$sMsg='';
$aMsgError=$this->Message_GetError();
$aMsgNotice=$this->Message_GetNotice();
if (count($aMsgError)>0) {
$bStateError=true;
$sMsgTitle=$aMsgError[0]['title'];
$sMsg=$aMsgError[0]['msg'];
}
if (count($aMsgNotice)>0) {
$sMsgTitle=$aMsgNotice[0]['title'];
$sMsg=$aMsgNotice[0]['msg'];
}
$this->AssignAjax('sMsgTitle',$sMsgTitle);
$this->AssignAjax('sMsg',$sMsg);
$this->AssignAjax('bStateError',$bStateError);
if ($sType=='jsHttpRequest') {
foreach ($this->aVarsAjax as $key => $value) {
$GLOBALS['_RESULT'][$key]=$value;
}
} elseif ($sType=='json') {
if (!headers_sent()) {
header('Content-type: application/json');
}
echo json_encode($this->aVarsAjax);
}
exit();
}
/**
* Устанавливает тип отдачи при ajax запросе, если null то выполняется обычный вывод шаблона в браузер
*
* @param unknown_type $sResponseAjax
*/
public function SetResponseAjax($sResponseAjax='jsHttpRequest') {
/**
* Проверка на безопасную обработку ajax запроса
*/
if ($sResponseAjax) {
if ($sResponseAjax=='jsHttpRequest') {
require_once(Config::Get('path.root.engine')."/lib/external/JsHttpRequest/JsHttpRequest.php");
$JsHttpRequest = new JsHttpRequest("UTF-8");
}
$this->Security_ValidateSendForm();
}
$this->sResponseAjax=$sResponseAjax;
}
/**
* Загружает переменную в шаблон
*
* @param string $sName
* @param unknown_type $value
*/
public function Assign($sName,$value) {
$this->oSmarty->assign($sName, $value);
}
/**
* Загружаем переменную в ajax ответ
*
* @param unknown_type $sName
* @param unknown_type $value
*/
public function AssignAjax($sName,$value) {
$this->aVarsAjax[$sName]=$value;
}
/**
* Возвращает обработанный шаблон
*
* @param string $sTemplate
* @return string
*/
public function Fetch($sTemplate) {
return $this->oSmarty->fetch($sTemplate);
}
/**
* Проверяет существование шаблона
*
* @param string $sTemplate
* @return bool
*/
public function TemplateExists($sTemplate) {
return $this->oSmarty->template_exists($sTemplate);
}
/**
* Инициализируем параметры отображения блоков
*/
protected function _InitBlockParams() {
$this->_aBlockRules = Config::Get('block');
}
/**
* Добавляет блок для отображения
*
* @param string $sName
* @param arra $aParams - параметры блока, которые будут переданы обработчику блока
*/
public function AddBlock($sGroup,$sName,$aParams=array()) {
/**
* Если смогли определить тип блока то добавляем его
*/
$sType=$this->DefineTypeBlock($sName);
if ($sType=='undefined') {
return false;
}
$this->aBlocks[$sGroup][$sName]=array(
'type' => $sType,
'name' => $sName,
'params' => $aParams,
);
return true;
}
/**
* Добавляет список блоков
*
* @param array $aBlocks
*/
public function AddBlocks($sGroup,$aBlocks) {
/**
* Удаляем ранее добавленые блоки
*/
$this->ClearBlocks($sGroup);
foreach ($aBlocks as $sBlock) {
$this->AddBlock($sGroup,$sBlock);
}
}
/**
* Удаляет блоки группы
*
*/
public function ClearBlocks($sGroup) {
$this->aBlocks[$sGroup]=array();
}
/**
* Удаляет блоки всех групп
*
* @param unknown_type $sGroup
*/
public function ClearBlocksAll() {
foreach ($this->aBlocks as $sGroup => $aBlock) {
$this->aBlocks[$sGroup]=array();
}
}
/**
* Определяет тип блока
*
* @param string $sName
* @return string('block','template','undefined')
*/
protected function DefineTypeBlock($sName) {
if ($this->TemplateExists('block.'.$sName.'.tpl')) {
/**
* Если найден шаблон вида block.name.tpl то считаем что тип 'block'
*/
return 'block';
} elseif ($this->TemplateExists($sName)) {
/**
* Если найден шаблон по имени блока то считаем его простым шаблоном
*/
return 'template';
} else {
/**
* Считаем что тип не определен
*/
throw new Exception($this->Lang_Get('system_error_template_block').': '.$sName);
return 'undefined';
}
}
/**
* Анализируем правила и наборы массивов
* получаем окончательные списки блоков
*/
protected function _BuildBlocks() {
$sAction = strtolower(Router::GetAction());
$sEvent = strtolower(Router::GetActionEvent());
foreach($this->_aBlockRules as $sName => $aRule) {
$bUse=false;
/**
* Если в правиле не указан список блоков, нам такое не нужно
*/
if(!array_key_exists('blocks',$aRule)) continue;
/**
* Если не задан action для исполнения,
* или текущий не входит в перечисленные в правиле
* то выбираем следующее правило
*/
if(!$aRule['action']) continue;
if(in_array($sAction, (array)$aRule['action'])) $bUse=true;
if(array_key_exists($sAction,(array)$aRule['action'])) {
/**
* Если задан список event`ов и текущий в него не входит,
* переходи к следующему действию. Если список не задан,
* считаем что правило действует для всех event`ов.
*/
if(!$sEvent
|| in_array($sEvent,(array)$aRule['event'][$sAction]))
$bUse=true;
}
if($bUse){
/**
* Добавляем все блоки, указанные в параметре blocks
*/
foreach ($aRule['blocks'] as $sGroup => $aBlocks) {
foreach ((array)$aBlocks as $sName=>$aParams) {
/**
* Если $aParams не являются массивом, значит передано только имя блока
*/
if(!is_array($aParams)) {
$this->AddBlock($sGroup,$aParams);
} else {
$this->AddBlock($sGroup,$sName,$aParams);
}
}
}
}
}
return true;
}
/**
* Устанавливаем заголовок страницы(тег <title>)
*
* @param string $sText
*/
public function SetHtmlTitle($sText) {
$this->sHtmlTitle=$sText;
}
/**
* Добавляет часть заголовка страницы через разделитель
*
* @param string $sText
*/
public function AddHtmlTitle($sText) {
$this->sHtmlTitle=$sText.$this->sHtmlTitleSeparation.$this->sHtmlTitle;
}
/**
* Возвращает текущий заголовок страницы
*
* @return unknown
*/
public function GetHtmlTitle() {
return $this->sHtmlTitle;
}
/**
* Устанавливает ключевые слова keywords
*
* @param string $sText
*/
public function SetHtmlKeywords($sText) {
$this->sHtmlKeywords=$sText;
}
/**
* Устанавливает описание страницы desciption
*
* @param string $sText
*/
public function SetHtmlDescription($sText) {
$this->sHtmlDescription=$sText;
}
/**
* Устанавливает альтернативный адрес страницы по RSS
*
* @param string $sText
*/
public function SetHtmlRssAlternate($sUrl,$sTitle) {
$this->aHtmlRssAlternate['title']=htmlspecialchars($sTitle);
$this->aHtmlRssAlternate['url']=htmlspecialchars($sUrl);
}
/**
* Формирует постраничный вывод
*
* @param int $iCount
* @param int $iCurrentPage
* @param int $iCountPerPage
* @param int $iCountPageLine
* @param string $sBaseUrl
* @param array(name=>value) $aGetParamsList
* @return array()
*/
public function MakePaging($iCount,$iCurrentPage,$iCountPerPage,$iCountPageLine,$sBaseUrl,$aGetParamsList=array()) {
if ($iCount==0) {
return false;
}
$iCountPage=ceil($iCount/$iCountPerPage);
if (!preg_match("/^[1-9]\d*$/i",$iCurrentPage)) {
$iCurrentPage=1;
}
if ($iCurrentPage>$iCountPage) {
$iCurrentPage=$iCountPage;
}
$aPagesLeft=array();
$iTemp=$iCurrentPage-$iCountPageLine;
$iTemp = $iTemp<1 ? 1 : $iTemp;
for ($i=$iTemp;$i<$iCurrentPage;$i++) {
$aPagesLeft[]=$i;
}
$aPagesRight=array();
for ($i=$iCurrentPage+1;$i<=$iCurrentPage+$iCountPageLine and $i<=$iCountPage;$i++) {
$aPagesRight[]=$i;
}
$iNextPage = $iCurrentPage<$iCountPage ? $iCurrentPage+1 : false;
$iPrevPage = $iCurrentPage>1 ? $iCurrentPage-1 : false;
$sGetParams='';
foreach ($aGetParamsList as $sName => $sValue) {
$sGetParams.=$sName.'='.urlencode($sValue).'&';
}
if ($sGetParams!='') {
$sGetParams='?'.trim($sGetParams,'&');
}
$aPaging=array(
'aPagesLeft' => $aPagesLeft,
'aPagesRight' => $aPagesRight,
'iCountPage' => $iCountPage,
'iCurrentPage' => $iCurrentPage,
'iNextPage' => $iNextPage,
'iPrevPage' => $iPrevPage,
'sBaseUrl' => $sBaseUrl,
'sGetParams' => $sGetParams,
);
return $aPaging;
}
/**
* Загружаем переменные в шаблон при завершении модуля
*
*/
public function Shutdown() {
/**
* Добавляем блоки по предзагруженным правилам
*/
$this->_BuildBlocks();
$this->VarAssign();
}
}
?>