diff options
| author | Greg Roach <fisharebest@gmail.com> | 2015-03-29 15:59:42 +0100 |
|---|---|---|
| committer | Greg Roach <fisharebest@gmail.com> | 2015-03-29 20:49:35 +0100 |
| commit | e2a378d30d9bd3fff591da7a11c7cb5ead502323 (patch) | |
| tree | 3c4469c2e08eb9059efd61c40a931ada3dbc0e2c /app/Module.php | |
| parent | 06fa22107d3ca09d8b7a2c724decbc30c44d4548 (diff) | |
| download | webtrees-e2a378d30d9bd3fff591da7a11c7cb5ead502323.tar.gz webtrees-e2a378d30d9bd3fff591da7a11c7cb5ead502323.tar.bz2 webtrees-e2a378d30d9bd3fff591da7a11c7cb5ead502323.zip | |
Split class Module into static and abstract parts
Diffstat (limited to 'app/Module.php')
| -rw-r--r-- | app/Module.php | 280 |
1 files changed, 63 insertions, 217 deletions
diff --git a/app/Module.php b/app/Module.php index 3e484903d8..b901648b62 100644 --- a/app/Module.php +++ b/app/Module.php @@ -17,170 +17,16 @@ namespace Fisharebest\Webtrees; */ /** - * Class Module - base class for modules, and static functions for managing - * and maintaining modules. + * Class Module - Static functions for managing and maintaining modules. */ -abstract class Module { - /** @var string A user-friendly, localized name for this module */ - private $title; - - /** @var string The directory where the module is installed */ - private $directory; - - /** @var string[] A cached copy of the module settings */ - private $settings; - - /** - * Create a new module. - * - * @param string $directory Where is this module installed - */ - public function __construct($directory) { - $this->directory = $directory; - $this->title = $this->getTitle(); - } - - /** - * How should this module be labelled on tabs, menus, etc.? - * - * @return string - */ - abstract public function getTitle(); - - /** - * A sentence describing what this module does. - * - * @return string - */ - abstract public function getDescription(); - - /** - * What is the default access level for this module? - * - * Some modules are aimed at admins or managers, and are not generally shown to users. - * - * @return integer - */ - public function defaultAccessLevel() { - // Returns one of: Auth::PRIV_HIDE, Auth::PRIV_PRIVATE, Auth::PRIV_USER, WT_PRIV_ADMIN - return Auth::PRIV_PRIVATE; - } - - /** - * Provide a unique internal name for this module - * - * @return string - */ - public function getName() { - return basename($this->directory); - } - - /** - * Load all the settings for the module into a cache. - * - * Since modules may have many settings, and will probably want to use - * lots of them, load them all at once and cache them. - * - * @return void - */ - private function loadAllSettings() { - if ($this->settings === null) { - $this->settings = Database::prepare( - "SELECT SQL_CACHE setting_name, setting_value FROM `##module_setting` WHERE module_name = ?" - )->execute(array($this->getName()))->fetchAssoc(); - } - } - - /** - * Get a module setting. Return a default if the setting is not set. - * - * @param string $setting_name - * @param string $default - * - * @return string|null - */ - public function getSetting($setting_name, $default = null) { - $this->loadAllSettings(); - - if (array_key_exists($setting_name, $this->settings)) { - return $this->settings[$setting_name]; - } else { - return $default; - } - } - - /** - * Set a module setting. - * - * Since module settings are NOT NULL, setting a value to NULL will cause - * it to be deleted. - * - * @param string $setting_name - * @param string $setting_value - */ - public function setSetting($setting_name, $setting_value) { - $this->loadAllSettings(); - - if ($setting_value === null) { - Database::prepare( - "DELETE FROM `##module_setting` WHERE module_name = ? AND setting_name = ?" - )->execute(array($this->getName(), $setting_name)); - unset($this->settings[$setting_name]); - } elseif (!array_key_exists($setting_name, $this->settings)) { - Database::prepare( - "INSERT INTO `##module_setting` (module_name, setting_name, setting_value) VALUES (?, ?, ?)" - )->execute(array($this->getName(), $setting_name, $setting_value)); - $this->settings[$setting_name] = $setting_value; - } elseif ($setting_value != $this->settings[$setting_name]) { - Database::prepare( - "UPDATE `##module_setting` SET setting_value = ? WHERE module_name = ? AND setting_name = ?" - )->execute(array($setting_value, $this->getName(), $setting_name)); - $this->settings[$setting_name] = $setting_value; - } else { - // Setting already exists, but with the same value - do nothing. - } - } - - /** - * This is a general purpose hook, allowing modules to respond to routes - * of the form module.php?mod=FOO&mod_action=BAR - * - * @param string $mod_action - */ - public function modAction($mod_action) { - } - - /** - * Get a the current access level for a module - * - * @param Tree $tree - * @param string $component - tab, block, menu, etc - * - * @return integer - */ - public function getAccessLevel(Tree $tree, $component) { - $access_level = Database::prepare( - "SELECT access_level FROM `##module_privacy` WHERE gedcom_id = :gedcom_id AND module_name = :module_name AND component = :component" - )->execute(array( - 'gedcom_id' => $tree->getTreeId(), - 'module_name' => $this->getName(), - 'component' => $component, - ))->fetchOne(); - - if ($access_level === null) { - return $this->defaultAccessLevel(); - } else { - return (int) $access_level; - } - } - +class Module { /** * Get a list of all active (enabled) modules. * - * @return Module[] + * @return AbstractModule[] */ private static function getActiveModules() { - /** @var Module[] - Only query the database once. */ + /** @var AbstractModule[] - Only query the database once. */ static $modules; if ($modules === null) { @@ -192,13 +38,13 @@ abstract class Module { foreach ($module_names as $module_name) { try { $module = include WT_ROOT . WT_MODULES_DIR . $module_name . '/module.php'; - if ($module instanceof Module) { + if ($module instanceof AbstractModule) { $modules[$module->getName()] = $module; } else { throw new \Exception; } } catch (\Exception $ex) { - // Module has been deleted or is broken? Disable it. + // The module has been deleted or is broken? Disable it. Log::addConfigurationLog("Module {$module_name} is missing or broken - disabling it"); Database::prepare( "UPDATE `##module` SET status = 'disabled' WHERE module_name = :module_name" @@ -221,7 +67,7 @@ abstract class Module { * @param Tree $tree * @param string $component The type of module, such as "tab", "report" or "menu" * - * @return Module[] + * @return AbstractModule[] */ private static function getActiveModulesByComponent(Tree $tree, $component) { $module_names = Database::prepare( @@ -247,7 +93,7 @@ abstract class Module { // The order of menus/sidebars/tabs is defined in the database. Others are sorted by name. if ($component !== 'menu' && $component !== 'sidebar' && $component !== 'tab') { - uasort($array, function(Module $x, Module $y) { + uasort($array, function(AbstractModule $x, AbstractModule $y) { return I18N::strcasecmp($x->getTitle(), $y->getTitle()); }); } @@ -337,7 +183,7 @@ abstract class Module { * * @param string $module_name * - * @return Module|null + * @return AbstractModule|null */ public static function getModuleByName($module_name) { $modules = self::getActiveModules(); @@ -356,7 +202,7 @@ abstract class Module { * * @param string $default_status * - * @return Module[] + * @return AbstractModule[] */ public static function getInstalledModules($default_status) { $modules = array(); @@ -364,7 +210,7 @@ abstract class Module { foreach (glob(WT_ROOT . WT_MODULES_DIR . '*/module.php') as $file) { try { $module = include $file; - if ($module instanceof Module) { + if ($module instanceof AbstractModule) { $modules[$module->getName()] = $module; Database::prepare("INSERT IGNORE INTO `##module` (module_name, status, menu_order, sidebar_order, tab_order) VALUES (?, ?, ?, ?, ?)")->execute(array( $module->getName(), @@ -373,64 +219,64 @@ abstract class Module { $module instanceof ModuleSidebarInterface ? $module->defaultSidebarOrder() : null, $module instanceof ModuleTabInterface ? $module->defaultTabOrder() : null, )); - } - // Set the default privcy for this module. Note that this also sets it for the - // default family tree, with a gedcom_id of -1 - if ($module instanceof ModuleMenuInterface) { - Database::prepare( - "INSERT IGNORE INTO `##module_privacy` (module_name, gedcom_id, component, access_level)" . - " SELECT ?, gedcom_id, 'menu', ?" . - " FROM `##gedcom`" - )->execute(array($module->getName(), $module->defaultAccessLevel())); - } - if ($module instanceof ModuleSidebarInterface) { - Database::prepare( - "INSERT IGNORE INTO `##module_privacy` (module_name, gedcom_id, component, access_level)" . - " SELECT ?, gedcom_id, 'sidebar', ?" . - " FROM `##gedcom`" - )->execute(array($module->getName(), $module->defaultAccessLevel())); - } - if ($module instanceof ModuleTabInterface) { - Database::prepare( - "INSERT IGNORE INTO `##module_privacy` (module_name, gedcom_id, component, access_level)" . - " SELECT ?, gedcom_id, 'tab', ?" . - " FROM `##gedcom`" - )->execute(array($module->getName(), $module->defaultAccessLevel())); - } - if ($module instanceof ModuleBlockInterface) { - Database::prepare( - "INSERT IGNORE INTO `##module_privacy` (module_name, gedcom_id, component, access_level)" . - " SELECT ?, gedcom_id, 'block', ?" . - " FROM `##gedcom`" - )->execute(array($module->getName(), $module->defaultAccessLevel())); - } - if ($module instanceof ModuleChartInterface) { - Database::prepare( - "INSERT IGNORE INTO `##module_privacy` (module_name, gedcom_id, component, access_level)" . - " SELECT ?, gedcom_id, 'chart', ?" . - " FROM `##gedcom`" - )->execute(array($module->getName(), $module->defaultAccessLevel())); - } - if ($module instanceof ModuleReportInterface) { - Database::prepare( - "INSERT IGNORE INTO `##module_privacy` (module_name, gedcom_id, component, access_level)" . - " SELECT ?, gedcom_id, 'report', ?" . - " FROM `##gedcom`" - )->execute(array($module->getName(), $module->defaultAccessLevel())); - } - if ($module instanceof ModuleThemeInterface) { - Database::prepare( - "INSERT IGNORE INTO `##module_privacy` (module_name, gedcom_id, component, access_level)" . - " SELECT ?, gedcom_id, 'theme', ?" . - " FROM `##gedcom`" - )->execute(array($module->getName(), $module->defaultAccessLevel())); + // Set the default privcy for this module. Note that this also sets it for the + // default family tree, with a gedcom_id of -1 + if ($module instanceof ModuleMenuInterface) { + Database::prepare( + "INSERT IGNORE INTO `##module_privacy` (module_name, gedcom_id, component, access_level)" . + " SELECT ?, gedcom_id, 'menu', ?" . + " FROM `##gedcom`" + )->execute(array($module->getName(), $module->defaultAccessLevel())); + } + if ($module instanceof ModuleSidebarInterface) { + Database::prepare( + "INSERT IGNORE INTO `##module_privacy` (module_name, gedcom_id, component, access_level)" . + " SELECT ?, gedcom_id, 'sidebar', ?" . + " FROM `##gedcom`" + )->execute(array($module->getName(), $module->defaultAccessLevel())); + } + if ($module instanceof ModuleTabInterface) { + Database::prepare( + "INSERT IGNORE INTO `##module_privacy` (module_name, gedcom_id, component, access_level)" . + " SELECT ?, gedcom_id, 'tab', ?" . + " FROM `##gedcom`" + )->execute(array($module->getName(), $module->defaultAccessLevel())); + } + if ($module instanceof ModuleBlockInterface) { + Database::prepare( + "INSERT IGNORE INTO `##module_privacy` (module_name, gedcom_id, component, access_level)" . + " SELECT ?, gedcom_id, 'block', ?" . + " FROM `##gedcom`" + )->execute(array($module->getName(), $module->defaultAccessLevel())); + } + if ($module instanceof ModuleChartInterface) { + Database::prepare( + "INSERT IGNORE INTO `##module_privacy` (module_name, gedcom_id, component, access_level)" . + " SELECT ?, gedcom_id, 'chart', ?" . + " FROM `##gedcom`" + )->execute(array($module->getName(), $module->defaultAccessLevel())); + } + if ($module instanceof ModuleReportInterface) { + Database::prepare( + "INSERT IGNORE INTO `##module_privacy` (module_name, gedcom_id, component, access_level)" . + " SELECT ?, gedcom_id, 'report', ?" . + " FROM `##gedcom`" + )->execute(array($module->getName(), $module->defaultAccessLevel())); + } + if ($module instanceof ModuleThemeInterface) { + Database::prepare( + "INSERT IGNORE INTO `##module_privacy` (module_name, gedcom_id, component, access_level)" . + " SELECT ?, gedcom_id, 'theme', ?" . + " FROM `##gedcom`" + )->execute(array($module->getName(), $module->defaultAccessLevel())); + } } } catch (\Exception $ex) { // Old or invalid module? } } - uasort($modules, function(Module $x, Module $y) { + uasort($modules, function(AbstractModule $x, AbstractModule $y) { return I18N::strcasecmp($x->getTitle(), $y->getTitle()); }); |
