mirror of
https://github.com/Oreolek/ifhub.club.git
synced 2024-06-29 04:55:02 +03:00
Центр администрирования плагинами (прототип)
This commit is contained in:
parent
8eca922c6a
commit
ab0789fe82
109
classes/actions/ActionPlugins.class.php
Normal file
109
classes/actions/ActionPlugins.class.php
Normal file
|
@ -0,0 +1,109 @@
|
||||||
|
<?php
|
||||||
|
/*-------------------------------------------------------
|
||||||
|
*
|
||||||
|
* 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
|
||||||
|
*
|
||||||
|
---------------------------------------------------------
|
||||||
|
*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Класс обработки УРЛа вида /comments/
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
class ActionPlugins extends Action {
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Главное меню
|
||||||
|
*
|
||||||
|
* @var string
|
||||||
|
*/
|
||||||
|
protected $sMenuHeadItemSelect='plugins';
|
||||||
|
|
||||||
|
public function Init() {
|
||||||
|
if(!$this->User_IsAuthorization() or !$oUserCurrent=$this->User_GetUserCurrent() or !$oUserCurrent->isAdministrator()) {
|
||||||
|
return parent::EventNotFound();
|
||||||
|
}
|
||||||
|
|
||||||
|
$this->oUserCurrent=$oUserCurrent;
|
||||||
|
}
|
||||||
|
|
||||||
|
protected function RegisterEvent() {
|
||||||
|
$this->AddEventPreg('/^(page(\d+))?$/i','EventIndex');
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/**********************************************************************************
|
||||||
|
************************ РЕАЛИЗАЦИЯ ЭКШЕНА ***************************************
|
||||||
|
**********************************************************************************
|
||||||
|
*/
|
||||||
|
|
||||||
|
|
||||||
|
protected function EventIndex() {
|
||||||
|
if($sPlugin=getRequest('plugin',null,'get') and $sAction=getRequest('action',null,'get')) {
|
||||||
|
return $this->SubmitManagePlugin($sPlugin,$sAction);
|
||||||
|
}
|
||||||
|
/**
|
||||||
|
* Передан ли номер страницы
|
||||||
|
*/
|
||||||
|
$iPage= preg_match("/^\d+$/i",$this->GetEventMatch(2)) ? $this->GetEventMatch(2) : 1;
|
||||||
|
/**
|
||||||
|
* Получаем список блогов
|
||||||
|
*/
|
||||||
|
$aPlugins=$this->Plugin_GetList();
|
||||||
|
/**
|
||||||
|
* Загружаем переменные в шаблон
|
||||||
|
*/
|
||||||
|
$this->Viewer_Assign("aPlugins",$aPlugins);
|
||||||
|
$this->Viewer_AddHtmlTitle($this->Lang_Get('plugins_administartion_title'));
|
||||||
|
/**
|
||||||
|
* Устанавливаем шаблон вывода
|
||||||
|
*/
|
||||||
|
$this->SetTemplateAction('index');
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Активация\деактивация плагина
|
||||||
|
*
|
||||||
|
* @param string $sPlugin
|
||||||
|
* @param string $sAction
|
||||||
|
*/
|
||||||
|
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);
|
||||||
|
Router::Location(Router::GetPath('plugins'));
|
||||||
|
}
|
||||||
|
/**
|
||||||
|
* Активируем\деактивируем плагин
|
||||||
|
*/
|
||||||
|
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);
|
||||||
|
}
|
||||||
|
/**
|
||||||
|
* Возвращаем на страницу управления плагинами
|
||||||
|
*/
|
||||||
|
Router::Location(Router::GetPath('plugins'));
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Выполняется при завершении работы экшена
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
public function EventShutdown() {
|
||||||
|
/**
|
||||||
|
* Загружаем в шаблон необходимые переменные
|
||||||
|
*/
|
||||||
|
$this->Viewer_Assign('sMenuHeadItemSelect',$this->sMenuHeadItemSelect);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
?>
|
207
classes/plugins/profiler/templates/skin/default/js/profiler.js
Normal file
207
classes/plugins/profiler/templates/skin/default/js/profiler.js
Normal file
|
@ -0,0 +1,207 @@
|
||||||
|
var lsProfilerClass = new Class({
|
||||||
|
|
||||||
|
Implements: Options,
|
||||||
|
|
||||||
|
options: {
|
||||||
|
img : {
|
||||||
|
path: DIR_STATIC_SKIN+'/images/',
|
||||||
|
openName: 'open.gif',
|
||||||
|
closeName: 'close.gif'
|
||||||
|
},
|
||||||
|
classes: {
|
||||||
|
visible: 'lsProfiler_visible',
|
||||||
|
hidden: 'lsProfiler_hidden',
|
||||||
|
openImg: 'lsProfiler_open',
|
||||||
|
closeImg: 'lsProfiler_close',
|
||||||
|
treeNode: 'lsProfiler_tree',
|
||||||
|
filterNode: 'lsProfiler_filter'
|
||||||
|
},
|
||||||
|
prefix: {
|
||||||
|
img: 'img_',
|
||||||
|
td: 'report_',
|
||||||
|
entry: 'entry_',
|
||||||
|
tree: 'tree_',
|
||||||
|
treeNode: 'tree_node_'
|
||||||
|
},
|
||||||
|
path: {
|
||||||
|
loadReport: aRouter['profiler']+'ajaxloadreport/',
|
||||||
|
loadEntries: aRouter['profiler']+'ajaxloadentriesbyfilter/'
|
||||||
|
}
|
||||||
|
},
|
||||||
|
|
||||||
|
initialize: function(options){
|
||||||
|
this.setOptions(options);
|
||||||
|
this.make();
|
||||||
|
},
|
||||||
|
|
||||||
|
make: function(expandClass){
|
||||||
|
var thisObj = this;
|
||||||
|
var aImgFolding=(!expandClass)?$$('img.folding'):$$('img.folding.'+expandClass);
|
||||||
|
aImgFolding.each(function(img, i){thisObj.makeImg(img);});
|
||||||
|
},
|
||||||
|
|
||||||
|
makeImg: function(img) {
|
||||||
|
var thisObj = this;
|
||||||
|
img.setStyles({
|
||||||
|
'cursor' : 'pointer',
|
||||||
|
'display' : 'inline'
|
||||||
|
});
|
||||||
|
img.removeClass(this.options.classes.closeImg);
|
||||||
|
img.addClass(this.options.classes.openImg);
|
||||||
|
img.removeEvents('click');
|
||||||
|
img.addEvent('click',function(){
|
||||||
|
thisObj.toggleNode(img);
|
||||||
|
});
|
||||||
|
},
|
||||||
|
|
||||||
|
toggleNode: function(img) {
|
||||||
|
if (img.hasClass(this.options.classes.closeImg)) {
|
||||||
|
this.collapseNode(img);
|
||||||
|
} else {
|
||||||
|
this.expandNode(img);
|
||||||
|
}
|
||||||
|
},
|
||||||
|
|
||||||
|
expandNode: function(img) {
|
||||||
|
var thisObj = this;
|
||||||
|
|
||||||
|
img.setProperties({'src': this.options.img.path + this.options.img.closeName});
|
||||||
|
img.removeClass(this.options.classes.openImg);
|
||||||
|
img.addClass(this.options.classes.closeImg);
|
||||||
|
|
||||||
|
if(img.hasClass(thisObj.options.classes.treeNode)) {
|
||||||
|
// Это элемент дерева - обрабатываем его соответствующим образом
|
||||||
|
ids = img.get('id').replace(this.options.prefix.tree,'').split('_');
|
||||||
|
|
||||||
|
reportId=ids[0];
|
||||||
|
var trReportId=this.options.prefix.treeNode+ids[0]+'_'+ids[1];
|
||||||
|
var trReport=$(trReportId);
|
||||||
|
var parentId=ids[1];
|
||||||
|
} else {
|
||||||
|
reportId=img.get('id').replace(this.options.prefix.img,this.options.prefix.td);
|
||||||
|
var trReport = $(reportId);
|
||||||
|
var parentId = 0;
|
||||||
|
var trReportId = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
if(trReport){
|
||||||
|
trReport.show();
|
||||||
|
} else {
|
||||||
|
thisObj.loadReport(img.getParent('tr'),reportId,parentId,trReportId);
|
||||||
|
}
|
||||||
|
},
|
||||||
|
|
||||||
|
loadReport: function(obj,reportId,parentId,namedId) {
|
||||||
|
var thisObj=this;
|
||||||
|
var trCurrent = obj;
|
||||||
|
|
||||||
|
JsHttpRequest.query(
|
||||||
|
'POST '+thisObj.options.path.loadReport,
|
||||||
|
{
|
||||||
|
reportId: reportId,
|
||||||
|
bTreeView: true,
|
||||||
|
parentId: parentId,
|
||||||
|
security_ls_key: LIVESTREET_SECURITY_KEY
|
||||||
|
},
|
||||||
|
function(result, errors) {
|
||||||
|
if (!result) {
|
||||||
|
msgErrorBox.alert('Error','Please try again later');
|
||||||
|
}
|
||||||
|
if (result.bStateError) {
|
||||||
|
msgErrorBox.alert(result.sMsgTitle,result.sMsg);
|
||||||
|
} else {
|
||||||
|
var trReport=new Element('tr', {'id':(!namedId)?reportId:namedId});
|
||||||
|
trReport.adopt(new Element('td',{
|
||||||
|
'colspan': 6,
|
||||||
|
'html' : result.sReportText
|
||||||
|
}));
|
||||||
|
trReport.inject(trCurrent,'after');
|
||||||
|
trReport.getElements('img').each(function(img, i){thisObj.makeImg(img);});
|
||||||
|
}
|
||||||
|
},
|
||||||
|
true
|
||||||
|
);
|
||||||
|
},
|
||||||
|
|
||||||
|
collapseNode: function(img) {
|
||||||
|
var thisObj = this;
|
||||||
|
|
||||||
|
img.setProperties({'src': this.options.img.path + this.options.img.openName});
|
||||||
|
img.removeClass(this.options.classes.closeImg);
|
||||||
|
img.addClass(this.options.classes.openImg);
|
||||||
|
|
||||||
|
if(img.hasClass(thisObj.options.classes.treeNode)) {
|
||||||
|
// Это элемент дерева - обрабатываем его соответствующим образом
|
||||||
|
trReport=img.getParent('tr').getNext('tr');
|
||||||
|
} else {
|
||||||
|
reportId=img.get('id').replace(this.options.prefix.img,this.options.prefix.td);
|
||||||
|
var trReport = $(reportId);
|
||||||
|
}
|
||||||
|
|
||||||
|
trReport.hide();
|
||||||
|
},
|
||||||
|
|
||||||
|
toggleEntriesByClass: function(reportId,name,link) {
|
||||||
|
var thisObj=this;
|
||||||
|
$$('a.profiler').removeClass('active');
|
||||||
|
$$('a.profiler.'+name).addClass('active');
|
||||||
|
|
||||||
|
//var trCurrent = link.getParent('tr').getPrevious('tr');
|
||||||
|
|
||||||
|
JsHttpRequest.query(
|
||||||
|
'POST '+thisObj.options.path.loadEntries+name+'/',
|
||||||
|
{
|
||||||
|
reportId: reportId,
|
||||||
|
security_ls_key: LIVESTREET_SECURITY_KEY
|
||||||
|
},
|
||||||
|
function(result, errors) {
|
||||||
|
if (!result) {
|
||||||
|
msgErrorBox.alert('Error','Please try again later');
|
||||||
|
}
|
||||||
|
if (result.bStateError) {
|
||||||
|
msgErrorBox.alert(result.sMsgTitle,result.sMsg);
|
||||||
|
} else {
|
||||||
|
var trReport = $(thisObj.options.prefix.td+reportId).empty();
|
||||||
|
trReport.adopt(new Element('td',{
|
||||||
|
'colspan': 5,
|
||||||
|
'html' : result.sReportText
|
||||||
|
}));
|
||||||
|
trReport.getElements('img').each(function(img, i){thisObj.makeImg(img);});
|
||||||
|
}
|
||||||
|
},
|
||||||
|
true
|
||||||
|
);
|
||||||
|
},
|
||||||
|
|
||||||
|
filterNode: function(obj) {
|
||||||
|
var thisObj = this;
|
||||||
|
var iTime=obj.get('value');
|
||||||
|
if(iTime!='' && parseFloat(iTime)){ thisObj.highlightFilterNode(iTime); }
|
||||||
|
},
|
||||||
|
|
||||||
|
highlightFilterNode: function(iTime) {
|
||||||
|
var thisObj = this;
|
||||||
|
|
||||||
|
$$('.time').each(function(el,i){
|
||||||
|
el.getParent('tr').removeClass(thisObj.options.classes.filterNode);
|
||||||
|
if(el.get('text')>iTime) {
|
||||||
|
el.getParent('tr').addClass(thisObj.options.classes.filterNode);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
var lsProfiler;
|
||||||
|
|
||||||
|
window.addEvent('domready', function() {
|
||||||
|
lsProfiler = new lsProfilerClass({
|
||||||
|
img: {
|
||||||
|
path: DIR_STATIC_SKIN+'/images/'
|
||||||
|
},
|
||||||
|
classes: {
|
||||||
|
openImg: 'folding-open',
|
||||||
|
closeImg: 'folding',
|
||||||
|
filterNode: 'filter'
|
||||||
|
}
|
||||||
|
});
|
||||||
|
});
|
207
classes/plugins/profiler/templates/skin/new/js/profiler.js
Normal file
207
classes/plugins/profiler/templates/skin/new/js/profiler.js
Normal file
|
@ -0,0 +1,207 @@
|
||||||
|
var lsProfilerClass = new Class({
|
||||||
|
|
||||||
|
Implements: Options,
|
||||||
|
|
||||||
|
options: {
|
||||||
|
img : {
|
||||||
|
path: DIR_STATIC_SKIN+'/images/',
|
||||||
|
openName: 'open.gif',
|
||||||
|
closeName: 'close.gif'
|
||||||
|
},
|
||||||
|
classes: {
|
||||||
|
visible: 'lsProfiler_visible',
|
||||||
|
hidden: 'lsProfiler_hidden',
|
||||||
|
openImg: 'lsProfiler_open',
|
||||||
|
closeImg: 'lsProfiler_close',
|
||||||
|
treeNode: 'lsProfiler_tree',
|
||||||
|
filterNode: 'lsProfiler_filter'
|
||||||
|
},
|
||||||
|
prefix: {
|
||||||
|
img: 'img_',
|
||||||
|
td: 'report_',
|
||||||
|
entry: 'entry_',
|
||||||
|
tree: 'tree_',
|
||||||
|
treeNode: 'tree_node_'
|
||||||
|
},
|
||||||
|
path: {
|
||||||
|
loadReport: aRouter['profiler']+'ajaxloadreport/',
|
||||||
|
loadEntries: aRouter['profiler']+'ajaxloadentriesbyfilter/'
|
||||||
|
}
|
||||||
|
},
|
||||||
|
|
||||||
|
initialize: function(options){
|
||||||
|
this.setOptions(options);
|
||||||
|
this.make();
|
||||||
|
},
|
||||||
|
|
||||||
|
make: function(expandClass){
|
||||||
|
var thisObj = this;
|
||||||
|
var aImgFolding=(!expandClass)?$$('img.folding'):$$('img.folding.'+expandClass);
|
||||||
|
aImgFolding.each(function(img, i){thisObj.makeImg(img);});
|
||||||
|
},
|
||||||
|
|
||||||
|
makeImg: function(img) {
|
||||||
|
var thisObj = this;
|
||||||
|
img.setStyles({
|
||||||
|
'cursor' : 'pointer',
|
||||||
|
'display' : 'inline'
|
||||||
|
});
|
||||||
|
img.removeClass(this.options.classes.closeImg);
|
||||||
|
img.addClass(this.options.classes.openImg);
|
||||||
|
img.removeEvents('click');
|
||||||
|
img.addEvent('click',function(){
|
||||||
|
thisObj.toggleNode(img);
|
||||||
|
});
|
||||||
|
},
|
||||||
|
|
||||||
|
toggleNode: function(img) {
|
||||||
|
if (img.hasClass(this.options.classes.closeImg)) {
|
||||||
|
this.collapseNode(img);
|
||||||
|
} else {
|
||||||
|
this.expandNode(img);
|
||||||
|
}
|
||||||
|
},
|
||||||
|
|
||||||
|
expandNode: function(img) {
|
||||||
|
var thisObj = this;
|
||||||
|
|
||||||
|
img.setProperties({'src': this.options.img.path + this.options.img.closeName});
|
||||||
|
img.removeClass(this.options.classes.openImg);
|
||||||
|
img.addClass(this.options.classes.closeImg);
|
||||||
|
|
||||||
|
if(img.hasClass(thisObj.options.classes.treeNode)) {
|
||||||
|
// Это элемент дерева - обрабатываем его соответствующим образом
|
||||||
|
ids = img.get('id').replace(this.options.prefix.tree,'').split('_');
|
||||||
|
|
||||||
|
reportId=ids[0];
|
||||||
|
var trReportId=this.options.prefix.treeNode+ids[0]+'_'+ids[1];
|
||||||
|
var trReport=$(trReportId);
|
||||||
|
var parentId=ids[1];
|
||||||
|
} else {
|
||||||
|
reportId=img.get('id').replace(this.options.prefix.img,this.options.prefix.td);
|
||||||
|
var trReport = $(reportId);
|
||||||
|
var parentId = 0;
|
||||||
|
var trReportId = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
if(trReport){
|
||||||
|
trReport.show();
|
||||||
|
} else {
|
||||||
|
thisObj.loadReport(img.getParent('tr'),reportId,parentId,trReportId);
|
||||||
|
}
|
||||||
|
},
|
||||||
|
|
||||||
|
loadReport: function(obj,reportId,parentId,namedId) {
|
||||||
|
var thisObj=this;
|
||||||
|
var trCurrent = obj;
|
||||||
|
|
||||||
|
JsHttpRequest.query(
|
||||||
|
'POST '+thisObj.options.path.loadReport,
|
||||||
|
{
|
||||||
|
reportId: reportId,
|
||||||
|
bTreeView: true,
|
||||||
|
parentId: parentId,
|
||||||
|
security_ls_key: LIVESTREET_SECURITY_KEY
|
||||||
|
},
|
||||||
|
function(result, errors) {
|
||||||
|
if (!result) {
|
||||||
|
msgErrorBox.alert('Error','Please try again later');
|
||||||
|
}
|
||||||
|
if (result.bStateError) {
|
||||||
|
msgErrorBox.alert(result.sMsgTitle,result.sMsg);
|
||||||
|
} else {
|
||||||
|
var trReport=new Element('tr', {'id':(!namedId)?reportId:namedId});
|
||||||
|
trReport.adopt(new Element('td',{
|
||||||
|
'colspan': 6,
|
||||||
|
'html' : result.sReportText
|
||||||
|
}));
|
||||||
|
trReport.inject(trCurrent,'after');
|
||||||
|
trReport.getElements('img').each(function(img, i){thisObj.makeImg(img);});
|
||||||
|
}
|
||||||
|
},
|
||||||
|
true
|
||||||
|
);
|
||||||
|
},
|
||||||
|
|
||||||
|
collapseNode: function(img) {
|
||||||
|
var thisObj = this;
|
||||||
|
|
||||||
|
img.setProperties({'src': this.options.img.path + this.options.img.openName});
|
||||||
|
img.removeClass(this.options.classes.closeImg);
|
||||||
|
img.addClass(this.options.classes.openImg);
|
||||||
|
|
||||||
|
if(img.hasClass(thisObj.options.classes.treeNode)) {
|
||||||
|
// Это элемент дерева - обрабатываем его соответствующим образом
|
||||||
|
trReport=img.getParent('tr').getNext('tr');
|
||||||
|
} else {
|
||||||
|
reportId=img.get('id').replace(this.options.prefix.img,this.options.prefix.td);
|
||||||
|
var trReport = $(reportId);
|
||||||
|
}
|
||||||
|
|
||||||
|
trReport.hide();
|
||||||
|
},
|
||||||
|
|
||||||
|
toggleEntriesByClass: function(reportId,name,link) {
|
||||||
|
var thisObj=this;
|
||||||
|
$$('a.profiler').removeClass('active');
|
||||||
|
$$('a.profiler.'+name).addClass('active');
|
||||||
|
|
||||||
|
//var trCurrent = link.getParent('tr').getPrevious('tr');
|
||||||
|
|
||||||
|
JsHttpRequest.query(
|
||||||
|
'POST '+thisObj.options.path.loadEntries+name+'/',
|
||||||
|
{
|
||||||
|
reportId: reportId,
|
||||||
|
security_ls_key: LIVESTREET_SECURITY_KEY
|
||||||
|
},
|
||||||
|
function(result, errors) {
|
||||||
|
if (!result) {
|
||||||
|
msgErrorBox.alert('Error','Please try again later');
|
||||||
|
}
|
||||||
|
if (result.bStateError) {
|
||||||
|
msgErrorBox.alert(result.sMsgTitle,result.sMsg);
|
||||||
|
} else {
|
||||||
|
var trReport = $(thisObj.options.prefix.td+reportId).empty();
|
||||||
|
trReport.adopt(new Element('td',{
|
||||||
|
'colspan': 5,
|
||||||
|
'html' : result.sReportText
|
||||||
|
}));
|
||||||
|
trReport.getElements('img').each(function(img, i){thisObj.makeImg(img);});
|
||||||
|
}
|
||||||
|
},
|
||||||
|
true
|
||||||
|
);
|
||||||
|
},
|
||||||
|
|
||||||
|
filterNode: function(obj) {
|
||||||
|
var thisObj = this;
|
||||||
|
var iTime=obj.get('value');
|
||||||
|
if(iTime!='' && parseFloat(iTime)){ thisObj.highlightFilterNode(iTime); }
|
||||||
|
},
|
||||||
|
|
||||||
|
highlightFilterNode: function(iTime) {
|
||||||
|
var thisObj = this;
|
||||||
|
|
||||||
|
$$('.time').each(function(el,i){
|
||||||
|
el.getParent('tr').removeClass(thisObj.options.classes.filterNode);
|
||||||
|
if(el.get('text')>iTime) {
|
||||||
|
el.getParent('tr').addClass(thisObj.options.classes.filterNode);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
var lsProfiler;
|
||||||
|
|
||||||
|
window.addEvent('domready', function() {
|
||||||
|
lsProfiler = new lsProfilerClass({
|
||||||
|
img: {
|
||||||
|
path: DIR_STATIC_SKIN+'/images/'
|
||||||
|
},
|
||||||
|
classes: {
|
||||||
|
openImg: 'folding-open',
|
||||||
|
closeImg: 'folding',
|
||||||
|
filterNode: 'filter'
|
||||||
|
}
|
||||||
|
});
|
||||||
|
});
|
|
@ -289,6 +289,7 @@ $config['router']['page']['link'] = 'ActionLink';
|
||||||
$config['router']['page']['question'] = 'ActionQuestion';
|
$config['router']['page']['question'] = 'ActionQuestion';
|
||||||
$config['router']['page']['blogs'] = 'ActionBlogs';
|
$config['router']['page']['blogs'] = 'ActionBlogs';
|
||||||
$config['router']['page']['search'] = 'ActionSearch';
|
$config['router']['page']['search'] = 'ActionSearch';
|
||||||
|
$config['router']['page']['plugins'] = 'ActionPlugins';
|
||||||
// Глобальные настройки роутинга
|
// Глобальные настройки роутинга
|
||||||
$config['router']['config']['action_default'] = 'index';
|
$config['router']['config']['action_default'] = 'index';
|
||||||
$config['router']['config']['action_not_found'] = 'error';
|
$config['router']['config']['action_not_found'] = 'error';
|
||||||
|
|
|
@ -274,8 +274,8 @@ class Engine extends Object {
|
||||||
protected function InitPlugins() {
|
protected function InitPlugins() {
|
||||||
if($aPluginList = @file(Config::Get('path.root.server').'/classes/plugins/plugins.dat')) {
|
if($aPluginList = @file(Config::Get('path.root.server').'/classes/plugins/plugins.dat')) {
|
||||||
foreach ($aPluginList as $sPluginName) {
|
foreach ($aPluginList as $sPluginName) {
|
||||||
$sDirHooks=Config::Get('path.root.server').'/classes/plugins/';
|
$sDirPlugins=Config::Get('path.root.server').'/classes/plugins/';
|
||||||
$sFile="{$sDirHooks}{$sPluginName}/classes/hooks/Plugin{$sPluginName}.class.php";
|
$sFile="{$sDirPlugins}{$sPluginName}/Plugin{$sPluginName}.class.php";
|
||||||
if(is_file($sFile)) {
|
if(is_file($sFile)) {
|
||||||
require_once($sFile);
|
require_once($sFile);
|
||||||
|
|
||||||
|
|
|
@ -38,15 +38,15 @@ abstract class Plugin extends Object {
|
||||||
*
|
*
|
||||||
*/
|
*/
|
||||||
public function Activate() {
|
public function Activate() {
|
||||||
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Функция деактивации плагина
|
* Функция деактивации плагина
|
||||||
*
|
*
|
||||||
*/
|
*/
|
||||||
public function Deativate() {
|
public function Deactivate() {
|
||||||
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
public function __call($sName,$aArgs) {
|
public function __call($sName,$aArgs) {
|
||||||
|
|
157
engine/modules/plugin/Plugin.class.php
Normal file
157
engine/modules/plugin/Plugin.class.php
Normal file
|
@ -0,0 +1,157 @@
|
||||||
|
<?php
|
||||||
|
/*-------------------------------------------------------
|
||||||
|
*
|
||||||
|
* 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
|
||||||
|
*
|
||||||
|
---------------------------------------------------------
|
||||||
|
*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Модуль управления плагинами сообщений
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
class LsPlugin extends Module {
|
||||||
|
/**
|
||||||
|
* Файл содержащий информацию об активированных плагинах
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
const PLUGIN_ACTIVATION_FILE = 'plugins.dat';
|
||||||
|
/**
|
||||||
|
* Путь к директории с плагинами
|
||||||
|
*
|
||||||
|
* @var string
|
||||||
|
*/
|
||||||
|
protected $sPluginsDir;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Список плагинов
|
||||||
|
*
|
||||||
|
* @var unknown_type
|
||||||
|
*/
|
||||||
|
protected $aPluginsList=array();
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Инициализация модуля
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
public function Init() {
|
||||||
|
$this->sPluginsDir=Config::Get('path.root.server').'/classes/plugins/';
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Получает список информации о всех плагинах, загруженных в plugin-директорию
|
||||||
|
*
|
||||||
|
* @return array
|
||||||
|
*/
|
||||||
|
public function GetList() {
|
||||||
|
$aList=array_map('basename',glob($this->sPluginsDir.'*',GLOB_ONLYDIR));
|
||||||
|
$aActivePlugins=$this->GetActivePlugins();
|
||||||
|
|
||||||
|
foreach($aList as $sPlugin) {
|
||||||
|
$this->aPluginsList[$sPlugin] = array(
|
||||||
|
'code' => $sPlugin,
|
||||||
|
'is_active' => in_array($sPlugin,$aActivePlugins),
|
||||||
|
'name' => '',
|
||||||
|
'author' => '',
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
return $this->aPluginsList;
|
||||||
|
}
|
||||||
|
|
||||||
|
public function Toggle($sPlugin,$sAction) {
|
||||||
|
$aPlugins=$this->GetList();
|
||||||
|
if(!isset($aPlugins[$sPlugin])) return null;
|
||||||
|
|
||||||
|
$sPluginName=ucfirst($sPlugin);
|
||||||
|
|
||||||
|
switch ($sAction) {
|
||||||
|
case 'activate':
|
||||||
|
case 'deactivate':
|
||||||
|
$sAction=ucfirst($sAction);
|
||||||
|
|
||||||
|
$sFile="{$this->sPluginsDir}{$sPlugin}/Plugin{$sPluginName}.class.php";
|
||||||
|
if(is_file($sFile)) {
|
||||||
|
require_once($sFile);
|
||||||
|
|
||||||
|
$sClassName="Plugin{$sPluginName}";
|
||||||
|
$oPlugin=new $sClassName;
|
||||||
|
$bResult=$oPlugin->$sAction();
|
||||||
|
}
|
||||||
|
|
||||||
|
if($bResult) {
|
||||||
|
/**
|
||||||
|
* Переопределяем список активированных пользователем плагинов
|
||||||
|
*/
|
||||||
|
$aActivePlugins=$this->GetActivePlugins();
|
||||||
|
if($sAction=='Activate') {
|
||||||
|
/**
|
||||||
|
* Вносим данные в файл об активации плагина
|
||||||
|
*/
|
||||||
|
$aActivePlugins[] = $sPlugin;
|
||||||
|
} else {
|
||||||
|
/**
|
||||||
|
* Вносим данные в файл о деактивации плагина
|
||||||
|
*/
|
||||||
|
$aIndex=array_keys($aActivePlugins,$sPlugin);
|
||||||
|
if(is_array($aIndex)) {
|
||||||
|
unset($aActivePlugins[array_shift($aIndex)]);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
$this->SetActivePlugins($aActivePlugins);
|
||||||
|
}
|
||||||
|
return $bResult;
|
||||||
|
|
||||||
|
default:
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Возвращает список активированных плагинов в системе
|
||||||
|
*
|
||||||
|
* @return array
|
||||||
|
*/
|
||||||
|
public function GetActivePlugins() {
|
||||||
|
/**
|
||||||
|
* Читаем данные из файла PLUGINS.DAT
|
||||||
|
*/
|
||||||
|
$aPlugins=@file($this->sPluginsDir.self::PLUGIN_ACTIVATION_FILE);
|
||||||
|
|
||||||
|
if(is_array($aPlugins)) $aPlugins = array_unique($aPlugins);
|
||||||
|
return $aPlugins;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Записывает список активных плагинов в файл PLUGINS.DAT
|
||||||
|
*
|
||||||
|
* @param array|string $aPlugins
|
||||||
|
*/
|
||||||
|
public function SetActivePlugins($aPlugins) {
|
||||||
|
if(!is_array($aPlugins)) $aPlugins = array($aPlugins);
|
||||||
|
$aPlugins=array_unique($aPlugins);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Записываем данные в файл PLUGINS.DAT
|
||||||
|
*/
|
||||||
|
file_put_contents($this->sPluginsDir.self::PLUGIN_ACTIVATION_FILE, implode(PHP_EOL,$aPlugins));
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* При завершении работы модуля
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
public function Shutdown() {
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
?>
|
|
@ -765,6 +765,19 @@ return array(
|
||||||
'notify_subject_reminder_code' => 'Восстановление пароля',
|
'notify_subject_reminder_code' => 'Восстановление пароля',
|
||||||
'notify_subject_reminder_password' => 'Новый пароль',
|
'notify_subject_reminder_password' => 'Новый пароль',
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Страница администрирования плагинов
|
||||||
|
*/
|
||||||
|
'plugins_administartion_title' => 'Администрирование плагинов',
|
||||||
|
'plugins_plugin_name' => 'Название',
|
||||||
|
'plugins_plugin_author' => 'Автор',
|
||||||
|
'plugins_plugin_version' => 'Версия',
|
||||||
|
'plugins_plugin_action' => '',
|
||||||
|
'plugins_plugin_activate' => 'Активировать',
|
||||||
|
'plugins_plugin_deactivate' => 'Деактивировать',
|
||||||
|
'plugins_unknown_action' => 'Указано неизвестное действие',
|
||||||
|
'plugins_action_ok' => 'Успешно выполнено',
|
||||||
|
|
||||||
|
|
||||||
'system_error_event_args' => 'Некорректное число аргументов при добавлении евента',
|
'system_error_event_args' => 'Некорректное число аргументов при добавлении евента',
|
||||||
'system_error_event_method' => 'Добавляемый метод евента не найден',
|
'system_error_event_method' => 'Добавляемый метод евента не найден',
|
||||||
|
|
27
templates/skin/new/actions/ActionPlugins/index.tpl
Normal file
27
templates/skin/new/actions/ActionPlugins/index.tpl
Normal file
|
@ -0,0 +1,27 @@
|
||||||
|
{include file='header.tpl' showWhiteBack=true}
|
||||||
|
|
||||||
|
<div class="page people top-blogs plugins">
|
||||||
|
<table>
|
||||||
|
<thead>
|
||||||
|
<tr>
|
||||||
|
<td class="name">{$aLang.plugins_plugin_name}</td>
|
||||||
|
<td class="version">{$aLang.plugins_plugin_version}</td>
|
||||||
|
<td class="author">{$aLang.plugins_plugin_author}</td>
|
||||||
|
<td class="action">{$aLang.plugins_plugin_action}</td>
|
||||||
|
</tr>
|
||||||
|
</thead>
|
||||||
|
|
||||||
|
<tbody>
|
||||||
|
{foreach from=$aPlugins item=aPlugin}
|
||||||
|
<tr>
|
||||||
|
<td class="name"><a class="title">{$aPlugin.code}</a></td>
|
||||||
|
<td class="version">-</td>
|
||||||
|
<td class="author">-</td>
|
||||||
|
<td class="{if $aPlugin.is_active}deactivate{else}activate{/if}"><strong>{if $aPlugin.is_active}<a href="{router page='plugins'}?plugin={$aPlugin.code}&action=deactivate">{$aLang.plugins_plugin_deactivate}</a>{else}<a href="{router page='plugins'}?plugin={$aPlugin.code}&action=activate">{$aLang.plugins_plugin_activate}</a>{/if}</strong></td>
|
||||||
|
</tr>
|
||||||
|
{/foreach}
|
||||||
|
</tbody>
|
||||||
|
</table>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
{include file='footer.tpl'}
|
|
@ -715,6 +715,23 @@ a.profiler.active { background: #70aae0; color: white; }
|
||||||
.profiler-table .filter { background:#ffb5c5; }
|
.profiler-table .filter { background:#ffb5c5; }
|
||||||
.profiler-highlight { margin: 0px; text-align:center; background: #dafad8; border: 1px solid #83c460; padding: 2px; color: #4bb23b; }
|
.profiler-highlight { margin: 0px; text-align:center; background: #dafad8; border: 1px solid #83c460; padding: 2px; color: #4bb23b; }
|
||||||
|
|
||||||
|
/* Plugins
|
||||||
|
-------------------------------------------------------------------*/
|
||||||
|
|
||||||
|
.plugins thead td.name { padding-left: 32px; }
|
||||||
|
.plugins thead td.version, .plugins td.version { width: 40px; text-align: center; }
|
||||||
|
.plugins thead td.author, .plugins td.author, .plugins tbody td.action { width: 120px; text-align: center; }
|
||||||
|
.plugins tbody td { padding: 7px 0; }
|
||||||
|
.plugins td.name { overflow: hidden; }
|
||||||
|
.plugins td.name img { float: left; padding-bottom: 5px; margin-right: 7px; width: 24px; height: 24px; }
|
||||||
|
.plugins td.name a.title { font-size: 18px; line-height: 14px; }
|
||||||
|
.plugins td.name a.author { line-height: 18px; background:url(../images/icons.gif) no-repeat scroll 0 -108px; padding-left: 12px; color: #999; font-weight: bold; }
|
||||||
|
.plugins td.activate, .plugins td.deactivate { width: 120px; text-align: right; }
|
||||||
|
.plugins td.activate strong { background: #6ec80d; color: #fff; padding: 5px 10px; }
|
||||||
|
.plugins td.deactivate strong { background: #ff68cf; color: #fff; padding: 5px 10px; }
|
||||||
|
.plugins td.activate strong a, .plugins td.deactivate strong a { color: white; text-decoration: none; }
|
||||||
|
|
||||||
|
|
||||||
/* Footer
|
/* Footer
|
||||||
-------------------------------------------------------------------*/
|
-------------------------------------------------------------------*/
|
||||||
#footer .right { float: right; }
|
#footer .right { float: right; }
|
||||||
|
|
Loading…
Reference in a new issue