mirror of
https://github.com/Oreolek/ifhub.club.git
synced 2024-07-01 14:05:07 +03:00
Actions inheritance refactoring. Now it's possible to inherit actions of other plugins, all templates will be inherited automatically.
This commit is contained in:
parent
4047d7233d
commit
c32e37889f
|
@ -215,51 +215,47 @@ abstract class Action extends Object {
|
|||
* @param string $sTemplate Путь до шаблона относительно каталога шаблонов экшена
|
||||
*/
|
||||
protected function SetTemplateAction($sTemplate) {
|
||||
$sActionClass=$this->GetActionClass();
|
||||
/**
|
||||
* Если класс не является делегатом плагина, устанавлваем шаблон по умолчанию.
|
||||
* В случае делегирования, проверяем сначала имеет ли указанный плагин замену для шаблона.
|
||||
*/
|
||||
if(!$this->Plugin_isDelegated('action',$sActionClass)) {
|
||||
$this->sActionTemplate='actions/'.$sActionClass.'/'.$sTemplate.'.tpl';
|
||||
} else {
|
||||
$sDelegater = $this->Plugin_GetDelegater('action',$sActionClass);
|
||||
$sTemplatePath = Plugin::GetTemplatePath($this->Plugin_GetDelegateSign('action',$sDelegater));
|
||||
|
||||
$this->sActionTemplate = is_file($sFile=$sTemplatePath.'actions/'.$sDelegater.'/'.$sTemplate.'.tpl')
|
||||
? $sFile
|
||||
: 'actions/'.$sDelegater.'/'.$sTemplate.'.tpl';
|
||||
$sAction = $this->GetActionClass();
|
||||
$sActionDelegater = $this->Plugin_GetDelegater('action',$this->GetActionClass());
|
||||
while(empty($sRootDelegater)) {
|
||||
if($sAction==$sActionDelegater) {
|
||||
$sRootDelegater = $sAction;
|
||||
}
|
||||
$sAction = $sActionDelegater;
|
||||
$sActionDelegater = $this->Plugin_GetDelegater('action',$sActionDelegater);
|
||||
}
|
||||
$aDelegates = $this->Plugin_collectAllDelegatesRecursive(array($sRootDelegater),'action');
|
||||
$sActionTemplatePath = $sTemplate.'.tpl';
|
||||
foreach($aDelegates as $sAction) {
|
||||
if(preg_match('/^(Plugin([\w]+)_)?Action([\w]+)$/i',$sAction,$aMatches)) {
|
||||
$sTemplatePath = $this->Plugin_GetDelegate('template','actions/Action'.ucfirst($aMatches[3]).'/'.$sTemplate.'.tpl');
|
||||
if(empty($aMatches[1])) {
|
||||
$sActionTemplatePath = $sTemplatePath;
|
||||
} else {
|
||||
$sTemplatePath = Plugin::GetTemplatePath($sAction).$sTemplatePath;
|
||||
if(is_file($sTemplatePath)) {
|
||||
$sActionTemplatePath = $sTemplatePath;
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
$this->sActionTemplate = $sActionTemplatePath;
|
||||
}
|
||||
|
||||
/**
|
||||
* Получить шаблон
|
||||
* Если шаблон не определен то возвращаем дефолтный шаблон евента: action/{Action}.{event}.tpl
|
||||
* Внимание! По умолчанию, шаблон будет получен без учета делегирования экшена.
|
||||
*
|
||||
* @return unknown
|
||||
*/
|
||||
public function GetTemplate() {
|
||||
if (is_null($this->sActionTemplate)) {
|
||||
$sActionClass=$this->GetActionClass();
|
||||
/**
|
||||
* Если класс не является делегатом плагина, устанавлваем шаблон по умолчанию.
|
||||
* В случае делегирования, проверяем сначала имеет ли указанный плагин замену для шаблона.
|
||||
*/
|
||||
if(!$this->Plugin_isDelegated('action',$sActionClass)) {
|
||||
$this->sActionTemplate='actions/'.$sActionClass.'/'.$this->sCurrentEvent.'.tpl';
|
||||
} else {
|
||||
$sDelegater = $this->Plugin_GetDelegater('action',$sActionClass);
|
||||
$sTemplatePath = Plugin::GetTemplatePath($this->Plugin_GetDelegateSign('action',$sDelegater));
|
||||
|
||||
$this->sActionTemplate = is_file($sFile=$sTemplatePath.'actions/'.$sDelegater.'/'.$this->sCurrentEvent.'.tpl')
|
||||
? $sFile
|
||||
: 'actions/'.$sDelegater.'/'.$this->sCurrentEvent.'.tpl';
|
||||
}
|
||||
$this->SetTemplateAction($this->sCurrentEvent);
|
||||
}
|
||||
return $this->sActionTemplate;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Получить каталог с шаблонами экшена(совпадает с именем класса)
|
||||
*
|
||||
|
|
|
@ -84,33 +84,5 @@ abstract class ActionPlugin extends Action {
|
|||
$this->sTemplatePathPlugin = $sTemplatePath;
|
||||
}
|
||||
|
||||
/**
|
||||
* Устанавливает какой шаблон выводить
|
||||
*
|
||||
* @param string $sTemplate Путь до шаблона относительно каталога шаблонов экшена
|
||||
*/
|
||||
protected function SetTemplateAction($sTemplate) {
|
||||
if($sActionTemplate=preg_match('/^Plugin([\w]+)_Action([\w]+)$/i',$this->GetActionClass(),$aMatches)) {
|
||||
$sTemplatePath = 'actions/Action'.ucfirst($aMatches[2]).'/'.$sTemplate.'.tpl';
|
||||
$sActionTemplate = is_file($sPluginTemplatePath=$this->getTemplatePathPlugin().$sTemplatePath)
|
||||
? $sPluginTemplatePath
|
||||
: $sTemplatePath;
|
||||
}
|
||||
$this->sActionTemplate = $sActionTemplate;
|
||||
}
|
||||
|
||||
/**
|
||||
* Получить шаблон
|
||||
* Если шаблон не определен то возвращаем дефолтный шаблон евента: action/{Action}.{event}.tpl
|
||||
*
|
||||
* @return unknown
|
||||
*/
|
||||
public function GetTemplate() {
|
||||
if (is_null($this->sActionTemplate)) {
|
||||
$this->SetTemplateAction($this->sCurrentEvent);
|
||||
}
|
||||
|
||||
return $this->sActionTemplate;
|
||||
}
|
||||
}
|
||||
?>
|
|
@ -397,12 +397,19 @@ class ModulePlugin extends Module {
|
|||
return $this->aInherits[$sFrom]['items'][$this->aInherits[$sFrom]['position']]['inherit'];
|
||||
}
|
||||
|
||||
public function GetInherits($sFrom) {
|
||||
if (isset($this->aInherits[trim($sFrom)])) {
|
||||
return $this->aInherits[trim($sFrom)]['items'];
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
public function GetLastInherit($sFrom) {
|
||||
if (isset($this->aInherits[trim($sFrom)])) {
|
||||
return $this->aInherits[trim($sFrom)]['items'][count($this->aInherits[trim($sFrom)]['items'])-1];
|
||||
}
|
||||
return null;
|
||||
}
|
||||
}
|
||||
/**
|
||||
* Возвращает делегат модуля, экшена, сущности.
|
||||
* Если делегат не определен, пытается найти наследника, иначе отдает переданный в качестве sender`a параметр
|
||||
|
@ -420,6 +427,24 @@ class ModulePlugin extends Module {
|
|||
return $sFrom;
|
||||
}
|
||||
|
||||
public function GetDelegates($sType,$sFrom) {
|
||||
if (isset($this->aDelegates[$sType][$sFrom]['delegate'])) {
|
||||
return array($this->aDelegates[$sType][$sFrom]['delegate']);
|
||||
} else if($aInherits=$this->GetInherits($sFrom)) {
|
||||
return array_map(create_function('$aInherit','return $aInherit["inherit"];'),array_reverse($aInherits));
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
public function collectAllDelegatesRecursive($aDelegates,$sType) {
|
||||
foreach($aDelegates as $sClass) {
|
||||
if($aNewDelegates=$this->GetDelegates($sType,$sClass)) {
|
||||
$aDelegates = array_merge($this->collectAllDelegatesRecursive($aNewDelegates,$sType),$aDelegates);
|
||||
}
|
||||
}
|
||||
return $aDelegates;
|
||||
}
|
||||
|
||||
/**
|
||||
* Возвращает делегирующий объект по имени делегата
|
||||
*
|
||||
|
|
Loading…
Reference in a new issue