diff --git a/admin/settingaccess.php b/admin/settingaccess.php new file mode 100644 index 0000000..b786a69 --- /dev/null +++ b/admin/settingaccess.php @@ -0,0 +1,124 @@ +. + +/** + * Allows the admin or anyone with moodle/site:config to select pages to hide + * from the settings navigation. + * + * Using this page the user can select to hide pages from the settings navigation + * to reduce it to just the pages of interest to the everyday running of the site. + * Hiden pages (and thier settings) still show up in the settings search so that + * users with perms can still access them. + * Also there is a user preference so that users with the appropriate perms can + * choose to see the full admin tree anyway. + * + * @package admin + * @copyright 2011 Sam Hemelryk + * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later + */ + +require_once(dirname(dirname(__FILE__)).'/config.php'); +require_once($CFG->libdir . '/adminlib.php'); + +admin_externalpage_setup('managesettingsaccess'); + +$root = admin_get_root(false, true); + +$override = optional_param('override', null, PARAM_BOOL); +if (!is_null($override) && confirm_sesskey()) { + if ($override) { + set_user_preference('override_setting_access', true); + } else { + unset_user_preference('override_setting_access'); + } + redirect($PAGE->url, get_string('settingaccessprefupdated', 'admin', 3)); +} + +if (optional_param('setaccess', null, PARAM_BOOL) && confirm_sesskey()) { + $names = required_param('page', PARAM_ALPHANUMEXT); + $pagenames = array(); + foreach ($names as $name) { + $page = $root->locate($name); + if ($page instanceof part_of_admin_tree) { + get_all_children_names($page, $pagenames); + } + } + $root->set_access_hidden_pages($pagenames); + redirect($PAGE->url, get_string('settingaccessupdated', 'admin', 3)); +} + +echo $OUTPUT->header(); +echo $OUTPUT->heading(get_string('settingaccessmanagement', 'admin')); +echo $OUTPUT->box_start(); +if (get_user_preferences('override_setting_access', false)) { + echo $OUTPUT->single_button(new moodle_url($PAGE->url, array('override' => '0', 'sesskey' => sesskey())), get_string('settingaccessoverridedisable', 'admin'), 'get'); +} else { + echo $OUTPUT->single_button(new moodle_url($PAGE->url, array('override' => '1', 'sesskey' => sesskey())), get_string('settingaccessoverrideenable', 'admin'), 'get'); +} +echo $OUTPUT->box_end(); +echo display_access_selection_form($root); +echo $OUTPUT->footer(); + +function get_all_children_names(part_of_admin_tree $page, array &$pagenames) { + $pagenames[] = $page->name; + if (!empty($page->children)) { + foreach ($page->children as $child) { + get_all_children_names($child, $pagenames); + } + } + return true; +} + +function display_access_selection_form(admin_root $root) { + $output = ''; + $output .= html_writer::start_tag('div', array('class' => 'admin-tree-access-control')); + $output .= html_writer::start_tag('form', array('action' => '', 'method' => 'post')); + $output .= html_writer::empty_tag('input', array('type' => 'hidden', 'name' => 'setaccess', 'value' => '1')); + $output .= html_writer::empty_tag('input', array('type' => 'hidden', 'name' => 'sesskey', 'value' => sesskey())); + $output .= display_page_for_selection($root, $root); + $output .= html_writer::empty_tag('input', array('type' => 'submit', 'value' => get_string('submit'))); + $output .= html_writer::end_tag('form'); + $output .= html_writer::end_tag('div'); + return $output; +} + +function display_page_for_selection(admin_root $root, part_of_admin_tree $page, $depth = 0) { + + if ($depth > 0) { + $params = array('type' => 'checkbox', 'name' => 'page[]', 'value' => $page->name); + if (in_array($page->name, $root->get_access_hidden_pages())) { + $params['checked'] = 'checked'; + } + $checkbox = html_writer::empty_tag('input', $params); + } else { + $checkbox = ''; + } + + $output = ''; + $output .= html_writer::start_tag('div', array('class' => 'admin-tree-page depth-'.$depth)); + $output .= html_writer::tag('p', $checkbox.' '.$page->visiblename, array('class' => 'admin-tree-page-name')); + if (!empty($page->children)) { + $output .= html_writer::start_tag('div', array('class' => 'admin-tree-page-subpages')); + foreach ($page->children as $child) { + if ($child instanceof part_of_admin_tree) { + $output .= display_page_for_selection($root, $child, $depth+1); + } + } + $output .= html_writer::end_tag('div'); + } + $output .= html_writer::end_tag('div'); + return $output; +} \ No newline at end of file diff --git a/admin/settings/top.php b/admin/settings/top.php index 4fcb0c9..fd8625d 100644 --- a/admin/settings/top.php +++ b/admin/settings/top.php @@ -19,6 +19,9 @@ $ADMIN->add('root', new admin_externalpage('registrationselector', get_string('r $ADMIN->add('root', new admin_externalpage('siteregistrationconfirmed', get_string('registrationconfirmed', 'hub'), $CFG->wwwroot."/".$CFG->admin."/registration/confirmregistration.php", 'moodle/site:config', true)); + +$ADMIN->add('root', new admin_externalpage('managesettingsaccess', get_string('settingaccess', 'admin'), "$CFG->wwwroot/$CFG->admin/settingaccess.php", 'moodle/site:config')); + // hidden upgrade script $ADMIN->add('root', new admin_externalpage('upgradesettings', get_string('upgradesettings', 'admin'), "$CFG->wwwroot/$CFG->admin/upgradesettings.php", 'moodle/site:config', true)); diff --git a/lang/en/admin.php b/lang/en/admin.php index ea523e0..6a74e67 100644 --- a/lang/en/admin.php +++ b/lang/en/admin.php @@ -880,6 +880,12 @@ $string['sessioncookiedomain'] = 'Cookie domain'; $string['sessioncookiepath'] = 'Cookie path'; $string['sessionhandling'] = 'Session handling'; $string['sessiontimeout'] = 'Timeout'; +$string['settingaccess'] = 'Settings access'; +$string['settingaccessmanagement'] = 'Manage access to settings pages'; +$string['settingaccessoverrideenable'] = 'Show pages even if they are hidden by this access control'; +$string['settingaccessoverridedisable'] = 'Hide pages that are hidden by this access control'; +$string['settingaccessprefupdated'] = 'Your user preference for displaying access controlled pages has been updated'; +$string['settingaccessupdated'] = 'Accessible settings pages have been updated'; $string['settingfileuploads'] = 'File uploading is required for normal operation, please enable it in PHP configuration.'; $string['settingmemorylimit'] = 'Insufficient memory detected, please set higher memory limit in PHP settings.'; $string['settingsafemode'] = 'Moodle is not fully compatible with safe mode, please ask server administrator to turn it off. Running Moodle under safe mode is not supported, please expect various problems if you do so.'; diff --git a/lib/adminlib.php b/lib/adminlib.php index 3802199..4c53b84 100644 --- a/lib/adminlib.php +++ b/lib/adminlib.php @@ -942,6 +942,10 @@ class admin_category implements parentable_part_of_admin_tree { return $this->hidden; } + public function is_hidden_from_display() { + return $this->hidden || admin_get_root()->page_is_hidden($this->name); + } + /** * Show we display Save button at the page bottom? * @return bool @@ -973,6 +977,10 @@ class admin_root extends admin_category { public $loaded; /** @var mixed site custom defaults overriding defaults in settings files*/ public $custom_defaults; + /** @var array Pages that are hidden by default **/ + protected $accesshiddenpages; + /** @var bool If set to true access to hidden pages will be ignored **/ + protected $accessoverride= false; /** * @param bool $fulltree true means all settings required, @@ -1016,6 +1024,37 @@ class admin_root extends admin_category { } $this->category_cache = array(); } + + + public function get_access_hidden_pages() { + global $CFG; + + if (!is_array($this->accesshiddenpages)) { + $this->accesshiddenpages = array(); + $this->accessoverride = get_user_preferences('override_setting_access', false); + if (!empty($CFG->accesshiddenpages)) { + $this->accesshiddenpages = explode(',', $CFG->accesshiddenpages); + } + } + + return $this->accesshiddenpages; + } + + public function set_access_hidden_pages(array $pagenames) { + + sort($pagenames); + $pagenames = array_map('trim', $pagenames); + $pagenames = array_unique($pagenames); + + $pagenamesstr = join(',', $pagenames); + + set_config('accesshiddenpages', $pagenamesstr); + $this->accesshiddenpages = $pagenames; + } + + public function page_is_hidden($pagename) { + return !$this->accessoverride && (in_array($pagename, $this->get_access_hidden_pages())); + } } @@ -1156,6 +1195,10 @@ class admin_externalpage implements part_of_admin_tree { return $this->hidden; } + public function is_hidden_from_display() { + return $this->hidden || admin_get_root()->page_is_hidden($this->name); + } + /** * Show we display Save button at the page bottom? * @return bool @@ -1355,6 +1398,10 @@ class admin_settingpage implements part_of_admin_tree { return $this->hidden; } + public function is_hidden_from_display() { + return $this->hidden || admin_get_root()->page_is_hidden($this->name); + } + /** * Show we display Save button at the page bottom? * @return bool @@ -7904,4 +7951,4 @@ class admin_setting_configmultiselect_modules extends admin_setting_configmultis } return true; } -} +} \ No newline at end of file diff --git a/lib/navigationlib.php b/lib/navigationlib.php index 0c88ad0..35eb219 100644 --- a/lib/navigationlib.php +++ b/lib/navigationlib.php @@ -2998,7 +2998,7 @@ class settings_navigation extends navigation_node { // Add the branch $reference = $referencebranch->add($adminbranch->visiblename, $url, self::TYPE_SETTING, null, $adminbranch->name, $icon); - if ($adminbranch->is_hidden()) { + if ($adminbranch->is_hidden_from_display()) { if (($adminbranch instanceof admin_externalpage || $adminbranch instanceof admin_settingpage) && $adminbranch->name == $this->adminsection) { $reference->add_class('hidden'); } else { diff --git a/theme/base/style/admin.css b/theme/base/style/admin.css index 19c6286..197eece 100644 --- a/theme/base/style/admin.css +++ b/theme/base/style/admin.css @@ -210,3 +210,9 @@ #page-admin-plugins #plugins-control-panel .disabled .availability {background-color:#eee;} #page-admin-plugins #plugins-control-panel .extension .source {background-color:#f3f2aa;} #page-admin-plugins #plugins-control-panel .msg td {text-align:center;} + +#page-admin-settingaccess {} +#page-admin-settingaccess .admin-tree-access-control {border:1px solid #ddd;} +#page-admin-settingaccess .admin-tree-page.depth-0 {margin:1em;} +#page-admin-settingaccess .admin-tree-page-subpages {margin-left:1.5em;padding-left:16px;border-left:1px dotted #bbb;} +#page-admin-settingaccess .admin-tree-page p {margin:3px 1em 2px;} \ No newline at end of file