00001 <?php
00002
00016
00017
00018
00019 import('plugins.Plugin');
00020
00021 define('PLUGINS_PREFIX', 'plugins/');
00022
00023 class PluginRegistry {
00030 function &getPlugins($category = null) {
00031 $plugins = &Registry::get('plugins');
00032 if ($category !== null) return $plugins[$category];
00033 return $plugins;
00034 }
00035
00039 function &getAllPlugins() {
00040 $plugins =& PluginRegistry::getPlugins();
00041 $allPlugins = array();
00042 if (is_array($plugins)) foreach ($plugins as $category => $list) {
00043 if (is_array($list)) $allPlugins += $list;
00044 }
00045 return $allPlugins;
00046 }
00047
00055 function register($category, &$plugin, $path) {
00056 $pluginName = $plugin->getName();
00057 $plugins =& PluginRegistry::getPlugins();
00058 if (!$plugins) $plugins = array();
00059
00060
00061 if (isset($plugins[$category][$pluginName])) return false;
00062
00063
00064 if (!$plugin->register($category, $path)) return false;
00065
00066 if (isset($plugins[$category])) $plugins[$category][$plugin->getName()] = &$plugin;
00067 else $plugins[$category] = array($plugin->getName() => &$plugin);
00068 Registry::set('plugins', $plugins);
00069 return true;
00070 }
00071
00077 function &getPlugin ($category, $name) {
00078 $plugins = &PluginRegistry::getPlugins();
00079 $plugin = @$plugins[$category][$name];
00080 return $plugin;
00081 }
00082
00090 function &loadCategory ($category, $forceLoad = false) {
00091 $plugins = array();
00092 $categoryDir = PLUGINS_PREFIX . $category;
00093 if (!is_dir($categoryDir)) return $plugins;
00094
00095 $handle = opendir($categoryDir);
00096 while (($file = readdir($handle)) !== false) {
00097 if ($file == '.' || $file == '..') continue;
00098 $pluginPath = "$categoryDir/$file";
00099 $pluginWrapper = "$pluginPath/index.php";
00100
00101 if (!file_exists($pluginWrapper)) continue;
00102 $plugin = include($pluginWrapper);
00103 if ($plugin && is_object($plugin)) {
00104 $plugins[$plugin->getSeq()][$pluginPath] =& $plugin;
00105 unset($plugin);
00106 }
00107 }
00108 closedir($handle);
00109
00110
00111 HookRegistry::call('PluginRegistry::loadCategory', array(&$category, &$plugins));
00112
00113
00114 ksort($plugins);
00115 foreach ($plugins as $seq => $junk1) {
00116 foreach ($plugins[$seq] as $pluginPath => $junk2) {
00117 PluginRegistry::register($category, $plugins[$seq][$pluginPath], $pluginPath);
00118 }
00119 }
00120 unset($plugins);
00121
00122
00123 $plugins = &PluginRegistry::getPlugins($category);
00124 return $plugins;
00125 }
00126
00135 function &loadPlugin($category, $pathName) {
00136 $pluginPath = PLUGINS_PREFIX . $category . '/' . $pathName;
00137 $plugin = null;
00138 if (!file_exists($pluginPath . '/index.php')) return $plugin;
00139
00140 $plugin = @include("$pluginPath/index.php");
00141 if ($plugin && is_object($plugin)) {
00142 PluginRegistry::register($category, $plugin, $pluginPath);
00143 }
00144 return $plugin;
00145 }
00146
00150 function getCategories() {
00151 $categories = array(
00152 'auth',
00153 'blocks',
00154 'citationFormats',
00155 'gateways',
00156 'generic',
00157 'implicitAuth',
00158 'importexport',
00159 'paymethod',
00160 'reports',
00161 'themes'
00162 );
00163 HookRegistry::call('PluginRegistry::getCategories', array(&$categories));
00164 return $categories;
00165 }
00166
00170 function &loadAllPlugins() {
00171 foreach (PluginRegistry::getCategories() as $category) {
00172 PluginRegistry::loadCategory($category);
00173 }
00174 $allPlugins =& PluginRegistry::getAllPlugins();
00175 return $allPlugins;
00176 }
00177 }
00178 ?>