|
|
<?php |
|
|
|
|
|
namespace Kanboard\Core\Plugin; |
|
|
|
|
|
use Composer\Autoload\ClassLoader; |
|
|
use DirectoryIterator; |
|
|
use Exception; |
|
|
use LogicException; |
|
|
use Kanboard\Core\Tool; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
class Loader extends \Kanboard\Core\Base |
|
|
{ |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
protected $plugins = array(); |
|
|
protected $incompatiblePlugins = array(); |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
public function getPlugins() |
|
|
{ |
|
|
return $this->plugins; |
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
public function getIncompatiblePlugins() |
|
|
{ |
|
|
return $this->incompatiblePlugins; |
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
public function scan() |
|
|
{ |
|
|
if (file_exists(PLUGINS_DIR)) { |
|
|
$loader = new ClassLoader(); |
|
|
$loader->addPsr4('Kanboard\Plugin\\', PLUGINS_DIR); |
|
|
$loader->register(); |
|
|
|
|
|
$dir = new DirectoryIterator(PLUGINS_DIR); |
|
|
|
|
|
foreach ($dir as $fileInfo) { |
|
|
if ($fileInfo->isDir() && substr($fileInfo->getFilename(), 0, 1) !== '.') { |
|
|
$pluginName = $fileInfo->getFilename(); |
|
|
$this->initializePlugin($pluginName); |
|
|
} |
|
|
} |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
public function loadSchema($pluginName) |
|
|
{ |
|
|
if (SchemaHandler::hasSchema($pluginName)) { |
|
|
$schemaHandler = new SchemaHandler($this->container); |
|
|
$schemaHandler->loadSchema($pluginName); |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
public function loadPlugin($pluginName) |
|
|
{ |
|
|
$className = '\Kanboard\Plugin\\'.$pluginName.'\\Plugin'; |
|
|
|
|
|
if (! class_exists($className)) { |
|
|
throw new LogicException('Unable to load this plugin class: '.$className); |
|
|
} |
|
|
|
|
|
return new $className($this->container); |
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
public function initializePlugin($pluginName) |
|
|
{ |
|
|
try { |
|
|
$plugin = $this->loadPlugin($pluginName); |
|
|
|
|
|
if (Version::isCompatible($plugin->getCompatibleVersion(), APP_VERSION)) { |
|
|
$this->loadSchema($pluginName); |
|
|
|
|
|
if (method_exists($plugin, 'onStartup')) { |
|
|
$this->dispatcher->addListener('app.bootstrap', array($plugin, 'onStartup')); |
|
|
} |
|
|
|
|
|
Tool::buildDIC($this->container, $plugin->getClasses()); |
|
|
Tool::buildDICHelpers($this->container, $plugin->getHelpers()); |
|
|
|
|
|
$plugin->initialize(); |
|
|
$this->plugins[$pluginName] = $plugin; |
|
|
} else { |
|
|
$this->incompatiblePlugins[$pluginName] = $plugin; |
|
|
$this->logger->error($pluginName.' is not compatible with this version'); |
|
|
} |
|
|
} catch (Exception $e) { |
|
|
$this->logger->critical($pluginName.': '.$e->getMessage()); |
|
|
} |
|
|
} |
|
|
} |
|
|
|