diff options
| -rw-r--r-- | admin.php | 2 | ||||
| -rw-r--r-- | includes/classes/class_menubar.php | 15 | ||||
| -rw-r--r-- | includes/classes/class_module.php | 450 | ||||
| -rw-r--r-- | includes/controllers/individual_ctrl.php | 17 | ||||
| -rw-r--r-- | includes/functions/functions_db.php | 6 | ||||
| -rw-r--r-- | module_admin.php | 163 | ||||
| -rw-r--r-- | modules/clippings/pgv_module.php | 1 | ||||
| -rw-r--r-- | setup.php | 26 | ||||
| -rw-r--r-- | sidebar.php | 33 |
9 files changed, 247 insertions, 466 deletions
@@ -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; @@ -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; } |
