summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--admin.php2
-rw-r--r--includes/classes/class_menubar.php15
-rw-r--r--includes/classes/class_module.php450
-rw-r--r--includes/controllers/individual_ctrl.php17
-rw-r--r--includes/functions/functions_db.php6
-rw-r--r--module_admin.php163
-rw-r--r--modules/clippings/pgv_module.php1
-rw-r--r--setup.php26
-rw-r--r--sidebar.php33
9 files changed, 247 insertions, 466 deletions
diff --git a/admin.php b/admin.php
index edd122c42c..4a6640da2e 100644
--- a/admin.php
+++ b/admin.php
@@ -158,7 +158,7 @@ echo WT_JS_START, 'function showchanges() {window.location.reload();}', WT_JS_EN
<li><a href="#site"><span><?php echo i18n::translate('Site administration')?></span></a></li>
<?php } ?>
<?php
- $modules = WT_Module::getActiveListAllGeds();
+ $modules = WT_Module::getInstalledModules();
if (WT_USER_IS_ADMIN || count($modules)>0) {?>
<!-- ---- MODIFIED BY BH ------------------------------------ -->
<!-- <li><a href="#modules"><span><?php // echo i18n::translate('Module Administration')?></span></a></li> -->
diff --git a/includes/classes/class_menubar.php b/includes/classes/class_menubar.php
index 53945017b1..4a2a3f1dda 100644
--- a/includes/classes/class_menubar.php
+++ b/includes/classes/class_menubar.php
@@ -900,15 +900,14 @@ class MenuBar
* @return array
*/
static function getModuleMenus() {
- $modules = array();
- $mods = WT_Module::getActiveList('M', WT_USER_ACCESS_LEVEL);
- uasort($mods, "WT_Module::compare_menu_order");
- foreach ($mods as $mod) {
- $menu = $mod->getMenu();
- if ($menu) $modules[] = $mod->getMenu();
+ $menus=array();
+ foreach (WT_Module::getActiveMenus() as $module) {
+ $menu=$module->getMenu();
+ if ($menu) {
+ $menus[] = $menu;
+ }
}
-
- return $modules;
+ return $menus;
}
/**
diff --git a/includes/classes/class_module.php b/includes/classes/class_module.php
index 4dcfa19ca3..be1838ff86 100644
--- a/includes/classes/class_module.php
+++ b/includes/classes/class_module.php
@@ -5,9 +5,6 @@
* webtrees: Web based Family History software
* Copyright (C) 2010 webtrees development team.
*
- * Derived from PhpGedView
- * Copyright (C) 2009 John Finlay
- *
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
@@ -36,22 +33,22 @@ define('WT_CLASS_MODULE_PHP', '');
// Modules can optionally implement the following interfaces.
interface WT_Module_Config {
- public function getConfigLink(); // URL of page to edit config
+ public function getConfigLink();
}
interface WT_Module_Menu {
- public function defaultMenuOrder(); // 0-127. Use multiples of 10 to allow third-party modules to choose position
+ public function defaultMenuOrder();
}
interface WT_Module_Sidebar {
- public function defaultSidebarOrder(); // 0-127. Use multiples of 10 to allow third-party modules to choose position
+ public function defaultSidebarOrder();
public function getSidebarContent();
public function getSidebarAjaxContent();
public function hasSidebarContent();
}
interface WT_Module_Tab {
- public function defaultTabOrder(); // 0-127. Use multiples of 10 to allow third-party modules to choose position
+ public function defaultTabOrder();
public function getTabContent();
public function hasTabContent();
public function canLoadAjax();
@@ -61,28 +58,13 @@ interface WT_Module_Tab {
}
abstract class WT_Module {
- private $id = 0;
- private $accessLevel = array();
- private $menuEnabled = array();
- private $tabEnabled = array();
- private $sidebarEnabled = array();
- private $taborder = 99;
- private $menuorder = 99;
- private $sidebarorder = 99;
-
- protected $controller;
-
- public static $default_tabs = array('family_nav', 'personal_facts', 'sources_tab', 'notes', 'media', 'lightbox', 'tree', 'googlemap', 'relatives', 'all_tab');
- public static $default_sidebars = array('descendancy', 'family_nav', 'clippings', 'individuals', 'families');
- public static $default_menus = array('page_menu');
-
// Each module must provide the following functions
abstract public function getTitle(); // To label tabs, etc.
abstract public function getDescription(); // A sentence describing what this module does
- // This is the default for all the module's components.
- // Returns one of: WT_PRIV_HIDE, WT_PRIV_PUBLIC, WT_PRIV_USER, WT_PRIV_ADMIN
+ // This is the default for the module and all its components.
public function defaultAccessLevel() {
+ // Returns one of: WT_PRIV_HIDE, WT_PRIV_PUBLIC, WT_PRIV_USER, WT_PRIV_ADMIN
return WT_PRIV_PUBLIC;
}
@@ -91,351 +73,159 @@ abstract class WT_Module {
return str_replace('_WT_Module', '', get_class($this));
}
- // Reference the parent page's controller
- public function &getController() {
- return $this->controller;
- }
- public function setController(&$c) {
- $this->controller=$c;
- }
-
- /**
- * Get an instance of the desired module class based on a db row
- * @param $row
- * @return WT_Module
- */
- static function &getInstance($row) {
- $entry=$row->mod_name;
- if (file_exists("modules/$entry/pgv_module.php")) {
- include_once("modules/$entry/pgv_module.php");
- $menu_class = $entry."_WT_Module";
- $obj = new $menu_class();
- $obj->setId($row->mod_id);
- $obj->setTaborder($row->mod_taborder);
- $obj->setMenuorder($row->mod_menuorder);
- $obj->setSidebarorder($row->mod_sidebarorder);
- return $obj;
- }
- return null;
- }
+ // Some modules may use the page's controller
+ protected $controller;
+ final public function &getController() { return $this->controller; }
+ final public function setController(&$c) { $this->controller=$c; }
- //-- getters and setters
- public function getId() { return $this->id; }
- public function getTaborder() { return $this->taborder; }
- public function getMenuorder() { return $this->menuorder; }
- public function getSidebarorder() { return $this->sidebarorder; }
- public function getAccessLevel($gedId = WT_GED_ID) {
- if (!isset($this->accessLevel[$gedId])) $this->accessLevel[$gedId] = WT_PRIV_PUBLIC;
- return $this->accessLevel[$gedId];
- }
- public function getMenuEnabled($gedId = WT_GED_ID) {
- if (!isset($this->menuEnabled[$gedId])) $this->menuEnabled[$gedId] = WT_PRIV_PUBLIC;
- return $this->menuEnabled[$gedId];
- }
- public function getTabEnabled($gedId = WT_GED_ID) {
- if (!isset($this->tabEnabled[$gedId])) $this->tabEnabled[$gedId] = WT_PRIV_PUBLIC;
- return $this->tabEnabled[$gedId];
- }
- public function getSidebarEnabled($gedId = WT_GED_ID) {
- if (!isset($this->sidebarEnabled[$gedId])) $this->sidebarEnabled[$gedId] = WT_PRIV_PUBLIC;
- return $this->sidebarEnabled[$gedId];
- }
- public function getAccessLevelArray() {
- return $this->accessLevel;
- }
- public function getMenuEnabledArray() {
- return $this->menuEnabled;
- }
- public function getTabEnabledArray() {
- return $this->tabEnabled;
- }
- public function getSidebarEnabledArray() {
- return $this->sidebarEnabled;
- }
- public function setId($id) { $this->id = $id; }
- public function setMenuorder($o) { $this->menuorder = $o; }
- public function setTaborder($o) { $this->taborder = $o; }
- public function setSidebarorder($o) { $this->sidebarorder = $o; }
+ final static private function getActiveModulesByComponent($component, $ged_id, $access_level) {
+ global $TBLPREFIX;
- public function setAccessLevel($access, $gedId=WT_GED_ID) {
- $this->accessLevel[$gedId] = $access;
- }
- public function setMenuEnabled($access, $gedId=WT_GED_ID) {
- $this->menuEnabled[$gedId] = $access;
- }
- public function setTabEnabled($access, $gedId=WT_GED_ID) {
- $this->tabEnabled[$gedId] = $access;
- }
- public function setSidebarEnabled($access, $gedId=WT_GED_ID) {
- $this->sidebarEnabled[$gedId] = $access;
- }
- public function setGeneralAccess($type, $access, $gedId) {
- switch($type) {
- case 'A':
- $this->setAccessLevel($access, $gedId);
- break;
- case 'T':
- $this->setTabEnabled($access, $gedId);
- break;
- case 'M':
- $this->setMenuEnabled($access, $gedId);
- break;
- case 'S':
- $this->setSidebarEnabled($access, $gedId);
- break;
+ $module_names=WT_DB::prepare(
+ "SELECT module_name".
+ " FROM {$TBLPREFIX}module".
+ " JOIN {$TBLPREFIX}module_privacy USING (module_name)".
+ " WHERE gedcom_id=? AND component=? AND status='enabled' AND access_level>=?".
+ " ORDER BY CASE component WHEN 'menu' THEN menu_order WHEN 'sidebar' THEN sidebar_order WHEN 'tab' THEN tab_order END"
+ )->execute(array($ged_id, $component, $access_level))->fetchOneColumn();
+ $array=array();
+ foreach ($module_names as $module_name) {
+ if (file_exists(WT_ROOT.'modules/'.$module_name.'/pgv_module.php')) {
+ require_once WT_ROOT.'modules/'.$module_name.'/pgv_module.php';
+ $class=$module_name.'_WT_Module';
+ $array[$module_name]=new $class();
+ } else {
+ // Module has been deleted from disk? Remove it from the database.
+ AddToLog("Module {$module_name} has been deleted from disk - deleting from database");
+ WT_DB::prepare("DELETE FROM {$TBLPREFIX}module_privacy WHERE module_name=?")->execute(array($module_name));
+ WT_DB::prepare("DELETE FROM {$TBLPREFIX}moduley WHERE module_name=?")->execute(array($module_name));
+ }
}
+ return $array;
}
- static function compare_tab_order(&$a, &$b) {
- return $a->getTaborder() - $b->getTaborder();
- }
-
- static function compare_menu_order(&$a, &$b) {
- return $a->getMenuorder() - $b->getMenuorder();
- }
-
- static function compare_sidebar_order(&$a, &$b) {
- return $a->getSidebarorder() - $b->getSidebarorder();
+ // Get a list of all the active, authorised sidebars
+ final static public function getActiveMenus($ged_id=WT_GED_ID, $access_level=WT_USER_ACCESS_LEVEL) {
+ static $menus=null;
+ if ($menus===null) {
+ $menus=self::getActiveModulesByComponent('menu', $ged_id, $access_level);
+ }
+ return $menus;
}
- static function compare_name(&$a, &$b) {
- return strcmp($a->getName(), $b->getName());
+ // Get a list of all the active, authorised sidebars
+ final static public function getActiveSidebars($ged_id=WT_GED_ID, $access_level=WT_USER_ACCESS_LEVEL) {
+ static $sidebars=null;
+ if ($sidebars===null) {
+ $sidebars=self::getActiveModulesByComponent('sidebar', $ged_id, $access_level);
+ }
+ return $sidebars;
}
- static function getActiveList($type='A', $access = WT_USER_ACCESS_LEVEL, $ged_id = WT_GED_ID) {
- global $TBLPREFIX;
-
- $modules = array();
- $statement=WT_DB::prepare(
- "SELECT * FROM {$TBLPREFIX}module JOIN {$TBLPREFIX}module_privacy ON mod_id=mp_mod_id WHERE mp_access>=? AND mp_type='{$type}' AND mp_file=?"
- );
- $statement->execute(array($access, $ged_id));
- $entry = "";
- while($row = $statement->fetch()) {
- if ($row->mod_name!=$entry) {
- $entry = $row->mod_name;
- $mod = WT_Module::getInstance($row);
- if ($mod) {
- $modules[$entry] = $mod;
- $mod->setGeneralAccess($row->mp_type, $row->mp_access, $row->mp_file);
- }
- else AddToLog("Invalide module ".$entry);
- }
- else {
- $mod = $modules[$entry];
- $mod->setGeneralAccess($row->mp_type, $row->mp_access, $row->mp_file);
- }
-
+ // Get a list of all the active, authorised tabs
+ final static public function getActiveTabs($ged_id=WT_GED_ID, $access_level=WT_USER_ACCESS_LEVEL) {
+ static $tabs=null;
+ if ($tabs===null) {
+ $tabs=self::getActiveModulesByComponent('tab', $ged_id, $access_level);
}
- return $modules;
+ return $tabs;
}
- static function getActiveListAllGeds($access = WT_USER_ACCESS_LEVEL) {
- global $TBLPREFIX;
-
- $modules = array();
- $statement=WT_DB::prepare(
- "SELECT * FROM {$TBLPREFIX}module JOIN {$TBLPREFIX}module_privacy ON mod_id=mp_mod_id WHERE mp_access>=?"
- );
- $statement->execute(array($access));
- $entry = "";
- while($row = $statement->fetch()) {
- if ($row->mod_name!=$entry) {
- $entry = $row->mod_name;
- $mod = WT_Module::getInstance($row);
- if ($mod) {
- $modules[$entry] = $mod;
- $mod->setGeneralAccess($row->mp_type, $row->mp_access, $row->mp_file);
+ // Get installed modules
+ final static public function getInstalledModules() {
+ static $modules=null;
+ if ($modules===null) {
+ $dir=opendir(WT_ROOT.'modules');
+ while (($file=readdir($dir))!==false) {
+ if (preg_match('/^[a-z_]+$/', $file) && file_exists(WT_ROOT.'modules/'.$file.'/pgv_module.php')) {
+ require_once WT_ROOT.'modules/'.$file.'/pgv_module.php';
+ $class=$file.'_WT_Module';
+ $modules[]=new $class();
}
- else AddToLog("Invalide module ".$entry);
}
- else {
- $mod = $modules[$entry];
- $mod->setGeneralAccess($row->mp_type, $row->mp_access, $row->mp_file);
- }
-
}
return $modules;
}
- static function getInstalledList() {
- static $modules;
- if ($modules==null) {
- $modules = array();
- if (!file_exists("modules")) return $this->modules;
- $d = dir("modules");
- while (false !== ($entry = $d->read())) {
- if ($entry{0}!="." && $entry!=".svn" && is_dir("modules/$entry")) {
- if (file_exists("modules/$entry/pgv_module.php")) {
- include_once("modules/$entry/pgv_module.php");
- $menu_class = $entry."_WT_Module";
- $obj = new $menu_class();
- $mod = WT_Module::getModuleByName($entry);
- if ($mod!=null) {
- $modules[$entry] = $mod;
- } else {
- $modules[$entry] = $obj;
- }
- }
- }
+ // Get installed menus
+ final static public function getInstalledMenus() {
+ global $TBLPREFIX;
+ $modules=array();
+ foreach (self::getInstalledModules() as $module) {
+ if ($module instanceof WT_Module_Menu) {
+ $module->sort=WT_DB::prepare(
+ "SELECT menu_order FROM {$TBLPREFIX}module WHERE module_name=?"
+ )->execute(array($module->getName()))->fetchOne();
+ $modules[]=$module;
}
- $d->close();
}
+ usort($modules, create_function('$x,$y', 'return $x->sort-$y->sort;'));
return $modules;
}
- static function getModuleByName($name) {
+ // Get installed sidebars
+ final static public function getInstalledSidebars() {
global $TBLPREFIX;
-
- $stmt = WT_DB::prepare("SELECT * FROM {$TBLPREFIX}module JOIN {$TBLPREFIX}module_privacy ON mod_id=mp_mod_id WHERE mod_name=?");
- $stmt->execute(array($name));
- $row = $stmt->fetchOne();
- $entry = "";
- $mod = null;
- while($row = $stmt->fetch()) {
- if ($row->mod_name!=$entry) {
- $entry = $row->mod_name;
- $mod = WT_Module::getInstance($row);
- $modules[$entry] = $mod;
- $mod->setGeneralAccess($row->mp_type, $row->mp_access, $row->mp_file);
+ $modules=array();
+ foreach (self::getInstalledModules() as $module) {
+ if ($module instanceof WT_Module_Sidebar) {
+ $module->sort=WT_DB::prepare(
+ "SELECT sidebar_order FROM {$TBLPREFIX}module WHERE module_name=?"
+ )->execute(array($module->getName()))->fetchOne();
+ $modules[]=$module;
}
- else {
- $mod = $modules[$entry];
- $mod->setGeneralAccess($row->mp_type, $row->mp_access, $row->mp_file);
- }
-
}
- return $mod;
+ usort($modules, create_function('$x,$y', 'return $x->sort-$y->sort;'));
+ return $modules;
}
- static function getById($id) {
+ // Get installed tabs
+ final static public function getInstalledTabs() {
global $TBLPREFIX;
-
- $stmt = WT_DB::prepare("SELECT * FROM {$TBLPREFIX}module JOIN {$TBLPREFIX}module_privacy ON mod_id=mp_mod_id WHERE mod_id=?");
- $stmt->execute(array($id));
- $row = $stmt->fetchOne();
- $entry = "";
- $mod = null;
- while($row = $stmt->fetch()) {
- if ($row->mod_name!=$entry) {
- $entry = $row->mod_name;
- $mod = WT_Module::getInstance($row);
- $modules[$entry] = $mod;
- $mod->setGeneralAccess($row->mp_type, $row->mp_access, $row->mp_file);
- }
- else {
- $mod = $modules[$entry];
- $mod->setGeneralAccess($row->mp_type, $row->mp_access, $row->mp_file);
+ $modules=array();
+ foreach (self::getInstalledModules() as $module) {
+ if ($module instanceof WT_Module_Tab) {
+ $module->sort=WT_DB::prepare(
+ "SELECT tab_order FROM {$TBLPREFIX}module WHERE module_name=?"
+ )->execute(array($module->getName()))->fetchOne();
+ $modules[]=$module;
}
-
}
- return $mod;
+ usort($modules, create_function('$x,$y', 'return $x->sort-$y->sort;'));
+ return $modules;
}
- /**
- * Insert or Update a module in the database
- * @param $mod WT_Module
- * @return null
- */
- static function updateModule(&$mod) {
+ //
+ final static public function setDefaultAccess($ged_id) {
global $TBLPREFIX;
- if ($mod->getId()==0) {
- $sql = "insert into {$TBLPREFIX}module (mod_id, mod_name, mod_description, mod_taborder, mod_menuorder, mod_sidebarorder) values(?,?,?,?,?,?)";
- $stmt = WT_DB::prepare($sql);
- $mod->setId(get_next_id("module","mod_id"));
- $stmt->execute(array($mod->getId(),$mod->getName(), $mod->getDescription(), $mod->getTaborder(), $mod->getMenuorder(), $mod->getSidebarorder()));
- $sql = "insert into {$TBLPREFIX}module_privacy (mp_mod_id,mp_file,mp_access,mp_type) values(?,?,?,?)";
- $stmt = WT_DB::prepare($sql);
- foreach ($mod->getAccessLevelArray() as $ged_id=>$mp) {
- $stmt->execute(array($mod->getId(), $ged_id, $mp, 'A'));
- }
- foreach ($mod->getMenuEnabledArray() as $ged_id=>$mp) {
- $stmt->execute(array($mod->getId(), $ged_id, $mp, 'M'));
- }
- foreach ($mod->getTabEnabledArray() as $ged_id=>$mp) {
- $stmt->execute(array($mod->getId(), $ged_id, $mp, 'T'));
- }
- foreach ($mod->getSidebarEnabledArray() as $ged_id=>$mp) {
- $stmt->execute(array($mod->getId(), $ged_id, $mp, 'S'));
- }
+ foreach (self::getInstalledModules() as $module) {
+ WT_DB::prepare("INSERT IGNORE INTO {$TBLPREFIX}module (module_name, menu_order, sidebar_order, tab_order) VALUES (?, ?, ?, ?)")
+ ->execute(array(
+ $module->getName(),
+ $module instanceof WT_Module_Menu ? $module->defaultMenuOrder () : null,
+ $module instanceof WT_Module_Sidebar ? $module->defaultSidebarOrder() : null,
+ $module instanceof WT_Module_Tab ? $module->defaultTabOrder () : null
+ ));
}
- else {
- $sql = "UPDATE {$TBLPREFIX}module SET mod_name=?, mod_description=?, mod_taborder=?, mod_menuorder=?, mod_sidebarorder=? WHERE mod_id=?";
- $stmt = WT_DB::prepare($sql);
- $stmt->execute(array($mod->getName(), $mod->getDescription(), $mod->getTaborder(), $mod->getMenuorder(), $mod->getSidebarorder(), $mod->getId()));
-
- //-- delete the old privacy settings
- $sql = "delete from {$TBLPREFIX}module_privacy where mp_mod_id=?";
- $stmt = WT_DB::prepare($sql);
- $stmt->execute(array($mod->getId()));
-
- //-- store the new privacy settings
- $sql = "insert into {$TBLPREFIX}module_privacy (mp_mod_id,mp_file,mp_access,mp_type) values(?,?,?,?)";
- $stmt = WT_DB::prepare($sql);
- foreach ($mod->getAccessLevelArray() as $ged_id=>$mp) {
- $stmt->execute(array($mod->getId(), $ged_id, $mp, 'A'));
- }
- foreach ($mod->getMenuEnabledArray() as $ged_id=>$mp) {
- $stmt->execute(array($mod->getId(), $ged_id, $mp, 'M'));
- }
- foreach ($mod->getTabEnabledArray() as $ged_id=>$mp) {
- $stmt->execute(array($mod->getId(), $ged_id, $mp, 'T'));
- }
- foreach ($mod->getSidebarEnabledArray() as $ged_id=>$mp) {
- $stmt->execute(array($mod->getId(), $ged_id, $mp, 'S'));
- }
+ WT_DB::prepare("DELETE FROM {$TBLPREFIX}module_privacy WHERE gedcom_id=?")->execute(array($ged_id));
+ foreach (self::getInstalledMenus() as $module) {
+ WT_DB::prepare(
+ "INSERT INTO {$TBLPREFIX}module_privacy (module_name, gedcom_id, component, access_level) VALUES (?, ?, 'menu', ?)"
+ )->execute(array($module->getName(), $ged_id, $module->defaultAccessLevel()));
}
- }
-
- static function setDefaultTabs($ged_id) {
- $modules = WT_Module::getInstalledList();
- $taborder = 1;
- foreach(self::$default_tabs as $modname) {
- if (isset($modules[$modname])) {
- $mod = $modules[$modname];
- if ($mod instanceof WT_Module_Tab) {
- $mod->setTaborder($taborder);
- $mod->setAccessLevel(WT_PRIV_PUBLIC, $ged_id);
- $mod->setTabEnabled(WT_PRIV_PUBLIC, $ged_id);
- WT_Module::updateModule($mod);
- $taborder++;
- }
- }
+ foreach (self::getInstalledSidebars() as $module) {
+ WT_DB::prepare(
+ "INSERT INTO {$TBLPREFIX}module_privacy (module_name, gedcom_id, component, access_level) VALUES (?, ?, 'sidebar', ?)"
+ )->execute(array($module->getName(), $ged_id, $module->defaultAccessLevel()));
}
- }
-
- static function setDefaultMenus($ged_id) {
- $modules = WT_Module::getInstalledList();
- $taborder = 0;
- foreach(self::$default_menus as $modname) {
- if (isset($modules[$modname])) {
- $mod = $modules[$modname];
- if ($mod instanceof WT_Module_Menu) {
- $mod->setMenuorder($taborder);
- $mod->setAccessLevel(WT_PRIV_PUBLIC, $ged_id);
- $mod->setMenuEnabled(WT_PRIV_PUBLIC, $ged_id);
- WT_Module::updateModule($mod);
- $taborder++;
- }
- }
+ foreach (self::getInstalledTabs() as $module) {
+ WT_DB::prepare(
+ "INSERT INTO {$TBLPREFIX}module_privacy (module_name, gedcom_id, component, access_level) VALUES (?, ?, 'tab', ?)"
+ )->execute(array($module->getName(), $ged_id, $module->defaultAccessLevel()));
}
}
- static function setDefaultSidebars($ged_id) {
- $modules = WT_Module::getInstalledList();
- $taborder = 0;
- foreach(self::$default_sidebars as $modname) {
- if (isset($modules[$modname])) {
- $mod = $modules[$modname];
- if ($mod instanceof WT_Module_Sidebar) {
- $mod->setSidebarorder($taborder);
- $mod->setAccessLevel(WT_PRIV_PUBLIC, $ged_id);
- $mod->setSidebarEnabled(WT_PRIV_PUBLIC, $ged_id);
- WT_Module::updateModule($mod);
- $taborder++;
- }
- }
- }
+ static public function compare_name(&$a, &$b) {
+ return strcmp($a->getName(), $b->getName());
}
}
-?>
diff --git a/includes/controllers/individual_ctrl.php b/includes/controllers/individual_ctrl.php
index bc728d8d1b..9bedefbc5e 100644
--- a/includes/controllers/individual_ctrl.php
+++ b/includes/controllers/individual_ctrl.php
@@ -253,19 +253,16 @@ class IndividualControllerRoot extends BaseController {
*/
}
- $this->modules = WT_Module::getActiveList('T');
- uasort($this->modules, "WT_Module::compare_tab_order");
+ $this->modules = WT_Module::getActiveTabs();
$count = 0;
if (empty($this->default_tab)) $this->default_tab=0;
foreach($this->modules as $mod) {
- if ($mod instanceof WT_Module_Tab) {
- $mod->setController($this);
- if ($mod->hasTabContent() || WT_USER_CAN_EDIT) {
- //-- convert default tab as name to number
- if ($mod->getName()===$this->default_tab) $this->default_tab = $count;
- if ($this->static_tab==null) $this->static_tab = $mod;
- else $count++;
- }
+ $mod->setController($this);
+ if ($mod->hasTabContent() || WT_USER_CAN_EDIT) {
+ //-- convert default tab as name to number
+ if ($mod->getName()===$this->default_tab) $this->default_tab = $count;
+ if ($this->static_tab==null) $this->static_tab = $mod;
+ else $count++;
}
}
if ($this->default_tab<0 || $this->default_tab > count($this->modules)-1) $this->default_tab=0;
diff --git a/includes/functions/functions_db.php b/includes/functions/functions_db.php
index d3780957c8..d385fbfb7c 100644
--- a/includes/functions/functions_db.php
+++ b/includes/functions/functions_db.php
@@ -1922,7 +1922,7 @@ function delete_gedcom($ged_id) {
WT_DB::prepare("DELETE FROM {$TBLPREFIX}link WHERE l_file =?")->execute(array($ged_id));
WT_DB::prepare("DELETE FROM {$TBLPREFIX}media WHERE m_gedfile =?")->execute(array($ged_id));
WT_DB::prepare("DELETE FROM {$TBLPREFIX}media_mapping WHERE mm_gedfile=?")->execute(array($ged_id));
- WT_DB::prepare("DELETE FROM {$TBLPREFIX}module_privacy WHERE mp_file =?")->execute(array($ged_id));
+ WT_DB::prepare("DELETE FROM {$TBLPREFIX}module_privacy WHERE gedcom_id =?")->execute(array($ged_id));
WT_DB::prepare("DELETE FROM {$TBLPREFIX}mutex WHERE mx_name =?")->execute(array($ged ));
WT_DB::prepare("DELETE FROM {$TBLPREFIX}name WHERE n_file =?")->execute(array($ged_id));
WT_DB::prepare("DELETE FROM {$TBLPREFIX}news WHERE n_username=?")->execute(array($ged ));
@@ -2487,6 +2487,10 @@ function get_id_from_gedcom($ged_name, $create=false) {
try {
WT_DB::prepare("INSERT INTO {$TBLPREFIX}gedcom (gedcom_name) VALUES (?)")
->execute(array($ged_name));
+ $ged_id=WT_DB::getInstance()->lastInsertId();
+ require_once WT_ROOT.'includes/classes/class_module.php';
+ WT_Module::setDefaultAccess($ged_id);
+ return $ged_id;
} catch (PDOException $ex) {
// The gedcom already exists - can't create
}
diff --git a/module_admin.php b/module_admin.php
index 07e6413e8e..1e0da65677 100644
--- a/module_admin.php
+++ b/module_admin.php
@@ -28,8 +28,9 @@
*/
define('WT_SCRIPT_NAME', 'module_admin.php');
+
require_once 'includes/session.php';
-require_once(WT_ROOT.'includes/classes/class_module.php');
+require_once WT_ROOT.'includes/classes/class_module.php';
if (!WT_USER_GEDCOM_ADMIN) {
@@ -57,37 +58,55 @@ function write_access_option_numeric($checkVar) {
$action = safe_POST('action');
-$modules = WT_Module::getInstalledList();
-uasort($modules, "WT_Module::compare_name");
-
if ($action=='update_mods') {
- foreach($modules as $mod) {
- foreach (get_all_gedcoms() as $ged_id=>$ged_name) {
- $varname = 'accessLevel-'.$mod->getName().'-'.$ged_id;
- $value = safe_POST($varname);
- if ($value!=null) $mod->setAccessLevel($value, $ged_id);
+ foreach (WT_Module::getInstalledModules() as $module) {
+ $module_name=$module->getName();
+ foreach (get_all_gedcoms() as $ged_id=>$ged_name) {
+ WT_DB::prepare("INSERT IGNORE INTO {$TBLPREFIX}module (module_name) VALUES (?)")->execute(array($module_name));
- $varname = 'menuaccess-'.$mod->getName().'-'.$ged_id;
- $value = safe_POST($varname);
- if ($value>$mod->getAccessLevel($ged_id)) $value=$mod->getAccessLevel($ged_id);
- if ($value!=null) $mod->setMenuEnabled($value, $ged_id);
+ $value = safe_POST("menuaccess-{$module_name}-{$ged_id}");
+ if ($value!==null) {
+ WT_DB::prepare(
+ "REPLACE INTO {$TBLPREFIX}module_privacy (module_name, gedcom_id, component, access_level) VALUES (?, ?, 'menu', ?)"
+ )->execute(array($module_name, $ged_id, $value));
+ }
- $varname = 'tabaccess-'.$mod->getName().'-'.$ged_id;
- $value = safe_POST($varname);
- if ($value>$mod->getAccessLevel($ged_id)) $value=$mod->getAccessLevel($ged_id);
- if ($value!=null) $mod->setTabEnabled($value, $ged_id);
-
- $varname = 'sidebaraccess-'.$mod->getName().'-'.$ged_id;
- $value = safe_POST($varname);
- if ($value>$mod->getAccessLevel($ged_id)) $value=$mod->getAccessLevel($ged_id);
- if ($value!=null) $mod->setSidebarEnabled($value, $ged_id);
+ $value = safe_POST("sidebaraccess-{$module_name}-{$ged_id}");
+ if ($value!==null) {
+ WT_DB::prepare(
+ "REPLACE INTO {$TBLPREFIX}module_privacy (module_name, gedcom_id, component, access_level) VALUES (?, ?, 'sidebar', ?)"
+ )->execute(array($module_name, $ged_id, $value));
+ }
+
+ $value = safe_POST("tabaccess-{$module_name}-{$ged_id}");
+ if ($value!==null) {
+ WT_DB::prepare(
+ "REPLACE INTO {$TBLPREFIX}module_privacy (module_name, gedcom_id, component, access_level) VALUES (?, ?, 'tab', ?)"
+ )->execute(array($module_name, $ged_id, $value));
+ }
+
}
- $value = safe_POST_integer('taborder-'.$mod->getName(), 0, 100, $mod->getTaborder());
- $mod->setTaborder($value);
- $mod->setMenuorder(safe_POST_integer('menuorder-'.$mod->getName(), 0, 100, $mod->getMenuorder()));
- $mod->setSidebarorder(safe_POST_integer('sideorder-'.$mod->getName(), 0, 100, $mod->getSidebarorder()));
- WT_Module::updateModule($mod);
+ $value = safe_POST_integer('menuorder-'.$module_name, 1, 127, 0);
+ if ($value) {
+ WT_DB::prepare(
+ "UPDATE {$TBLPREFIX}module SET menu_order=? WHERE module_name=?"
+ )->execute(array($value, $module_name));
+ }
+
+ $value = safe_POST_integer('taborder-'.$module_name, 1, 127, 0);
+ if ($value) {
+ WT_DB::prepare(
+ "UPDATE {$TBLPREFIX}module SET tab_order=? WHERE module_name=?"
+ )->execute(array($value, $module_name));
+ }
+
+ $value = safe_POST_integer('sidebarorder-'.$module_name, 1, 127, 0);
+ if ($value) {
+ WT_DB::prepare(
+ "UPDATE {$TBLPREFIX}module SET sidebar_order=? WHERE module_name=?"
+ )->execute(array($value, $module_name));
+ }
}
}
@@ -197,42 +216,26 @@ print_header(i18n::translate('Module Administration'));
<table id="installed_table" class="list_table">
<thead>
<tr>
- <th class="list_label"><?php echo i18n::translate('Active')?></th>
- <th class="list_label"><?php echo i18n::translate('Mod Settings')?></th>
+ <th class="list_label"><?php echo i18n::translate('Enabled')?></th>
+ <th class="list_label"><?php echo i18n::translate('Configuration')?></th>
<th class="list_label"><?php echo i18n::translate('Module Name')?></th>
<th class="list_label"><?php echo i18n::translate('Description')?></th>
<th class="list_label"><?php echo i18n::translate('Tab')?></th>
<th class="list_label"><?php echo i18n::translate('Menu')?></th>
<th class="list_label"><?php echo i18n::translate('Sidebar')?></th>
- <th class="list_label"><?php echo i18n::translate('Access Level')?></th>
</tr>
</thead>
<tbody>
<?php
-foreach($modules as $mod) {
+foreach (WT_Module::getInstalledModules() as $module) {
?><tr>
- <td class="list_value"><?php if ($mod->getId()>0) echo i18n::translate('Yes'); else echo i18n::translate('No'); ?></td>
- <td class="list_value"><?php if ($mod instanceof WT_Module_Config) echo '<a href="', $mod->getConfigLink(), '"><img class="adminicon" src="', $WT_IMAGE_DIR, '/', $WT_IMAGES["admin"]["small"], '" border="0" alt="', $mod->getName(), '" /></a>'; ?></td>
- <td class="list_value"><?php echo $mod->getTitle()?></td>
- <td class="list_value_wrap"><?php echo $mod->getDescription()?></td>
- <td class="list_value"><?php if ($mod instanceof WT_Module_Tab) echo i18n::translate('Yes'); else echo i18n::translate('No');?></td>
- <td class="list_value"><?php if ($mod instanceof WT_Module_Menu) echo i18n::translate('Yes'); else echo i18n::translate('No');?></td>
- <td class="list_value"><?php if ($mod instanceof WT_Module_Sidebar) echo i18n::translate('Yes'); else echo i18n::translate('No');?></td>
- <td class="list_value_wrap">
- <table>
- <?php
- foreach (get_all_gedcoms() as $ged_id=>$ged_name) {
- $varname = 'accessLevel-'.$mod->getName().'-'.$ged_id;
- ?>
- <tr><td><?php echo $ged_name ?></td><td>
- <select id="<?php echo $varname?>" name="<?php echo $varname?>">
- <?php write_access_option_numeric($mod->getAccessLevel($ged_id)) ?>
- </select></td></tr>
- <?php
- }
- ?>
- </table>
- </td>
+ <td class="list_value"><?php if (true) echo i18n::translate('Yes'); else echo i18n::translate('No'); ?></td>
+ <td class="list_value"><?php if ($module instanceof WT_Module_Config) echo '<a href="', $module->getConfigLink(), '"><img class="adminicon" src="', $WT_IMAGE_DIR, '/', $WT_IMAGES["admin"]["small"], '" border="0" alt="', $module->getName(), '" /></a>'; ?></td>
+ <td class="list_value"><?php echo $module->getTitle()?></td>
+ <td class="list_value_wrap"><?php echo $module->getDescription()?></td>
+ <td class="list_value"><?php if ($module instanceof WT_Module_Tab) echo i18n::translate('Yes'); else echo i18n::translate('No');?></td>
+ <td class="list_value"><?php if ($module instanceof WT_Module_Menu) echo i18n::translate('Yes'); else echo i18n::translate('No');?></td>
+ <td class="list_value"><?php if ($module instanceof WT_Module_Sidebar) echo i18n::translate('Yes'); else echo i18n::translate('No');?></td>
</tr>
<?php
}
@@ -246,22 +249,17 @@ foreach($modules as $mod) {
<thead>
<tr>
<th class="list_label"><?php echo i18n::translate('Module Name')?></th>
- <th class="list_label"><?php echo i18n::translate('Description')?></th>
<th class="list_label"><?php echo i18n::translate('Order')?></th>
<th class="list_label"><?php echo i18n::translate('Access Level')?></th>
</tr>
</thead>
<tbody>
<?php
-uasort($modules, "WT_Module::compare_menu_order");
$order = 1;
-foreach($modules as $mod) {
- if(!$mod instanceof WT_Module_Menu) continue;
-if ($mod->getMenuorder()==0) $mod->setMenuorder($order);
+foreach(WT_Module::getInstalledMenus() as $module) {
?><tr class="sortme">
- <td class="list_value"><?php echo $mod->getTitle()?></td>
- <td class="list_value_wrap"><?php echo $mod->getDescription()?></td>
- <td class="list_value"><input type="text" size="5" value="<?php echo $order; ?>" name="menuorder-<?php echo $mod->getName() ?>" />
+ <td class="list_value"><?php echo $module->getTitle()?></td>
+ <td class="list_value"><input type="text" size="5" value="<?php echo $order; ?>" name="menuorder-<?php echo $module->getName() ?>" />
<br />
<img class="uarrow" src="<?php echo $WT_IMAGE_DIR."/".$WT_IMAGES["uarrow"]["other"];?>" border="0" title="move up" />
<img class="udarrow" src="<?php echo $WT_IMAGE_DIR."/".$WT_IMAGES["udarrow"]["other"];?>" border="0" title="move to top" />
@@ -272,11 +270,14 @@ if ($mod->getMenuorder()==0) $mod->setMenuorder($order);
<table>
<?php
foreach (get_all_gedcoms() as $ged_id=>$ged_name) {
- $varname = 'menuaccess-'.$mod->getName().'-'.$ged_id;
+ $varname = 'menuaccess-'.$module->getName().'-'.$ged_id;
+ $access_level=WT_DB::prepare(
+ "SELECT access_level FROM {$TBLPREFIX}module_privacy WHERE gedcom_id=? AND module_name=? AND component='menu'"
+ )->execute(array($ged_id, $module->getName()))->fetchOne();
?>
<tr><td><?php echo $ged_name ?></td><td>
<select id="<?php echo $varname?>" name="<?php echo $varname?>">
- <?php write_access_option_numeric($mod->getMenuEnabled($ged_id)) ?>
+ <?php write_access_option_numeric($access_level) ?>
</select></td></tr>
<?php
}
@@ -297,22 +298,17 @@ $order++;
<thead>
<tr>
<th class="list_label"><?php echo i18n::translate('Module Name')?></th>
- <th class="list_label"><?php echo i18n::translate('Description')?></th>
<th class="list_label"><?php echo i18n::translate('Order')?></th>
<th class="list_label"><?php echo i18n::translate('Access Level')?></th>
</tr>
</thead>
<tbody>
<?php
-uasort($modules, "WT_Module::compare_tab_order");
$order = 1;
-foreach($modules as $mod) {
- if(!$mod instanceof WT_Module_Tab) continue;
- if ($mod->getTaborder()==0) $mod->setTaborder($order);
+foreach(WT_Module::getInstalledTabs() as $module) {
?><tr class="sortme">
- <td class="list_value"><?php echo $mod->getTitle()?></td>
- <td class="list_value_wrap"><?php echo $mod->getDescription()?></td>
- <td class="list_value"><input type="text" size="5" value="<?php echo $order; ?>" name="taborder-<?php echo $mod->getName() ?>" />
+ <td class="list_value"><?php echo $module->getTitle()?></td>
+ <td class="list_value"><input type="text" size="5" value="<?php echo $order; ?>" name="taborder-<?php echo $module->getName() ?>" />
<br />
<img class="uarrow" src="<?php echo $WT_IMAGE_DIR."/".$WT_IMAGES["uarrow"]["other"];?>" border="0" title="move up" />
<img class="udarrow" src="<?php echo $WT_IMAGE_DIR."/".$WT_IMAGES["udarrow"]["other"];?>" border="0" title="move to top" />
@@ -323,11 +319,14 @@ foreach($modules as $mod) {
<table>
<?php
foreach (get_all_gedcoms() as $ged_id=>$ged_name) {
- $varname = 'tabaccess-'.$mod->getName().'-'.$ged_id;
+ $varname = 'tabaccess-'.$module->getName().'-'.$ged_id;
+ $access_level=WT_DB::prepare(
+ "SELECT access_level FROM {$TBLPREFIX}module_privacy WHERE gedcom_id=? AND module_name=? AND component='tab'"
+ )->execute(array($ged_id, $module->getName()))->fetchOne();
?>
<tr><td><?php echo $ged_name ?></td><td>
<select id="<?php echo $varname?>" name="<?php echo $varname?>">
- <?php write_access_option_numeric($mod->getTabEnabled($ged_id)) ?>
+ <?php write_access_option_numeric($access_level) ?>
</select></td></tr>
<?php
}
@@ -348,22 +347,17 @@ $order++;
<thead>
<tr>
<th class="list_label"><?php echo i18n::translate('Module Name')?></th>
- <th class="list_label"><?php echo i18n::translate('Description')?></th>
<th class="list_label"><?php echo i18n::translate('Order')?></th>
<th class="list_label"><?php echo i18n::translate('Access Level')?></th>
</tr>
</thead>
<tbody>
<?php
-uasort($modules, "WT_Module::compare_sidebar_order");
$order = 1;
-foreach($modules as $mod) {
- if(!$mod instanceof WT_Module_Sidebar) continue;
- if ($mod->getSidebarorder()==0) $mod->setSidebarorder($order);
+foreach(WT_Module::getInstalledSidebars() as $module) {
?><tr class="sortme">
- <td class="list_value"><?php echo $mod->getTitle()?></td>
- <td class="list_value_wrap"><?php echo $mod->getDescription()?></td>
- <td class="list_value"><input type="text" size="5" value="<?php echo $order; ?>" name="sideorder-<?php echo $mod->getName() ?>" />
+ <td class="list_value"><?php echo $module->getTitle()?></td>
+ <td class="list_value"><input type="text" size="5" value="<?php echo $order; ?>" name="sidebarorder-<?php echo $module->getName() ?>" />
<br />
<img class="uarrow" src="<?php echo $WT_IMAGE_DIR."/".$WT_IMAGES["uarrow"]["other"];?>" border="0" title="move up" />
<img class="udarrow" src="<?php echo $WT_IMAGE_DIR."/".$WT_IMAGES["udarrow"]["other"];?>" border="0" title="move to top" />
@@ -374,11 +368,14 @@ foreach($modules as $mod) {
<table>
<?php
foreach (get_all_gedcoms() as $ged_id=>$ged_name) {
- $varname = 'sidebaraccess-'.$mod->getName().'-'.$ged_id;
+ $varname = 'sidebaraccess-'.$module->getName().'-'.$ged_id;
+ $access_level=WT_DB::prepare(
+ "SELECT access_level FROM {$TBLPREFIX}module_privacy WHERE gedcom_id=? AND module_name=? AND component='sidebar'"
+ )->execute(array($ged_id, $module->getName()))->fetchOne();
?>
<tr><td><?php echo $ged_name ?></td><td>
<select id="<?php echo $varname?>" name="<?php echo $varname?>">
- <?php write_access_option_numeric($mod->getSidebarEnabled($ged_id)) ?>
+ <?php write_access_option_numeric($access_level) ?>
</select></td></tr>
<?php
}
diff --git a/modules/clippings/pgv_module.php b/modules/clippings/pgv_module.php
index aa3810acac..02e1aef1a7 100644
--- a/modules/clippings/pgv_module.php
+++ b/modules/clippings/pgv_module.php
@@ -48,6 +48,7 @@ class clippings_WT_Module extends WT_Module implements WT_Module_Menu, WT_Module
public function defaultAccessLevel() {
return WT_PRIV_USER;
}
+
// Implement WT_Module_Menu
public function defaultMenuOrder() {
return 20;
diff --git a/setup.php b/setup.php
index f1edb8f8c5..7908da3c03 100644
--- a/setup.php
+++ b/setup.php
@@ -849,23 +849,23 @@ try {
);
$dbh->exec(
"CREATE TABLE IF NOT EXISTS {$TBLPREFIX}module (".
- " mod_id INTEGER NOT NULL,".
- " mod_name VARCHAR(40) NOT NULL,".
- " mod_description VARCHAR(255) NOT NULL,".
- " mod_taborder TINYINT NOT NULL, ".
- " mod_menuorder TINYINT NOT NULL, ".
- " mod_sidebarorder TINYINT NOT NULL".
+ " module_name VARCHAR(32) NOT NULL,".
+ " status ENUM('enabled', 'disabled') NOT NULL DEFAULT 'enabled',".
+ " tab_order TINYINT NULL, ".
+ " menu_order TINYINT NULL, ".
+ " sidebar_order TINYINT NULL,".
+ " PRIMARY KEY (module_name)".
") COLLATE utf8_unicode_ci ENGINE=InnoDB"
);
$dbh->exec(
"CREATE TABLE IF NOT EXISTS {$TBLPREFIX}module_privacy (".
- " mp_id INTEGER NOT NULL,".
- " mp_mod_id INTEGER NOT NULL,".
- " mp_file INTEGER NOT NULL,".
- " mp_access TINYINT NOT NULL,".
- " mp_type CHAR(1) NOT NULL,".
- " KEY ix1 (mp_mod_id, mp_file, mp_access),".
- " KEY ix2 (mp_mod_id, mp_access)".
+ " module_name VARCHAR(32) NOT NULL,".
+ " gedcom_id INTEGER NOT NULL,".
+ " component ENUM('menu', 'sidebar', 'tab') NOT NULL,".
+ " access_level TINYINT NOT NULL,".
+ " PRIMARY KEY (module_name, gedcom_id, component),".
+ " FOREIGN KEY fk1 (module_name) REFERENCES {$TBLPREFIX}module (module_name) ON DELETE CASCADE,".
+ " FOREIGN KEY fk2 (gedcom_id ) REFERENCES {$TBLPREFIX}gedcom (gedcom_id ) ON DELETE CASCADE".
") COLLATE utf8_unicode_ci ENGINE=InnoDB"
);
$dbh->exec(
diff --git a/sidebar.php b/sidebar.php
index 41c3dcefd7..9bc2e3b8be 100644
--- a/sidebar.php
+++ b/sidebar.php
@@ -6,8 +6,7 @@ require_once(WT_ROOT.'includes/classes/class_module.php');
$sb_action = safe_GET('sb_action', WT_REGEX_ALPHANUM, 'none');
//-- handle ajax calls
if ($sb_action!='none') {
- $sidebarmods = WT_Module::getActiveList('S', WT_USER_ACCESS_LEVEL);
- uasort($sidebarmods, "WT_Module::compare_sidebar_order");
+ $sidebarmods = WT_Module::getActiveSidebars();
class tempController {
var $pid;
var $famid;
@@ -39,17 +38,15 @@ if ($sb_action!='none') {
if ($sb_action=='loadMods') {
$counter = 0;
foreach($sidebarmods as $mod) {
- if ($mod instanceof WT_Module_Sidebar) {
- if (isset($controller)) $mod->setController($controller);
- if ($mod->hasSidebarContent()) {
- ?><h3 title="<?php echo $mod->getName()?>"><a href="#"><?php echo $mod->getTitle()?></a></h3>
- <div id="sb_content_<?php echo $mod->getName()?>">
- <?php if ($counter==0) echo $mod->getSidebarContent();
- else {?><img src="<?php echo $WT_IMAGE_DIR ?>/loading.gif" /><?php }?>
- </div>
- <?php
- $counter++;
- }
+ if (isset($controller)) $mod->setController($controller);
+ if ($mod->hasSidebarContent()) {
+ ?><h3 title="<?php echo $mod->getName()?>"><a href="#"><?php echo $mod->getTitle()?></a></h3>
+ <div id="sb_content_<?php echo $mod->getName()?>">
+ <?php if ($counter==0) echo $mod->getSidebarContent();
+ else {?><img src="<?php echo $WT_IMAGE_DIR ?>/loading.gif" /><?php }?>
+ </div>
+ <?php
+ $counter++;
}
}
exit;
@@ -58,18 +55,14 @@ if ($sb_action!='none') {
$modName = safe_GET('mod', WT_REGEX_URL, '');
if (isset($sidebarmods[$modName])) {
$mod = $sidebarmods[$modName];
- if ($mod instanceof WT_Module_Sidebar) {
- if (isset($controller)) $mod->setController($controller);
- echo $mod->getSidebarContent();
- }
+ if (isset($controller)) $mod->setController($controller);
+ echo $mod->getSidebarContent();
}
exit;
}
if (isset($sidebarmods[$sb_action])) {
$mod = $sidebarmods[$sb_action];
- if ($mod instanceof WT_Module_Sidebar) {
- echo $mod->getSidebarAjaxContent();
- }
+ echo $mod->getSidebarAjaxContent();
}
exit;
}