addPsr4('Kanboard\Plugin\\', PLUGINS_DIR); $loader->register(); $dir = new DirectoryIterator(PLUGINS_DIR); foreach ($dir as $fileinfo) { if (! $fileinfo->isDot() && $fileinfo->isDir()) { $plugin = $fileinfo->getFilename(); $this->loadSchema($plugin); $this->load($plugin); } } } } /** * Load plugin * * @access public * @throws LogicException * @param string $plugin */ public function load($plugin) { $class = '\Kanboard\Plugin\\'.$plugin.'\\Plugin'; if (! class_exists($class)) { throw new LogicException('Unable to load this plugin class '.$class); } $instance = new $class($this->container); Tool::buildDic($this->container, $instance->getClasses()); Tool::buildDICHelpers($this->container, $instance->getHelpers()); $instance->initialize(); $this->plugins[] = $instance; } /** * Load plugin schema * * @access public * @param string $plugin */ public function loadSchema($plugin) { $filename = PLUGINS_DIR.'/'.$plugin.'/Schema/'.ucfirst(DB_DRIVER).'.php'; if (file_exists($filename)) { require_once($filename); $this->migrateSchema($plugin); } } /** * Execute plugin schema migrations * * @access public * @param string $plugin */ public function migrateSchema($plugin) { $last_version = constant('\Kanboard\Plugin\\'.$plugin.'\Schema\VERSION'); $current_version = $this->getSchemaVersion($plugin); try { $this->db->startTransaction(); $this->db->getDriver()->disableForeignKeys(); for ($i = $current_version + 1; $i <= $last_version; $i++) { $function_name = '\Kanboard\Plugin\\'.$plugin.'\Schema\version_'.$i; if (function_exists($function_name)) { call_user_func($function_name, $this->db->getConnection()); } } $this->db->getDriver()->enableForeignKeys(); $this->db->closeTransaction(); $this->setSchemaVersion($plugin, $i - 1); } catch (PDOException $e) { $this->db->cancelTransaction(); $this->db->getDriver()->enableForeignKeys(); throw new RuntimeException('Unable to migrate schema for the plugin: '.$plugin.' => '.$e->getMessage()); } } /** * Get current plugin schema version * * @access public * @param string $plugin * @return integer */ public function getSchemaVersion($plugin) { return (int) $this->db->table(self::TABLE_SCHEMA)->eq('plugin', strtolower($plugin))->findOneColumn('version'); } /** * Save last plugin schema version * * @access public * @param string $plugin * @param integer $version * @return boolean */ public function setSchemaVersion($plugin, $version) { $dictionary = array( strtolower($plugin) => $version ); return $this->db->getDriver()->upsert(self::TABLE_SCHEMA, 'plugin', 'version', $dictionary); } }