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:
Alexey Kachayev 2010-01-12 19:02:29 +00:00
parent 3ce2307ec2
commit 84c487c64d
6 changed files with 64 additions and 12 deletions

View file

@ -57,10 +57,12 @@ class ActionAdmin extends Action {
$aPluginsDelete=getRequest('plugins_del');
if (is_array($aPluginsDelete)) {
$this->Plugin_Delete(array_keys($aPluginsDelete));
$this->Plugin_Delete(array_keys($aPluginsDelete));
}
}
/**
* Получаем название плагина и действие
*/
if($sPlugin=getRequest('plugin',null,'get') and $sAction=getRequest('action',null,'get')) {
return $this->SubmitManagePlugin($sPlugin,$sAction);
}
@ -91,7 +93,7 @@ class ActionAdmin extends Action {
*/
protected function SubmitManagePlugin($sPlugin,$sAction) {
if(!in_array($sAction,array('activate','deactivate'))) {
$this->Message_AddErrorSingle($this->Lang_Get('plugins_unknown_action'),$this->Lang_Get('error'),true);
$this->Message_AddError($this->Lang_Get('plugins_unknown_action'),$this->Lang_Get('error'),true);
Router::Location(Router::GetPath('plugins'));
}
/**
@ -100,7 +102,7 @@ class ActionAdmin extends Action {
if($bResult=$this->Plugin_Toggle($sPlugin,$sAction)) {
$this->Message_AddNotice($this->Lang_Get('plugins_action_ok'),$this->Lang_Get('attention'),true);
} else {
$this->Message_AddErrorSingle($this->Lang_Get('system_error'),$this->Lang_Get('error'),true);
if(!($aMessages=$this->Message_GetErrorSession()) or !count($aMessages)) $this->Message_AddErrorSingle($this->Lang_Get('system_error'),$this->Lang_Get('error'),true);
}
/**
* Возвращаем на страницу управления плагинами

View file

@ -281,6 +281,7 @@ class Engine extends Object {
$sClassName="Plugin{$sPluginName}";
$oPlugin=new $sClassName;
$oPlugin->Delegate();
$oPlugin->Init();
}
}

View file

@ -20,7 +20,9 @@
*
*/
abstract class Plugin extends Object {
protected $aDelegates=array();
public function __construct() {
}
@ -32,6 +34,32 @@ abstract class Plugin extends Object {
public function Init() {
}
/**
* Передает информацию о делегатах на Plugin-модуль
* Вызывается Engine перед инициализацией плагина
*/
final function Delegate() {
if(is_array($this->aDelegates) and count($this->aDelegates)) {
foreach ($this->aDelegates as $sObjectName=>$aParams) {
if(is_array($aParams) and count($aParams)) {
foreach ($aParams as $sFrom=>$sTo) {
$this->Plugin_Delegate($sObjectName,$sFrom,$sTo);
}
}
}
}
}
/**
* Возвращает массив делегатов
*
* @return array
*/
final function GetDelegates() {
return $this->aDelegates;
}
/**
* Функция активации плагина
*

View file

@ -52,7 +52,7 @@ class LsPlugin extends Module {
*
* @var array
*/
protected $aDelegate=array(
protected $aDelegates=array(
'module' => array(),
'action' => array(),
'entity' => array(),
@ -121,6 +121,25 @@ class LsPlugin extends Module {
$sClassName="Plugin{$sPluginName}";
$oPlugin=new $sClassName;
if($sAction=='Activate') {
/**
* Проверяем, не вступает ли данный плагин в конфликт с уже активированными
* (по поводу объявленных делегатов)
*/
$aPluginDelegates=$oPlugin->GetDelegates();
$iConflict=0;
foreach ($this->aDelegates as $sGroup=>$aReplaceList) {
$iCount=0;
if(isset($aPluginDelegates[$sGroup])
and is_array($aPluginDelegates[$sGroup])
and $iCount=count($aOverlap=array_intersect_key($aReplaceList,$aPluginDelegates[$sGroup]))) {
$iConflict+=$iCount;
}
if($iCount){ $this->Message_AddErrorSingle($this->Lang_Get('plugins_activation_overlap'), $this->Lang_Get('error'), true); return; }
}
}
$bResult=$oPlugin->$sAction();
}
@ -208,8 +227,8 @@ class LsPlugin extends Module {
* @param string $sTo
*/
public function Delegate($sType,$sFrom,$sTo) {
if(!in_array($sType,array_keys($this->aDelegate)) or !$sFrom or !$sTo) return null;
$this->aDelegate[$sType][trim($sFrom)]=trim($sTo);
if(!in_array($sType,array_keys($this->aDelegates)) or !$sFrom or !$sTo) return null;
$this->aDelegates[$sType][trim($sFrom)]=trim($sTo);
}
/**
@ -221,7 +240,7 @@ class LsPlugin extends Module {
* @return string
*/
public function GetDelegate($sType,$sFrom) {
return $this->isDelegated($sType,$sFrom)?$this->aDelegate[$sType][$sFrom]:$sFrom;
return $this->isDelegated($sType,$sFrom)?$this->aDelegates[$sType][$sFrom]:$sFrom;
}
/**
@ -232,8 +251,8 @@ class LsPlugin extends Module {
* @return bool
*/
public function isDelegated($sType,$sFrom) {
if(!in_array($sType,array_keys($this->aDelegate)) or !$sFrom) return false;
return isset($this->aDelegate[$sType][$sFrom]);
if(!in_array($sType,array_keys($this->aDelegates)) or !$sFrom) return false;
return isset($this->aDelegates[$sType][$sFrom]);
}
/**

View file

@ -3,4 +3,5 @@ Author: LiveStreet Developers Team
Homepage: http://livestreet.ru/
Version: 1.0.0
Requires: 0.4.0
Description: Профилирование работы движка LiveStreet-движка.
Description: Профилирование работы движка LiveStreet-движка.
Delegate:

View file

@ -777,6 +777,7 @@ return array(
'plugins_plugin_deactivate' => 'Деактивировать',
'plugins_unknown_action' => 'Указано неизвестное действие',
'plugins_action_ok' => 'Успешно выполнено',
'plugins_activation_overlap' => 'Данный плагин невозможно активировать, так как он вступает в конфликт с уже активированными',
'plugins_submit_delete' => 'Удалить плагины',
'plugins_delete_confirm' => 'Вы уверены, что желаете удалить указанные плагины?',