summaryrefslogtreecommitdiff
path: root/app/Module.php
diff options
context:
space:
mode:
authorGreg Roach <fisharebest@gmail.com>2015-03-29 15:59:42 +0100
committerGreg Roach <fisharebest@gmail.com>2015-03-29 20:49:35 +0100
commite2a378d30d9bd3fff591da7a11c7cb5ead502323 (patch)
tree3c4469c2e08eb9059efd61c40a931ada3dbc0e2c /app/Module.php
parent06fa22107d3ca09d8b7a2c724decbc30c44d4548 (diff)
downloadwebtrees-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.php280
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());
});