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

Возможность делать именованные евенты и управлять блоками из конфига о их именам

This commit is contained in:
Mzhelskiy Maxim 2012-04-22 11:16:11 +04:00
parent d966c84257
commit c82be977c6
5 changed files with 76 additions and 33 deletions

View file

@ -118,12 +118,12 @@ class ActionBlog extends Action {
*
*/
protected function RegisterEvent() {
$this->AddEventPreg('/^good$/i','/^(page(\d+))?$/i','EventTopics');
$this->AddEvent('good','EventTopics');
$this->AddEventPreg('/^bad$/i','/^(page(\d+))?$/i','EventTopics');
$this->AddEventPreg('/^new$/i','/^(page(\d+))?$/i','EventTopics');
$this->AddEventPreg('/^discussed$/i','/^(page(\d+))?$/i','EventTopics');
$this->AddEventPreg('/^top$/i','/^(page(\d+))?$/i','EventTopics');
$this->AddEventPreg('/^good$/i','/^(page(\d+))?$/i',array('EventTopics','topics'));
$this->AddEvent('good',array('EventTopics','topics'));
$this->AddEventPreg('/^bad$/i','/^(page(\d+))?$/i',array('EventTopics','topics'));
$this->AddEventPreg('/^new$/i','/^(page(\d+))?$/i',array('EventTopics','topics'));
$this->AddEventPreg('/^discussed$/i','/^(page(\d+))?$/i',array('EventTopics','topics'));
$this->AddEventPreg('/^top$/i','/^(page(\d+))?$/i',array('EventTopics','topics'));
$this->AddEvent('add','EventAddBlog');
$this->AddEvent('edit','EventEditBlog');
@ -138,14 +138,14 @@ class ActionBlog extends Action {
$this->AddEvent('ajaxbloginfo', 'AjaxBlogInfo');
$this->AddEvent('ajaxblogjoin', 'AjaxBlogJoin');
$this->AddEventPreg('/^(\d+)\.html$/i','/^$/i','EventShowTopic');
$this->AddEventPreg('/^[\w\-\_]+$/i','/^(\d+)\.html$/i','EventShowTopic');
$this->AddEventPreg('/^(\d+)\.html$/i','/^$/i',array('EventShowTopic','topic'));
$this->AddEventPreg('/^[\w\-\_]+$/i','/^(\d+)\.html$/i',array('EventShowTopic','topic'));
$this->AddEventPreg('/^[\w\-\_]+$/i','/^(page(\d+))?$/i','EventShowBlog');
$this->AddEventPreg('/^[\w\-\_]+$/i','/^bad$/i','/^(page(\d+))?$/i','EventShowBlog');
$this->AddEventPreg('/^[\w\-\_]+$/i','/^new$/i','/^(page(\d+))?$/i','EventShowBlog');
$this->AddEventPreg('/^[\w\-\_]+$/i','/^discussed$/i','/^(page(\d+))?$/i','EventShowBlog');
$this->AddEventPreg('/^[\w\-\_]+$/i','/^top$/i','/^(page(\d+))?$/i','EventShowBlog');
$this->AddEventPreg('/^[\w\-\_]+$/i','/^(page(\d+))?$/i',array('EventShowBlog','blog'));
$this->AddEventPreg('/^[\w\-\_]+$/i','/^bad$/i','/^(page(\d+))?$/i',array('EventShowBlog','blog'));
$this->AddEventPreg('/^[\w\-\_]+$/i','/^new$/i','/^(page(\d+))?$/i',array('EventShowBlog','blog'));
$this->AddEventPreg('/^[\w\-\_]+$/i','/^discussed$/i','/^(page(\d+))?$/i',array('EventShowBlog','blog'));
$this->AddEventPreg('/^[\w\-\_]+$/i','/^top$/i','/^(page(\d+))?$/i',array('EventShowBlog','blog'));
$this->AddEventPreg('/^[\w\-\_]+$/i','/^users$/i','/^(page(\d+))?$/i','EventShowUsers');
}

View file

@ -395,16 +395,8 @@ $config['router']['config']['action_not_found'] = 'error';
* Настройки вывода блоков
*/
$config['block']['rule_index_blog'] = array(
'path' => array(
'___path.root.web___/blog$',
'___path.root.web___/blog/*$',
'___path.root.web___/blog/*/page\d+$',
'___path.root.web___/blog/*/*\.html$',
'___path.root.web___/blog/*\.html$',
'___path.root.web___/top(|(/.+))$',
),
'action' => array(
'index', 'new'
'index', 'blog' => array('{topics}','{topic}','{blog}')
),
'blocks' => array(
'right' => array('stream'=>array('priority'=>100),'tags'=>array('priority'=>50),'blogs'=>array('params'=>array(),'priority'=>1))

View file

@ -71,6 +71,13 @@ abstract class Action extends LsObject {
* @var string|null
*/
protected $sCurrentEvent=null;
/**
* Имя текущий евента
* Позволяет именовать экшены на основе регулярных выражений
*
* @var string|null
*/
protected $sCurrentEventName=null;
/**
* Текущий экшен
*
@ -113,7 +120,17 @@ abstract class Action extends LsObject {
throw new Exception("Incorrect number of arguments when adding events");
}
$aEvent=array();
$aEvent['method']=func_get_arg($iCountArgs-1);
/**
* Последний параметр может быть массивом - содержать имя метода и имя евента(именованный евент)
* Если указан только метод, то имя будет равным названию метода
*/
$aNames=(array)func_get_arg($iCountArgs-1);
$aEvent['method']=$aNames[0];
if (isset($aNames[1])) {
$aEvent['name']=$aNames[1];
} else {
$aEvent['name']=$aEvent['method'];
}
if (!method_exists($this,$aEvent['method'])) {
throw new Exception("Method of the event not found: ".$aEvent['method']);
}
@ -148,6 +165,7 @@ abstract class Action extends LsObject {
continue 2;
}
}
$this->sCurrentEventName=$aEvent['name'];
$sCmd='$result=$this->'.$aEvent['method'].'();';
$this->Hook_Run("action_event_".strtolower($this->sCurrentAction)."_before",array('event'=>$this->sCurrentEvent,'params'=>$this->GetParams()));
eval($sCmd);
@ -306,6 +324,15 @@ abstract class Action extends LsObject {
return Router::GetActionClass();
}
/**
* Возвращает имя евента
*
* @return null|string
*/
public function GetCurrentEventName() {
return $this->sCurrentEventName;
}
/**
* Вызывается в том случаи если не найден евент который запросили через URL
* По дефолту происходит перекидывание на страницу ошибки, это можно переопределить в наследнике

View file

@ -44,6 +44,12 @@ class Router extends LsObject {
* @var string|null
*/
static protected $sActionEvent=null;
/**
* Имя текущего евента
*
* @var string|null
*/
static protected $sActionEventName=null;
/**
* Класс текущего экшена
*
@ -272,6 +278,7 @@ class Router extends LsObject {
$iTimeId=$oProfiler->Start('ExecAction',self::$sAction);
$res=$this->oAction->ExecEvent();
self::$sActionEventName=$this->oAction->GetCurrentEventName();
$this->Hook_Run("action_shutdown_".strtolower($sActionClass)."_before");
$this->oAction->EventShutdown();
@ -344,6 +351,14 @@ class Router extends LsObject {
static public function GetActionEvent() {
return self::$sActionEvent;
}
/**
* Возвращает имя текущего евента
*
* @return string
*/
static public function GetActionEventName() {
return self::$sActionEventName;
}
/**
* Возвращает класс текущего экшена
*
@ -455,7 +470,7 @@ class Router extends LsObject {
* @param string $sPage
* @return string
*/
protected function Rewrite($sPage) {
public function Rewrite($sPage) {
return (isset($this->aConfigRoute['rewrite'][$sPage]))
? $this->aConfigRoute['rewrite'][$sPage]
: $sPage;
@ -470,7 +485,7 @@ class Router extends LsObject {
* @param string $sPage
* @return string
*/
protected function Standart($sPage) {
public function Standart($sPage) {
$aRewrite=array_flip($this->aConfigRoute['rewrite']);
return (isset($aRewrite[$sPage]))
? $aRewrite[$sPage]

View file

@ -574,7 +574,8 @@ class ModuleViewer extends Module {
*/
protected function BuildBlocks() {
$sAction = strtolower(Router::GetAction());
$sEvent = strtolower(Router::GetActionEvent());
$sEvent = strtolower(Router::GetActionEvent());
$sEventName = strtolower(Router::GetActionEventName());
foreach($this->aBlockRules as $sName=>$aRule) {
$bUse=false;
/**
@ -595,16 +596,24 @@ class ModuleViewer extends Module {
* переходи к следующему действию.
*/
foreach ((array)$aRule['action'][$sAction] as $sEventPreg) {
if(substr($sEventPreg,0,1)!='/') {
if(substr($sEventPreg,0,1)=='/') {
/**
* значит это название event`a
*/
if($sEvent==$sEventPreg) { $bUse=true; break; }
} else {
/**
* это регулярное выражение
* Это регулярное выражение
*/
if(preg_match($sEventPreg,$sEvent)) { $bUse=true; break; }
} elseif (substr($sEventPreg,0,1)=='{') {
/**
* Это имя event'a (именованный евент, если его нет, то совпадает с именем метода евента в экшене)
*/
if(trim($sEventPreg,'{}')==$sEventName) {
$bUse=true;
break;
}
} else {
/**
* Это название event`a
*/
if($sEvent==$sEventPreg) { $bUse=true; break; }
}
}
}