2009-05-10 10:50:39 +03:00
|
|
|
|
<?php
|
2008-09-21 09:36:57 +03:00
|
|
|
|
/*-------------------------------------------------------
|
|
|
|
|
*
|
|
|
|
|
* LiveStreet Engine Social Networking
|
|
|
|
|
* Copyright © 2008 Mzhelskiy Maxim
|
|
|
|
|
*
|
|
|
|
|
*--------------------------------------------------------
|
|
|
|
|
*
|
|
|
|
|
* Official site: www.livestreet.ru
|
|
|
|
|
* Contact e-mail: rus.engine@gmail.com
|
|
|
|
|
*
|
|
|
|
|
* GNU General Public License, version 2:
|
|
|
|
|
* http://www.gnu.org/licenses/old-licenses/gpl-2.0.html
|
|
|
|
|
*
|
|
|
|
|
---------------------------------------------------------
|
|
|
|
|
*/
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* Абстрактный класс экшена
|
|
|
|
|
*
|
|
|
|
|
*/
|
|
|
|
|
abstract class Action extends Object {
|
|
|
|
|
|
|
|
|
|
protected $aRegisterEvent=array();
|
|
|
|
|
protected $aParams=array();
|
2008-10-05 19:22:25 +03:00
|
|
|
|
protected $aParamsEventMatch=array('event'=>array(),'params'=>array());
|
2008-09-21 09:36:57 +03:00
|
|
|
|
protected $oEngine=null;
|
|
|
|
|
protected $sActionTemplate=null;
|
|
|
|
|
protected $sDefaultEvent=null;
|
|
|
|
|
protected $sCurrentEvent=null;
|
|
|
|
|
protected $sCurrentAction=null;
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* Конструктор
|
|
|
|
|
*
|
|
|
|
|
* @param Engine $oEngine
|
|
|
|
|
* @param string $sAction
|
|
|
|
|
*/
|
|
|
|
|
public function __construct(Engine $oEngine, $sAction) {
|
|
|
|
|
$this->RegisterEvent();
|
|
|
|
|
$this->oEngine=$oEngine;
|
|
|
|
|
$this->sCurrentAction=$sAction;
|
2008-10-11 17:51:38 +03:00
|
|
|
|
$this->aParams=Router::GetParams();
|
2008-09-21 09:36:57 +03:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* Добавляет евент в экшен
|
2008-10-05 19:22:25 +03:00
|
|
|
|
* По сути является оберткой для AddEventPreg(), оставлен для простоты и совместимости с прошлыми версиями ядра
|
2008-09-21 09:36:57 +03:00
|
|
|
|
*
|
|
|
|
|
* @param string $sEventName Название евента
|
|
|
|
|
* @param string $sEventFunction Какой метод ему соответствует
|
2008-10-05 19:22:25 +03:00
|
|
|
|
*/
|
2008-09-21 09:36:57 +03:00
|
|
|
|
protected function AddEvent($sEventName,$sEventFunction) {
|
2008-10-05 19:22:25 +03:00
|
|
|
|
$this->AddEventPreg("/^{$sEventName}$/i",$sEventFunction);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* Добавляет евент в экшен, используя регулярное вырожение для евента и параметров
|
|
|
|
|
*
|
|
|
|
|
*/
|
|
|
|
|
protected function AddEventPreg() {
|
|
|
|
|
$iCountArgs=func_num_args();
|
|
|
|
|
if ($iCountArgs<2) {
|
2009-04-23 16:59:40 +03:00
|
|
|
|
throw new Exception($this->Lang_Get('system_error_event_args'));
|
2008-09-21 09:36:57 +03:00
|
|
|
|
}
|
2008-10-05 19:22:25 +03:00
|
|
|
|
$aEvent=array();
|
|
|
|
|
$aEvent['method']=func_get_arg($iCountArgs-1);
|
|
|
|
|
if (!method_exists($this,$aEvent['method'])) {
|
2009-04-23 16:59:40 +03:00
|
|
|
|
throw new Exception($this->Lang_Get('system_error_event_method').": ".$aEvent['method']);
|
2008-10-05 19:22:25 +03:00
|
|
|
|
}
|
|
|
|
|
$aEvent['preg']=func_get_arg(0);
|
|
|
|
|
$aEvent['params_preg']=array();
|
|
|
|
|
for ($i=1;$i<$iCountArgs-1;$i++) {
|
|
|
|
|
$aEvent['params_preg'][]=func_get_arg($i);
|
|
|
|
|
}
|
|
|
|
|
$this->aRegisterEvent[]=$aEvent;
|
2008-09-21 09:36:57 +03:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* Запускает евент на выполнение
|
|
|
|
|
* Если текущий евент не определен то запускается тот которые определен по умолчанию(default event)
|
|
|
|
|
*
|
|
|
|
|
* @return unknown
|
|
|
|
|
*/
|
2008-10-11 17:51:38 +03:00
|
|
|
|
public function ExecEvent() {
|
2008-09-21 09:36:57 +03:00
|
|
|
|
$this->sCurrentEvent=Router::GetActionEvent();
|
|
|
|
|
if ($this->sCurrentEvent==null) {
|
|
|
|
|
$this->sCurrentEvent=$this->GetDefaultEvent();
|
|
|
|
|
Router::SetActionEvent($this->sCurrentEvent);
|
2008-10-05 19:22:25 +03:00
|
|
|
|
}
|
|
|
|
|
foreach ($this->aRegisterEvent as $aEvent) {
|
|
|
|
|
if (preg_match($aEvent['preg'],$this->sCurrentEvent,$aMatch)) {
|
|
|
|
|
$this->aParamsEventMatch['event']=$aMatch;
|
|
|
|
|
$this->aParamsEventMatch['params']=array();
|
|
|
|
|
foreach ($aEvent['params_preg'] as $iKey => $sParamPreg) {
|
|
|
|
|
if (preg_match($sParamPreg,$this->GetParam($iKey,''),$aMatch)) {
|
|
|
|
|
$this->aParamsEventMatch['params'][$iKey]=$aMatch;
|
|
|
|
|
} else {
|
|
|
|
|
continue 2;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
$sCmd='$result=$this->'.$aEvent['method'].'();';
|
|
|
|
|
eval($sCmd);
|
|
|
|
|
return $result;
|
|
|
|
|
}
|
2008-09-21 09:36:57 +03:00
|
|
|
|
}
|
2008-10-05 19:22:25 +03:00
|
|
|
|
return $this->EventNotFound();
|
|
|
|
|
}
|
2008-09-21 09:36:57 +03:00
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* Устанавливает евент по умолчанию
|
|
|
|
|
*
|
|
|
|
|
* @param string $sEvent
|
|
|
|
|
*/
|
|
|
|
|
public function SetDefaultEvent($sEvent) {
|
|
|
|
|
$this->sDefaultEvent=$sEvent;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* Получает евент по умолчанию
|
|
|
|
|
*
|
|
|
|
|
* @return string
|
|
|
|
|
*/
|
|
|
|
|
public function GetDefaultEvent() {
|
|
|
|
|
return $this->sDefaultEvent;
|
|
|
|
|
}
|
2008-10-05 19:22:25 +03:00
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* Возвращает элементы совпадения по регулярному выражению для евента
|
|
|
|
|
*
|
|
|
|
|
* @param unknown_type $iItem
|
|
|
|
|
* @return unknown
|
|
|
|
|
*/
|
|
|
|
|
protected function GetEventMatch($iItem=null) {
|
|
|
|
|
if ($iItem) {
|
|
|
|
|
if (isset($this->aParamsEventMatch['event'][$iItem])) {
|
|
|
|
|
return $this->aParamsEventMatch['event'][$iItem];
|
|
|
|
|
} else {
|
|
|
|
|
return null;
|
|
|
|
|
}
|
|
|
|
|
} else {
|
|
|
|
|
return $this->aParamsEventMatch['event'];
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
/**
|
|
|
|
|
* Возвращает элементы совпадения по регулярному выражению для параметров евента
|
|
|
|
|
*
|
|
|
|
|
* @param unknown_type $iParamNum
|
|
|
|
|
* @param unknown_type $iItem
|
|
|
|
|
* @return unknown
|
|
|
|
|
*/
|
|
|
|
|
protected function GetParamEventMatch($iParamNum,$iItem=null) {
|
2009-03-01 13:59:01 +02:00
|
|
|
|
if (!is_null($iItem)) {
|
2008-10-05 19:22:25 +03:00
|
|
|
|
if (isset($this->aParamsEventMatch['params'][$iParamNum][$iItem])) {
|
|
|
|
|
return $this->aParamsEventMatch['params'][$iParamNum][$iItem];
|
|
|
|
|
} else {
|
|
|
|
|
return null;
|
|
|
|
|
}
|
|
|
|
|
} else {
|
|
|
|
|
if (isset($this->aParamsEventMatch['event'][$iParamNum])) {
|
|
|
|
|
return $this->aParamsEventMatch['event'][$iParamNum];
|
|
|
|
|
} else {
|
|
|
|
|
return null;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
2008-09-21 09:36:57 +03:00
|
|
|
|
/**
|
|
|
|
|
* Получает параметр из URL по его номеру, если его нет то null
|
|
|
|
|
*
|
|
|
|
|
* @param unknown_type $iOffset
|
|
|
|
|
* @return unknown
|
|
|
|
|
*/
|
2008-10-05 19:22:25 +03:00
|
|
|
|
public function GetParam($iOffset,$default=null) {
|
2008-09-21 09:36:57 +03:00
|
|
|
|
$iOffset=(int)$iOffset;
|
2008-10-05 19:22:25 +03:00
|
|
|
|
return isset($this->aParams[$iOffset]) ? $this->aParams[$iOffset] : $default;
|
2008-09-21 09:36:57 +03:00
|
|
|
|
}
|
|
|
|
|
|
2008-10-24 08:23:13 +03:00
|
|
|
|
/**
|
|
|
|
|
* Получает список параметров из УРЛ
|
|
|
|
|
*
|
|
|
|
|
* @return unknown
|
|
|
|
|
*/
|
|
|
|
|
public function GetParams() {
|
|
|
|
|
return $this->aParams;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
2008-09-21 09:36:57 +03:00
|
|
|
|
/**
|
|
|
|
|
* Установить значение параметра(эмуляция параметра в URL).
|
|
|
|
|
* После установки занова считывает параметры из роутера - для корректной работы
|
|
|
|
|
*
|
|
|
|
|
* @param int $iOffset - по идеи может быть не только числом
|
|
|
|
|
* @param unknown_type $value
|
|
|
|
|
*/
|
|
|
|
|
public function SetParam($iOffset,$value) {
|
|
|
|
|
Router::SetParam($iOffset,$value);
|
|
|
|
|
$this->aParams=Router::GetParams();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* Устанавливает какой шаблон выводить
|
|
|
|
|
*
|
|
|
|
|
* @param string $sTemplate Путь до шаблона относительно общего каталога шаблонов
|
|
|
|
|
*/
|
|
|
|
|
protected function SetTemplate($sTemplate) {
|
|
|
|
|
$this->sActionTemplate=$sTemplate;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* Устанавливает какой шаблон выводить
|
|
|
|
|
*
|
|
|
|
|
* @param string $sTemplate Путь до шаблона относительно каталога шаблонов экшена
|
|
|
|
|
*/
|
|
|
|
|
protected function SetTemplateAction($sTemplate) {
|
|
|
|
|
$this->sActionTemplate='actions/'.$this->GetActionClass().'/'.$sTemplate.'.tpl';
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* Получить шаблон
|
|
|
|
|
* Если шаблон не определен то возвращаем дефолтный шаблон евента: action/{Action}.{event}.tpl
|
|
|
|
|
*
|
|
|
|
|
* @return unknown
|
|
|
|
|
*/
|
|
|
|
|
public function GetTemplate() {
|
|
|
|
|
if (is_null($this->sActionTemplate)) {
|
|
|
|
|
$this->sActionTemplate='actions/'.$this->GetActionClass().'/'.$this->sCurrentEvent.'.tpl';
|
|
|
|
|
}
|
|
|
|
|
return $this->sActionTemplate;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* Получить каталог с шаблонами экшена(совпадает с именем класса)
|
|
|
|
|
*
|
|
|
|
|
* @return unknown
|
|
|
|
|
*/
|
|
|
|
|
public function GetActionClass() {
|
|
|
|
|
return Router::GetActionClass();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* Вызывается в том случаи если не найден евент который запросили через URL
|
|
|
|
|
* По дефолту происходит перекидывание на страницу ошибки, это можно переопределить в наследнике, а в ряде случаев и необходимо :) Для примера смотри экшен Profile
|
|
|
|
|
*
|
|
|
|
|
* @return unknown
|
|
|
|
|
*/
|
|
|
|
|
protected function EventNotFound() {
|
2009-04-23 16:59:40 +03:00
|
|
|
|
$this->Message_AddErrorSingle($this->Lang_Get('system_error_404'),'404');
|
2008-09-21 09:36:57 +03:00
|
|
|
|
return Router::Action('error');
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* Выполняется при завершение экшена, после вызова основного евента
|
|
|
|
|
*
|
|
|
|
|
*/
|
|
|
|
|
public function EventShutdown() {
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* Ставим хук на вызов неизвестного метода и считаем что хотели вызвать метод какого либо модуля
|
|
|
|
|
*
|
|
|
|
|
* @param string $sName
|
|
|
|
|
* @param array $aArgs
|
|
|
|
|
* @return unknown
|
|
|
|
|
*/
|
|
|
|
|
public function __call($sName,$aArgs) {
|
|
|
|
|
return $this->oEngine->_CallModule($sName,$aArgs);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* Абстрактный метод инициализации экшена
|
|
|
|
|
*
|
|
|
|
|
*/
|
|
|
|
|
abstract public function Init();
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* Абстрактный метод регистрации евентов.
|
|
|
|
|
* В нём необходимо вызывать метод AddEvent($sEventName,$sEventFunction)
|
|
|
|
|
*
|
|
|
|
|
*/
|
|
|
|
|
abstract protected function RegisterEvent();
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
?>
|