17 define(
'PLUGINS_PREFIX', 
'plugins/');
 
   32       if ($category !== 
null) {
 
   33          if (!isset($plugins[$category])) $plugins[$category] = [];
 
   34          return $plugins[$category];
 
   46       if (!empty($plugins)) 
foreach ($plugins as $list) {
 
   47          if (is_array($list)) $allPlugins += $list;
 
   64    static function register($category, $plugin, $path, $mainContextId = 
null) {
 
   65       $pluginName = $plugin->getName();
 
   69       if (!$plugin->register($category, $path, $mainContextId)) 
return false;
 
   72       if (isset($plugins[$category][$pluginName])) 
return false;
 
   74       if (isset($plugins[$category])) $plugins[$category][$pluginName] = $plugin;
 
   75       else $plugins[$category] = [$pluginName => $plugin];
 
   87       return $plugins[$category][$name]??
null;
 
  103    static function loadCategory ($category, $enabledOnly = 
false, $mainContextId = 
null) {
 
  105       $categoryDir = PLUGINS_PREFIX . $category;
 
  106       if (!is_dir($categoryDir)) 
return $plugins;
 
  111          $products = 
$application->getEnabledProducts(
'plugins.'.$category, $mainContextId);
 
  112          foreach ($products as $product) {
 
  113             $file = $product->getProduct();
 
  115             if ($plugin instanceof 
Plugin) {
 
  116                $plugins[$plugin->getSeq()][
"$categoryDir/$file"] = $plugin;
 
  123          $handle = opendir($categoryDir);
 
  124          while (($file = readdir($handle)) !== 
false) {
 
  125             if ($file == 
'.' || $file == 
'..') 
continue;
 
  127             if ($plugin && is_object($plugin)) {
 
  128                $plugins[$plugin->getSeq()][
"$categoryDir/$file"] = $plugin;
 
  140       foreach ($plugins as $seq => $junk1) {
 
  141          foreach ($plugins[$seq] as $pluginPath => $junk2) {
 
  142             self::register($category, $plugins[$seq][$pluginPath], $pluginPath, $mainContextId);
 
  155       uasort($plugins, 
function($a, $b) {
 
  156          return $a->getSeq() - $b->getSeq();
 
  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;
 
  179       $plugin = @include(
"$pluginPath/index.php");
 
  180       if (!is_object($plugin)) 
return null;
 
  210       foreach (self::getCategories() as $category) {
 
  232       if(!is_null($classToCheck) && !preg_match(
'/[a-zA-Z0-9]+/', $file)) 
throw new Exception(
'Invalid product name "'.$file.
'"!');
 
  234       $pluginPath = 
"$categoryDir/$file";
 
  235       if (!is_dir($pluginPath)) 
return null;
 
  239       $pluginWrapper = 
"$pluginPath/index.php";
 
  240       if (file_exists($pluginWrapper)) {
 
  241          $plugin = include($pluginWrapper);
 
  242          assert(is_a($plugin, $classToCheck ?: 
'Plugin'));
 
  246          $pluginClassName = ucfirst($file).ucfirst($category).
'Plugin';
 
  247          $pluginClassFile = $pluginClassName.
'.inc.php';
 
  248          if (file_exists(
"$pluginPath/$pluginClassFile")) {
 
  250             $pluginPackage = 
'plugins.'.$category.
'.'.$file;
 
  251             $plugin = 
instantiate($pluginPackage.
'.'.$pluginClassName, $pluginClassName, $pluginPackage, 
'register');
 
  252             assert(is_a($plugin, $classToCheck ?: 
'Plugin'));