- b2evolution CMS Support Forums
- b2evolution Support
- Plugins & Extensions
- [Hack][1.8] Plugin Grouping
1 balupton Jul 10, 2006 21:20
Anyway seeing 1.8 just got released, here are the modifications that let you have grouping for your plugins.
Firstly here is a screenshot;
http://blogs.balupton.com/plugins/plugin_grouping_v1.0.0.0.gif
And heres the modifications;
[ File: /blogs/inc/_misc/_plugins.class.php ]
Add the following anywhere inside the Plugins Class:
/**
* Will return an array that contents are references to plugins that have the same group, regardless of the sub_group.
*/
function get_Plugins_in_group ( $group ) {
$result = array();
foreach( $this->sorted_IDs as $plugin_ID )
{
$Plugin = & $this->get_by_ID( $plugin_ID );
if( $Plugin->group == $group )
$result[] = & $Plugin;
}
return $result;
}
/**
* Will return an array that contents are references to plugins that have the same group and sub_group.
*/
function get_Plugins_in_sub_group ( $group, $sub_group = '' ) {
$result = array();
foreach( $this->sorted_IDs as $plugin_ID )
{
$Plugin = & $this->get_by_ID( $plugin_ID );
if( $Plugin->group == $group && $Plugin->sub_group == $sub_group )
$result[] = & $Plugin;
}
return $result;
}
/**
* Callback function to sort plugins by group.
*
* WARNING: do NOT sort by anything else than priority unless you're handling a list of NOT-YET-INSTALLED plugins
*/
function sort_Plugin_group( & $a_ID, & $b_ID )
{
$a_Plugin = & $this->get_by_ID( $a_ID );
$b_Plugin = & $this->get_by_ID( $b_ID );
// Compare Group
$r = strcasecmp( $a_Plugin->group, $b_Plugin->group );
if( $r != 0 )
return $r;
else {
// Compare Sub Group
$r = strcasecmp( $a_Plugin->sub_group, $b_Plugin->sub_group );
if( $r != 0 )
return $r;
else {
// Compare Name
return strcasecmp( $a_Plugin->name, $b_Plugin->name );
}
}
}
Add the following to the switch statement inside the sort() function inside Plugins Class:
case 'group':
usort( $this->sorted_IDs, array( & $this, 'sort_Plugin_group') );
break;
So you should end up having something that looks like:
/**
* Sort the list of {@link $Plugins}.
*
* WARNING: do NOT sort by anything else than priority unless you're handling a list of NOT-YET-INSTALLED plugins!
*
* @param string Order: 'priority' (default), 'name'
*/
function sort( $order = 'priority' )
{
$this->load_plugins_table();
foreach( $this->sorted_IDs as $plugin_ID )
{ // Instantiate every plugin, so invalid ones do not get unregistered during sorting (crashes PHP, because $sorted_IDs gets changed etc)
$this->get_by_ID( $plugin_ID );
}
switch( $order )
{
case 'name':
usort( $this->sorted_IDs, array( & $this, 'sort_Plugin_name') );
break;
case 'group':
usort( $this->sorted_IDs, array( & $this, 'sort_Plugin_group') );
break;
default:
// Sort array by priority:
usort( $this->sorted_IDs, array( & $this, 'sort_Plugin_priority') );
}
}
[ File: /blogs/inc/_misc/_plugin.class.php ]
Add the following before the constructor "function Panel()":
/**
* Grouping
*/
var $group = '';
var $sub_group = '';
[ File: /blogs/inc/VIEW/_menutop.php ]
Look for the following around line 80:
global $Debuglog;
$Debuglog->add( 'Admin-Path: '.var_export($this->path, true) );
And replace with:
global $Debuglog;
$Debuglog->add( 'Admin-Path: '.var_export($this->path, true) );
if( $GLOBALS['ctrl'] == 'plugins' ) {
?>
<style type="text/css">
table.grouped tr.PluginsGroup,
table.grouped tr.PluginsSubGroup {
text-align:left;
}
table.grouped tr.PluginsGroup th,
table.grouped tr.PluginsSubGroup th {
border-left:none;
}
table.grouped tr.PluginsSeperator th {
height:7px;
background-color: #f5f3ef;
border-top: 1px solid #9e9286;
}
table.grouped tr.PluginsSubGroup th {
border-bottom: 1px solid #9e9286;
border-top: 1px solid #9e9286;
}
table.grouped tr.PluginsSubGroup th {
background-color: #efede0;
color:#666666;
}
table.grouped tr.PluginsSubGroup th,
table.grouped tr.PluginsSubGroup td.firstcol {
padding-left:15px;
}
</style>
<?php
}
[ File: /blogs/inc/VIEW/settings/_set_plugins.form.php ]
Look for the following around line 80:
<?php
$apply_rendering_values = $admin_Plugins->get_apply_rendering_values(true); // with descs
$admin_Plugins->restart(); // make sure iterator is at start position
$count = 0;
while( $loop_Plugin = & $admin_Plugins->get_next() )
{
?>
<tr class="<?php echo (($count++ % 2) ? 'odd' : 'even') ?>">
And replace with:
<?php
$apply_rendering_values = $admin_Plugins->get_apply_rendering_values(true); // with descs
// Sort the plugins by group
$admin_Plugins->sort('group');
// Grouping
$current_group = false; // False so it does the header once
$current_sub_group = '';
$admin_Plugins->restart(); // make sure iterator is at start position
$count = 0;
while( $loop_Plugin = & $admin_Plugins->get_next() )
{
if( $loop_Plugin->group !== $current_group ) { // Reason why $current_group is false
$current_group = $loop_Plugin->group;
$current_sub_group = '';
$count = 0;
?>
<tr class="PluginsSeperator">
<th colspan="8"></th>
</tr>
<tr class="PluginsGroup">
<th colspan="8"><?php
echo T_(
( $current_group == '' || $current_group == 'Un-Grouped' ) ? 'Un-Grouped' : $current_group
); ?></th>
</tr>
<?php
}
if( $loop_Plugin->sub_group != $current_sub_group ) {
$current_sub_group = $loop_Plugin->sub_group;
$count = 0;
?>
<tr class="PluginsSubGroup">
<th colspan="8"><?php echo T_( $current_sub_group ); ?></th>
</tr>
<?php
}
?>
<tr class="<?php echo (($count++ % 2) ? 'odd' : 'even'); if ( $current_sub_group != '' ) echo ' PluginsSubGroup'; else echo ' PluginsGroup'; ?>">
Now look for the following around line 188:
</tr>
<?php
}
?>
</tbody>
</table>
<p class="center">
<a href="admin.php?ctrl=plugins&action=reload_plugins"><?php echo T_('Reload events and codes for installed plugins.') ?></a>
</p>
</fieldset>
And replace with:
</tr>
<?php
}
// Sort the plugins by name again
$admin_Plugins->sort('name');
?>
</tbody>
</table>
<p class="center">
<a href="admin.php?ctrl=plugins&action=reload_plugins"><?php echo T_('Reload events and codes for installed plugins.') ?></a>
</p>
</fieldset>
Now find the following around line 210:
if( empty($AvailablePlugins) || ! is_a( $AvailablePlugins, 'Plugins_no_DB' ) ) // may have been instantiated for action='info'
{
// Discover available plugins:
$AvailablePlugins = & new Plugins_no_DB(); // do not load registered plugins/events from DB
$AvailablePlugins->discover();
$AvailablePlugins->sort('name');
}
?>
And replace with:
if( empty($AvailablePlugins) || ! is_a( $AvailablePlugins, 'Plugins_no_DB' ) ) // may have been instantiated for action='info'
{
// Discover available plugins:
$AvailablePlugins = & new Plugins_no_DB(); // do not load registered plugins/events from DB
$AvailablePlugins->discover();
// $AvailablePlugins->sort('name'); - Not needed as we sort by group in the next line
}
// Sort the plugins by group
$AvailablePlugins->sort('group');
?>
Now find the following around line 238:
<?php
$AvailablePlugins->restart(); // make sure iterator is at start position
$count = 0;
while( $loop_Plugin = & $AvailablePlugins->get_next() )
{
?>
<tr class="<?php echo (($count++ % 2) ? 'odd' : 'even') ?>">
And replace with:
<?php
// Grouping
$current_group = false; // False so it does the header at least once
$current_sub_group = '';
//
$AvailablePlugins->restart(); // make sure iterator is at start position
$count = 0;
while( $loop_Plugin = & $AvailablePlugins->get_next() )
{
if( $loop_Plugin->group !== $current_group ) { // Reason why $current_group is false
$current_group = $loop_Plugin->group;
$current_sub_group = '';
$count = 0;
?>
<tr class="PluginsSeperator">
<th colspan="5"></th>
</tr>
<tr class="PluginsGroup">
<th colspan="5"><?php
echo T_(
( $current_group == '' || $current_group == 'Un-Grouped' ) ? 'Un-Grouped' : $current_group
); ?></th>
</tr>
<?php
}
if( $loop_Plugin->sub_group != $current_sub_group ) {
$current_sub_group = $loop_Plugin->sub_group;
$count = 0;
?>
<tr class="PluginsSubGroup">
<th colspan="5"><?php echo T_( $current_sub_group ); ?></th>
</tr>
<?php
}
?>
<tr class="<?php echo (($count++ % 2) ? 'odd' : 'even'); if ( $current_sub_group != '' ) echo ' PluginsSubGroup'; else echo ' PluginsGroup'; ?>">
Then find the following around line 307:
</td>
</tr>
<?php
flush();
}
?>
</tbody>
</table>
</fieldset>
And replace with:
</td>
</tr>
<?php
flush();
}
// Sort the AvaliablePlugins by Name again
$AvailablePlugins->sort('name');
?>
</tbody>
</table>
</fieldset>
To add grouping to your plugins just add the variables; $group, and $sub_group, to your plugin appropriatly.
Enjoy.
Here is the cvs patch;
http://blogs.balupton.com/plugins/plugin_grouping_v-1-8.patch