<?php
interface IPlugin {
public function set_hooks();
public function plugin_info();
public function deactivate();
}
function __autoload($class) {
include(getcwd() . "/plugins/" . ucfirst($class) . ".php");
}
/*
Static class responsible for every plugin
*/
class Plugins {
private static $plugins = array();
private static $hooks = array();
private static $plugin_count = 0;
private static $hook_count = 0;
public function __construct() {
$dir = opendir(getcwd() . '/plugins');
while (false !== ($filename = readdir($dir))) {
if (stripos($filename, '.php') === false || strcmp($filename, 'IPlugin.php') == 0)
continue;
$name = str_replace('.php', '', $filename);
array_push(self::$plugins, array(
'name' => $name,
'filename' => $filename,
'filepath' => getcwd().'/plugins/'.$filename
)
);
self::$plugin_count++;
self::add_hook($name, true);
}
}
public static function add_hook($name, $activate) {
$hooks = self::$hooks;
$length = count($hooks);
for ($i = 0; $i < $length; $i++)
if (in_array($name, $hooks[$i]) == true) {
if ($hooks[$i]['name'] !== $name)
continue;
self::$hooks[$i]['activate'] = 1;
self::$hook_count++;
return;
}
array_push(self::$hooks, array(
'name' => $name,
'activate' => $activate
)
);
self::$hook_count++;
}
public static function remove_hook($name) {
$hooks = self::$hooks;
$length = count($hooks);
$name = str_replace('.php', '', $name);
for ($i = 0; $i < $length; $i++) {
if ($hooks[$i]['name'] !== $name)
continue;
self::$hook_count--;
self::$hooks[$i]['activate'] = 0;
}
}
public static function run_hooks($hook) {
$plugins = self::$plugins;
$hooks = self::$hooks;
for ($i = 0; $i < count($hooks); $i++) {
$plugin = self::getPluginObject($hooks[$i]['name']);
if ($hooks[$i]['activate'] == 0) {
$hook_defunc = 'deactivate_' . $hook;
$func = is_callable(array($plugin, $hook_defunc));
if (!$func)
$plugin->deactivate();
else
$plugin->$hook_defunc();
continue;
}
$plugin_hooks = count($plugin->set_hooks());
for ($i2 = 0; $i2 < $plugin_hooks; $i2++)
if (strcasecmp($plugin_hooks[$i2], $hook) != 0)
continue;
$hook_func = 'activate_' . $hook;
$func = is_callable(array($plugin, $hook_func));
if (!$func)
$plugin->deactivate();
else
$plugin->$hook_func();
}
}
public static function getPluginObject($name) {
$plugins = self::$plugins;
$plugin_count = count($plugins);
for ($i = 0; $i < $plugin_count; $i++) {
if ($plugins[$i]['name'] !== $name)
continue;
return new $plugins[$i]['name']();
}
return null;
}
public static function getPluginCount() {
return self::$plugin_count;
}
public static function getHookCount() {
return self::$hook_count;
}
public static function get_plugins() {
return self::$plugins;
}
public static function get_hooks() {
return self::$hooks;
}
}
class TestPlugin implements IPlugin {
public function set_hooks() {
return array(
'index_bottom', 'index_content'
);
}
public function plugin_info() {
return array(
'name' => 'Test Plugin',
'version' => 1.1
);
}
public function activate_index_bottom() {
echo '<p>This will activate if the index_bottom hook is used</p>';
}
public function deactivate_index_bottom() {
echo 'DEACTIVATE INDEX BOTTOM';
}
public function activate_index_content() {
echo '<a href="lol.php" alt="">lolfags</a>';
}
public function deactivate_index_content() {
echo 'DEACTIVATE';
}
// invoked if other hook functions fail for any reason
public function deactivate() {
echo '<h1>Plugin system broken!!?!?!?</h1>';
}
}
echo '<html><head></head><body><p>blabla</p>';
$plugins = new Plugins();
$plugins->run_hooks('index_content');
echo '<hr />';
$plugins->run_hooks('index_bottom');
echo '<p>woot</p></body></html>';
preferences:
38 ms | 402 KiB | 5 Q