1
0
Fork 0
mirror of https://github.com/Oreolek/ifhub.club.git synced 2024-07-03 06:55:03 +03:00
ifhub.club/engine/classes/Router.class.php

317 lines
9 KiB
PHP
Raw Normal View History

<?php
2008-09-21 09:36:57 +03:00
/*-------------------------------------------------------
*
* LiveStreet Engine Social Networking
* Copyright © 2008 Mzhelskiy Maxim
*
*--------------------------------------------------------
*
* Official site: www.livestreet.ru
* Contact e-mail: rus.engine@gmail.com
*
* GNU General Public License, version 2:
* http://www.gnu.org/licenses/old-licenses/gpl-2.0.html
*
---------------------------------------------------------
*/
2009-07-26 16:43:16 +03:00
require_once("Action.class.php");
2008-09-21 09:36:57 +03:00
/**
* Класс роутинга(контроллера)
* Инициализирует ядро, определяет какой экшен запустить согласно URL'у и запускает его.
*/
class Router extends Object {
protected $aConfigRoute=array();
static protected $sAction=null;
static protected $sActionEvent=null;
static protected $sActionClass=null;
2009-02-23 01:15:08 +02:00
static protected $sPathWebCurrent = null;
2008-09-21 09:36:57 +03:00
static protected $aParams=array();
protected $oAction=null;
protected $oEngine=null;
static protected $bShowStats=true;
2008-09-21 09:36:57 +03:00
static protected $oInstance=null;
/**
* Делает возможным только один экземпляр этого класса
*
* @return Router
*/
static public function getInstance() {
if (isset(self::$oInstance) and (self::$oInstance instanceof self)) {
return self::$oInstance;
} else {
self::$oInstance= new self();
return self::$oInstance;
}
}
2009-07-26 16:43:16 +03:00
protected function __construct() {
$this->LoadConfig();
}
2008-09-21 09:36:57 +03:00
/**
2009-07-26 16:43:16 +03:00
* Запускает весь процесс :)
*
*/
public function Exec() {
$this->oEngine=Engine::getInstance();
$this->oEngine->Init();
$this->ParseUrl();
$this->ExecAction();
$this->AssignVars();
$this->oEngine->Shutdown();
$this->Viewer_Display($this->oAction->GetTemplate());
}
/**
* Парсим URL
2008-09-21 09:36:57 +03:00
* Пример: http://site.ru/action/event/param1/param2/ на выходе получим:
* self::$sAction='action';
* self::$sActionEvent='event';
* self::$aParams=array('param1','param2');
*
*/
2009-07-26 16:43:16 +03:00
protected function ParseUrl() {
2008-09-21 09:36:57 +03:00
$sReq=preg_replace("/\/+/",'/',$_SERVER['REQUEST_URI']);
2009-02-23 01:15:08 +02:00
$sReq=preg_replace("/^\/(.*)\/?$/U",'\\1',$sReq);
$sReq=preg_replace("/^(.*)\/\?.*$/U",'\\1',$sReq);
2008-09-21 09:36:57 +03:00
2009-02-23 01:15:08 +02:00
self::$sPathWebCurrent = DIR_WEB_ROOT."/".$sReq;
$aRequestUrl = ($sReq=='') ? array() : explode('/',$sReq);
2008-09-21 09:36:57 +03:00
for ($i=0;$i<SYS_OFFSET_REQUEST_URL;$i++) {
array_shift($aRequestUrl);
}
self::$sAction=array_shift($aRequestUrl);
self::$sActionEvent=array_shift($aRequestUrl);
self::$aParams=$aRequestUrl;
}
/**
* Выполняет загрузку конфигов роутинга
*
*/
protected function LoadConfig() {
//Конфиг роутинга, содержит соответствия URL и классов экшенов
$this->aConfigRoute = Config::Get('router');
}
2009-07-26 16:43:16 +03:00
2008-09-21 09:36:57 +03:00
/**
* Загружает в шаблонизатор Smarty необходимые переменные
*
*/
2009-07-26 16:43:16 +03:00
protected function AssignVars() {
2008-09-21 09:36:57 +03:00
$this->Viewer_Assign('sAction',self::$sAction);
$this->Viewer_Assign('sEvent',self::$sActionEvent);
$this->Viewer_Assign('aParams',self::$aParams);
2009-02-23 01:15:08 +02:00
$this->Viewer_Assign('PATH_WEB_CURRENT',self::$sPathWebCurrent);
2008-09-21 09:36:57 +03:00
}
/**
* Запускает на выполнение экшен
* Может запускаться рекурсивно если в одном экшене стоит переадресация на другой
*
*/
public function ExecAction() {
$this->DefineActionClass();
/**
* Сначала запускаем инициализирующий экшен
*/
require_once(DIR_SERVER_ROOT.'/classes/actions/Init.class.php');
$oActionInit=new Init($this->oEngine);
$oActionInit->InitAction();
$sActionClass=$this->DefineActionClass();
require_once(DIR_SERVER_ROOT.'/classes/actions/'.$sActionClass.'.class.php');
$sPrefixCustom='';
if (file_exists(DIR_SERVER_ROOT."/classes/actions/".$sActionClass.'.class.custom.php')) {
require_once(DIR_SERVER_ROOT."/classes/actions/".$sActionClass.'.class.custom.php');
$sPrefixCustom='_custom';
}
$sClassName=$sActionClass.$sPrefixCustom;
$this->oAction=new $sClassName($this->oEngine,self::$sAction);
2008-09-21 09:36:57 +03:00
if ($this->oAction->Init()==='next') {
$this->ExecAction();
} else {
$res=$this->oAction->ExecEvent();
$this->oAction->EventShutdown();
if ($res==='next') {
$this->ExecAction();
}
}
}
/**
* Определяет какой класс соответствует текущему экшену
*
* @return string
*/
protected function DefineActionClass() {
if (isset($this->aConfigRoute['page'][self::$sAction])) {
} elseif (self::$sAction===null) {
self::$sAction=$this->aConfigRoute['config']['action_default'];
} else {
//Если не находим нужного класса то отправляем на страницу ошибки
2009-04-23 16:59:40 +03:00
$this->Message_AddError($this->Lang_Get('system_error_404'),'404');
2008-09-21 09:36:57 +03:00
self::$sAction=$this->aConfigRoute['config']['action_not_found'];
}
self::$sActionClass=$this->aConfigRoute['page'][self::$sAction];
return self::$sActionClass;
}
/**
* Функция переадресации на другой экшен
* Если ею завершить евент в экшене то запуститься новый экшен
* Пример: return Router::Action('error');
*
* @param string $sAction
* @param string $sEvent
* @param array $aParams
* @return 'next'
*/
static public function Action($sAction,$sEvent=null,$aParams=null) {
self::$sAction=$sAction;
self::$sActionEvent=$sEvent;
if (is_array($aParams)) {
self::$aParams=$aParams;
}
return 'next';
}
2009-02-23 01:15:08 +02:00
/**
* Получить текущий путь
*
* @return string
*/
static public function GetPathWebCurrent() {
return self::$sPathWebCurrent;
}
2008-09-21 09:36:57 +03:00
/**
* Получить текущий экшен
*
* @return string
*/
static public function GetAction() {
return self::$sAction;
}
/**
* Получить текущий евент
*
* @return string
*/
static public function GetActionEvent() {
return self::$sActionEvent;
}
/**
* Получить класс текущего экшена
*
* @return string
*/
static public function GetActionClass() {
return self::$sActionClass;
}
/**
* Установить новый текущий евент
*
* @param string $sEvent
*/
static public function SetActionEvent($sEvent) {
self::$sActionEvent=$sEvent;
}
/**
* Получить параметры(те которые передаются в URL)
*
* @return array
*/
static public function GetParams() {
return self::$aParams;
}
/**
* Получить параметр по номеру, если его нет то возвращается null
*
* @param int $iOffset
* @return string
*/
2009-07-26 16:43:16 +03:00
static public function GetParam($iOffset,$def=null) {
2008-09-21 09:36:57 +03:00
$iOffset=(int)$iOffset;
2009-07-26 16:43:16 +03:00
return isset(self::$aParams[$iOffset]) ? self::$aParams[$iOffset] : $def;
2008-09-21 09:36:57 +03:00
}
/**
* Установить значение параметра
*
* @param int $iOffset - по идеи может быть не только числом
* @param unknown_type $value
*/
static public function SetParam($iOffset,$value) {
self::$aParams[$iOffset]=$value;
}
/**
* Показывать или нет статистику выполение скрипта
* Иногда бывает отключить показ, например, при выводе RSS ленты
*
* @param unknown_type $bState
*/
static public function SetIsShowStats($bState) {
self::$bShowStats=$bState;
}
/**
* Получить статус показывать или нет статистику
*
* @return unknown
*/
static public function GetIsShowStats() {
return self::$bShowStats;
}
2008-09-21 09:36:57 +03:00
/**
* Ставим хук на вызов неизвестного метода и считаем что хотели вызвать метод какого либо модуля
*
* @param string $sName
* @param array $aArgs
* @return unknown
*/
public function __call($sName,$aArgs) {
return $this->oEngine->_CallModule($sName,$aArgs);
}
/**
* Блокируем копирование/клонирование объекта роутинга
*
*/
protected function __clone() {
}
/**
* Функция, возвращающая ссылку на Action по переданому названию страницы
*
* @param string $action
* @return string
*/
static public function getPath($action) {
$aRoutes = array_flip(self::getInstance()->aConfigRoute['page']);
// Если пользователь запросил action по умолчанию
if($action == 'default') {
$action = self::getInstance()->aConfigRoute['config']['action_default'];
}
// Пытаемся найте соответствующий роут
if(!$sPage = @$aRoutes['Action'.ucfirst($action)]) {
return false;
}
return DIR_WEB_ROOT."/$sPage/";
}
2008-09-21 09:36:57 +03:00
}
?>