<?php
/**
* This file implements the UI view for the plugin settings.
*
* @todo dh> Move plugin's group name to DB setting?!
* fp> this would actually make more sense than renaming the name and code of plugins, but it's still complexity we don't really need.
* fp> When you reach that level of needs you're already a plugin maniac/developper and you hack the plugin php code anyway.
*
* This file is part of the evoCore framework - {@link http://evocore.net/}
* See also {@link https://github.com/b2evolution/b2evolution}.
*
* @license GNU GPL v2 - {@link http://b2evolution.net/about/gnu-gpl-license}
*
* @copyright (c)2003-2020 by Francois Planque - {@link http://fplanque.com/}
* Parts of this file are copyright (c)2004-2006 by Daniel HAHLER - {@link http://thequod.de/contact}.
*
* @package admin
*/
if( !defined('EVO_MAIN_INIT') ) die( 'Please, do not access this page directly.' );
/**
* @var Plugins
*/
global $admin_Plugins;
global $Session;
$fadeout_id = $Session->get('fadeout_id');
$SQL = new SQL();
$SQL->SELECT( 'plug_status, plug_ID, plug_priority, plug_code' );
$SQL->FROM( 'T_plugins' );
$Results = new Results( $SQL->get(), 'plug_', '--A' /* by name */, 0 /* no limit */ );
$Results->Cache = & $admin_Plugins;
/*
// TODO: dh> make this an optional view (while also removing the "group" col then)?
// It's nice to have, but does not allow sorting by priority really..
// fp> Yes, 90% of the time, seing a grouped list is what we'd need most. (sorted by priority within each group by default)
// in the remaining 10% we need an overall priority view because a plugin is not in the right group or more problematic: in multiple groups
// BTW, when does the priority apply besides for rendering? I think we should document that at the bottom of the screen. ("Apply" needs an short explanation too).
// BTW, "category" or "class" or "family" would be a better name for plugin "group"s. "group" sounds arbitrary. I think this should convey the idea of a "logical grouping" by "main" purpose of the plugin.
//
$Results->group_by_obj_prop = 'group';
$Results->grp_cols[] = array(
'td' => '% ( empty( {Obj}->group ) && $this->current_group_count[0] > 1 ? T_(\'Un-Grouped\') : {Obj}->group ) %',
'td_colspan' => 0,
);
*/
$Results->title = T_('Installed plugins').get_manual_link('installed-plugins');
if( count( $admin_Plugins->get_plugin_groups() ) )
{
/*
* Grouping params:
*/
$Results->group_by_obj_prop = 'group';
/*
* Group columns:
*/
$Results->grp_cols[] = array(
'td_colspan' => 0,
'td' => '~conditional( {Obj}->group != "", {Obj}->group, "'.T_('Unclassified').'" )~',
);
}
/*
* STATUS TD:
*/
function plugin_results_td_status( $plug_status, $plug_ID )
{
global $admin_Plugins, $admin_url;
$perm_edit = check_user_perm( 'options', 'edit', false );
if( $plug_status == 'enabled' )
{ // Enabled
if( $perm_edit )
{ // URL to disable the plugin
$plugin_status_url = $admin_url.'?ctrl=plugins&action=disable_plugin&plugin_ID='.$plug_ID.'&'.url_crumb( 'plugin' );
}
$plugin_status_icon = get_icon( 'bullet_green', 'imgtag', array( 'title' => T_('The plugin is enabled.') ) );
}
elseif( $plug_status == 'broken' )
{ // Broken
$plugin_status_icon = get_icon( 'warning', 'imgtag', array(
'title' => T_('The plugin is broken.')
.// Display load error from Plugins::register() (if any):
( isset( $admin_Plugins->plugin_errors[ $plug_ID ] )
&& ! empty( $admin_Plugins->plugin_errors[ $plug_ID ]['register'] )
? ' '.$admin_Plugins->plugin_errors[ $plug_ID ]['register']
: '' )
) );
}
elseif( $plug_status == 'needs_config' )
{ // Needs config
if( $perm_edit )
{ // URL to edit plugin settings
$plugin_status_url = $admin_url.'?ctrl=plugins&action=edit_settings&plugin_ID='.$plug_ID;
}
$plugin_status_icon = get_icon( 'question', 'imgtag', array( 'title' => T_('The plugin is not installed completely.') ) );
}
else
{ // Disabled
if( $perm_edit )
{ // URL to enable the plugin
$plugin_status_url = $admin_url.'?ctrl=plugins&action=enable_plugin&plugin_ID='.$plug_ID.'&'.url_crumb( 'plugin' );
}
$plugin_status_icon = get_icon( 'bullet_empty_grey', 'imgtag', array( 'title' => T_('The plugin is disabled.') ) );
}
if( isset( $plugin_status_url ) )
{
return '<a href="'.$plugin_status_url.'">'.$plugin_status_icon.'</a>';
}
else
{
return $plugin_status_icon;
}
}
$Results->cols[] = array(
'th' => /* TRANS: shortcut for enabled */ T_('En'),
'th_title' => T_('Enabled'),
'order' => 'plug_status',
'td' => '%plugin_results_td_status( #plug_status#, #plug_ID# )%',
'td_class' => 'center',
);
/*
* PLUGIN NAME TD:
*/
function plugin_results_td_name( $Plugin )
{
$r = '<strong>'.$Plugin->name.'</strong>';
if( check_user_perm( 'options', 'edit', false ) )
{ // Wrap in "edit settings" link:
$r = '<a href="'.regenerate_url( '', 'action=edit_settings&plugin_ID='.$Plugin->ID )
.'" title="'.T_('Edit plugin settings!').'">'.$r.'</a>';
}
return $r;
}
function plugin_results_name_order_callback( $a, $b, $order )
{
$r = strcasecmp( $a->name, $b->name );
if( $order == 'DESC' ) { $r = -$r; }
return $r;
}
$Results->cols[] = array(
'th' => T_('Plugin'),
'order_objects_callback' => 'plugin_results_name_order_callback',
'td' => '% plugin_results_td_name( {Obj} ) %',
);
/*
* PRIORITY TD:
*/
$Results->cols[] = array(
'th' => T_('Priority'),
'order' => 'plug_priority',
'td' => '$plug_priority$',
'td_class' => 'right',
);
/*
* PLUGIN DESCRIPTION TD:
*/
function plugin_results_desc_order_callback( $a, $b, $order )
{
$r = strcasecmp( $a->short_desc, $b->short_desc );
if( $order == 'DESC' ) { $r = -$r; }
return $r;
}
$Results->cols[] = array(
'th' => T_('Description'),
'td' => '% {Obj}->short_desc %',
'order_objects_callback' => 'plugin_results_desc_order_callback',
);
/*
* PLUGIN CODE TD:
*/
$Results->cols[] = array(
'th' => /* TRANS: Code of a plugin */ T_('Code'),
'th_title' => T_('The code to call the plugin by code (SkinTag) or as Renderer.'),
'order' => 'plug_code',
'td' => '% {Obj}->code %',
);
/*
* VERSION TD:
*/
function plugin_results_td_version( $Plugin )
{
return '<a href="'.regenerate_url( 'action,plugin_class', 'action=info&plugin_class='.$Plugin->classname )
.'">'.$Plugin->version.'</a>';
}
$Results->cols[] = array(
'th' => T_('Version'),
'td' => '% plugin_results_td_version( {Obj} ) %'
);
/*
* HELP TD:
*/
function plugin_results_td_help( $Plugin )
{
return action_icon( T_('Display info'), 'info', regenerate_url( 'action,plugin_class', 'action=info&plugin_class='.$Plugin->classname ) )
// Help icons, if available:
.$Plugin->get_help_link('$help_url');
}
$Results->cols[] = array(
'th' => T_('Help'),
'td_class' => 'nowrap',
'td' => '% plugin_results_td_help( {Obj} ) %',
);
/*
* ACTIONS TD:
*/
function plugin_results_td_actions( $Plugin )
{
global $admin_url;
$r = '';
if( $Plugin->status == 'enabled' )
{
$r .= action_icon( T_('Disable the plugin!'), 'deactivate', $admin_url.'?ctrl=plugins&action=disable_plugin&plugin_ID='.$Plugin->ID.'&'.url_crumb( 'plugin' ) );
}
elseif( $Plugin->status != 'broken' )
{
$r .= action_icon( T_('Enable the plugin!'), 'activate', $admin_url.'?ctrl=plugins&action=enable_plugin&plugin_ID='.$Plugin->ID.'&'.url_crumb( 'plugin' ) );
}
$r .= $Plugin->get_edit_settings_link();
$r .= action_icon( T_('Un-install this plugin!'), 'delete', $admin_url.'?ctrl=plugins&action=uninstall&plugin_ID='.$Plugin->ID.'&'.url_crumb( 'plugin' ) );
return $r;
}
if( check_user_perm( 'options', 'edit', false ) )
{
$Results->cols[] = array(
'th' => T_('Actions'),
'td' => '% plugin_results_td_actions( {Obj} ) %',
'td_class' => 'shrinkwrap',
);
}
// Action icons:
if( check_user_perm( 'options', 'edit' ) )
{ // Display action link to reload plugins:
$Results->global_icon( T_('Reload events and codes for installed plugins.'), 'reload', regenerate_url( 'action', 'action=reload_plugins' ).'&'.url_crumb('plugin'), T_('Reload plugins'), 3, 4 );
}
$Results->global_icon( T_('Install new plugin...'), 'new', regenerate_url( 'action', 'action=list_available' ), T_('Install new'), 3, 4, array( 'class' => 'action_icon btn-primary' ) );
// if there happened something with a plugin, apply fadeout to the row:
$highlight_fadeout = empty($fadeout_id) /* may be error string */ ? array() : array( 'plug_ID'=>array($fadeout_id) );
$Results->display( NULL, $highlight_fadeout );
unset($Results); // free memory
//Flush fadeout
$Session->delete( 'fadeout_id');
?>