Open Journal Systems  3.3.0
PluginRegistry.inc.php
1 <?php
2 
17 define('PLUGINS_PREFIX', 'plugins/');
18 
20  //
21  // Public methods
22  //
30  static function &getPlugins($category = null) {
31  $plugins =& Registry::get('plugins', true, []); // Reference necessary
32  if ($category !== null) {
33  if (!isset($plugins[$category])) $plugins[$category] = [];
34  return $plugins[$category];
35  }
36  return $plugins;
37  }
38 
43  static function getAllPlugins() {
44  $plugins =& self::getPlugins();
45  $allPlugins = [];
46  if (!empty($plugins)) foreach ($plugins as $list) {
47  if (is_array($list)) $allPlugins += $list;
48  }
49  return $allPlugins;
50  }
51 
64  static function register($category, $plugin, $path, $mainContextId = null) {
65  $pluginName = $plugin->getName();
66  $plugins =& self::getPlugins();
67 
68  // Allow the plugin to register.
69  if (!$plugin->register($category, $path, $mainContextId)) return false;
70 
71  // If the plugin was already loaded, do not load it again.
72  if (isset($plugins[$category][$pluginName])) return false;
73 
74  if (isset($plugins[$category])) $plugins[$category][$pluginName] = $plugin;
75  else $plugins[$category] = [$pluginName => $plugin];
76  return true;
77  }
78 
85  static function getPlugin($category, $name) {
86  $plugins =& self::getPlugins();
87  return $plugins[$category][$name]??null;
88  }
89 
103  static function loadCategory ($category, $enabledOnly = false, $mainContextId = null) {
104  $plugins = [];
105  $categoryDir = PLUGINS_PREFIX . $category;
106  if (!is_dir($categoryDir)) return $plugins;
107 
108  if ($enabledOnly && Config::getVar('general', 'installed')) {
109  // Get enabled plug-ins from the database.
111  $products = $application->getEnabledProducts('plugins.'.$category, $mainContextId);
112  foreach ($products as $product) {
113  $file = $product->getProduct();
114  $plugin = self::_instantiatePlugin($category, $categoryDir, $file, $product->getProductClassname());
115  if ($plugin instanceof Plugin) {
116  $plugins[$plugin->getSeq()]["$categoryDir/$file"] = $plugin;
117  }
118  }
119  } else {
120  // Get all plug-ins from disk. This does not require
121  // any database access and can therefore be used during
122  // first-time installation.
123  $handle = opendir($categoryDir);
124  while (($file = readdir($handle)) !== false) {
125  if ($file == '.' || $file == '..') continue;
126  $plugin = self::_instantiatePlugin($category, $categoryDir, $file);
127  if ($plugin && is_object($plugin)) {
128  $plugins[$plugin->getSeq()]["$categoryDir/$file"] = $plugin;
129  }
130  }
131  closedir($handle);
132  }
133 
134  // Fire a hook prior to registering plugins for a category
135  // n.b.: this should not be used from a PKPPlugin::register() call to "jump categories"
136  HookRegistry::call('PluginRegistry::loadCategory', [&$category, &$plugins]);
137 
138  // Register the plugins in sequence.
139  ksort($plugins);
140  foreach ($plugins as $seq => $junk1) {
141  foreach ($plugins[$seq] as $pluginPath => $junk2) {
142  self::register($category, $plugins[$seq][$pluginPath], $pluginPath, $mainContextId);
143  }
144  }
145  unset($plugins);
146 
147  // Return the list of successfully-registered plugins.
148  $plugins =& self::getPlugins($category);
149 
150  // Fire a hook after all plugins of a category have been loaded, so they
151  // are able to interact if required
152  HookRegistry::call('PluginRegistry::categoryLoaded::' . $category, [&$plugins]);
153 
154  // Sort the plugins by priority before returning.
155  uasort($plugins, function($a, $b) {
156  return $a->getSeq() - $b->getSeq();
157  });
158 
159  return $plugins;
160  }
161 
175  static function loadPlugin($category, $pathName, $mainContextId = null) {
176  $pluginPath = PLUGINS_PREFIX . $category . '/' . $pathName;
177  if (!is_dir($pluginPath) || !file_exists($pluginPath . '/index.php')) return null;
178 
179  $plugin = @include("$pluginPath/index.php");
180  if (!is_object($plugin)) return null;
181 
182  self::register($category, $plugin, $pluginPath, $mainContextId);
183  return $plugin;
184  }
185 
196  static function getCategories() {
198  $categories = $application->getPluginCategories();
199  HookRegistry::call('PluginRegistry::getCategories', [&$categories]);
200  return $categories;
201  }
202 
208  static function loadAllPlugins($enabledOnly = false) {
209  // Retrieve and register categories (order is significant).
210  foreach (self::getCategories() as $category) {
211  self::loadCategory($category, $enabledOnly);
212  }
213  return self::getAllPlugins();
214  }
215 
216 
217  //
218  // Private helper methods
219  //
231  static function _instantiatePlugin($category, $categoryDir, $file, $classToCheck = null) {
232  if(!is_null($classToCheck) && !preg_match('/[a-zA-Z0-9]+/', $file)) throw new Exception('Invalid product name "'.$file.'"!');
233 
234  $pluginPath = "$categoryDir/$file";
235  if (!is_dir($pluginPath)) return null;
236 
237  // Try the plug-in wrapper first for backwards
238  // compatibility.
239  $pluginWrapper = "$pluginPath/index.php";
240  if (file_exists($pluginWrapper)) {
241  $plugin = include($pluginWrapper);
242  assert(is_a($plugin, $classToCheck ?: 'Plugin'));
243  return $plugin;
244  } else {
245  // Try the well-known plug-in class name next.
246  $pluginClassName = ucfirst($file).ucfirst($category).'Plugin';
247  $pluginClassFile = $pluginClassName.'.inc.php';
248  if (file_exists("$pluginPath/$pluginClassFile")) {
249  // Try to instantiate the plug-in class.
250  $pluginPackage = 'plugins.'.$category.'.'.$file;
251  $plugin = instantiate($pluginPackage.'.'.$pluginClassName, $pluginClassName, $pluginPackage, 'register');
252  assert(is_a($plugin, $classToCheck ?: 'Plugin'));
253  return $plugin;
254  }
255  }
256  return null;
257  }
258 }
259 
PluginRegistry\loadAllPlugins
static loadAllPlugins($enabledOnly=false)
Definition: PluginRegistry.inc.php:208
PluginRegistry\getPlugins
static & getPlugins($category=null)
Definition: PluginRegistry.inc.php:30
instantiate
& instantiate($fullyQualifiedClassName, $expectedTypes=null, $expectedPackages=null, $expectedMethods=null, $constructorArg=null)
Definition: functions.inc.php:165
PluginRegistry
Registry class for managing plugins.
Definition: PluginRegistry.inc.php:19
$application
$application
Definition: index.php:65
PluginRegistry\getAllPlugins
static getAllPlugins()
Definition: PluginRegistry.inc.php:43
PluginRegistry\loadCategory
static loadCategory($category, $enabledOnly=false, $mainContextId=null)
Definition: PluginRegistry.inc.php:103
Registry\get
static & get($key, $createIfEmpty=false, $createWithDefault=null)
Definition: Registry.inc.php:35
Config\getVar
static getVar($section, $key, $default=null)
Definition: Config.inc.php:35
PluginRegistry\loadPlugin
static loadPlugin($category, $pathName, $mainContextId=null)
Definition: PluginRegistry.inc.php:175
PluginRegistry\getCategories
static getCategories()
Definition: PluginRegistry.inc.php:196
Plugin
Abstract class for plugins.
Definition: Plugin.inc.php:51
PluginRegistry\getPlugin
static getPlugin($category, $name)
Definition: PluginRegistry.inc.php:85
PKPApplication\get
static get()
Definition: PKPApplication.inc.php:235
PluginRegistry\register
static register($category, $plugin, $path, $mainContextId=null)
Definition: PluginRegistry.inc.php:64
HookRegistry\call
static call($hookName, $args=null)
Definition: HookRegistry.inc.php:86
PluginRegistry\_instantiatePlugin
static _instantiatePlugin($category, $categoryDir, $file, $classToCheck=null)
Definition: PluginRegistry.inc.php:231