From cf0031eef42abd682a3eacce2e2cf04d4e7e850f Mon Sep 17 00:00:00 2001 From: tjhunt Date: Thu, 11 Dec 2008 09:21:52 +0000 Subject: [PATCH] admin tree: MDL-10047 and MDL-13104 weird things happen when you turn editing on and off. That was becuase not enough information was being passed in for the blocks editing controls to construct the right URL to reload the page. It is also now possible for admin external pages to add some UI next to the turn blocks editing on/off button. For example, when you are editing the list of course catgories, the turn editing off button is now in the right place. --- admin/pagelib.php | 45 ++++++++++++++++++++++++++++----- admin/report/unittest/index.php | 3 ++- admin/roles/allowassign.php | 3 +-- admin/roles/allowoverride.php | 3 +-- admin/roles/assign.php | 8 +++--- admin/roles/manage.php | 6 ++--- admin/roles/override.php | 2 +- course/category.php | 8 ++---- course/index.php | 6 +---- lib/adminlib.php | 14 ++++++++-- 10 files changed, 66 insertions(+), 32 deletions(-) diff --git a/admin/pagelib.php b/admin/pagelib.php index 971ae09d3d3..1dee158b54c 100644 --- a/admin/pagelib.php +++ b/admin/pagelib.php @@ -20,8 +20,11 @@ page_map_class(PAGE_ADMIN, 'page_admin'); class page_admin extends page_base { - var $section; + var $section = ''; var $visiblepathtosection; + var $extraurlparams = array(); + var $extrabutton = ''; + var $url = ''; // hack alert! // this function works around the inability to store the section name @@ -62,6 +65,9 @@ class page_admin extends page_base { function url_get_path() { global $CFG; + if (!empty($this->url)) { + return $this->url; + } $adminroot =& admin_get_root(false, false); //settings not required - only pages @@ -73,8 +79,29 @@ class page_admin extends page_base { } } + /** + * Use this to pass extra HTML that is added after the turn blocks editing on/off button. + * + * @param string $extrabutton HTML code. + */ + function set_extra_button($extrabutton) { + $this->extrabutton = $extrabutton; + } + + /** + * Use this to pass extra URL parameters that, for example, the blocks editing controls need to reload the current page accurately. + * + * @param array $extraurlparams paramname => value array. + */ + function set_extra_url_params($extraurlparams, $actualurl = '') { + $this->extraurlparams = $extraurlparams; + if (!empty($actualurl)) { + $this->url = $actualurl; + } + } + function url_get_parameters() { // only handles parameters relevant to the admin pagetype - return array('section' => (isset($this->section) ? $this->section : '')); + return array_merge($this->extraurlparams, array('section' => $this->section)); } function blocks_get_positions() { @@ -107,13 +134,19 @@ class page_admin extends page_base { // The search page currently doesn't handle block editing if ($this->section != 'search' and $this->user_allowed_editing()) { - $buttons = '
frametarget.' method="get" action="' . $this->url_get_path() . '">'. - '
'. - ''. - '
'; + $options = $this->url_get_parameters(); + if ($this->user_is_editing()) { + $caption = get_string('blockseditoff'); + $options['adminedit'] = 'off'; + } else { + $caption = get_string('blocksediton'); + $options['adminedit'] = 'on'; + } + $buttons = print_single_button($this->url_get_path(), $options, $caption, 'get', '', true); } else { $buttons = ' '; } + $buttons .= $this->extrabutton; $navlinks = array(); foreach ($this->visiblepathtosection as $element) { diff --git a/admin/report/unittest/index.php b/admin/report/unittest/index.php index 281800cc7cd..4b32ff0064c 100644 --- a/admin/report/unittest/index.php +++ b/admin/report/unittest/index.php @@ -23,7 +23,8 @@ $showsearch = optional_param('showsearch', false, PARAM_BOOL); $thorough = optional_param('thorough', false, PARAM_BOOL); // Print the header. -admin_externalpage_setup('reportunittest'); +admin_externalpage_setup('reportunittest', '', array('showpasses' => $showpasses, + 'showsearch' => $showsearch, 'thorough' => $thorough)); admin_externalpage_print_header(); /* The UNITTEST constant can be checked elsewhere if you need to know diff --git a/admin/roles/allowassign.php b/admin/roles/allowassign.php index 5657b0a230c..70bb0f91447 100755 --- a/admin/roles/allowassign.php +++ b/admin/roles/allowassign.php @@ -10,8 +10,7 @@ require_once('../../config.php'); require_once($CFG->libdir.'/adminlib.php'); - admin_externalpage_setup('defineroles'); - + admin_externalpage_setup('defineroles', '', array(), $CFG->wwwroot . '/' . $CFG->admin . '/roles/allowassign.php'); $sitecontext = get_context_instance(CONTEXT_SYSTEM); require_capability('moodle/role:manage', $sitecontext); diff --git a/admin/roles/allowoverride.php b/admin/roles/allowoverride.php index affc4ee0aee..65fa38235b4 100755 --- a/admin/roles/allowoverride.php +++ b/admin/roles/allowoverride.php @@ -8,8 +8,7 @@ require_once('../../config.php'); require_once($CFG->libdir.'/adminlib.php'); - admin_externalpage_setup('defineroles'); - + admin_externalpage_setup('defineroles', '', array(), $CFG->wwwroot . '/' . $CFG->admin . '/roles/allowoverride.php'); $sitecontext = get_context_instance(CONTEXT_SYSTEM); require_capability('moodle/role:manage', $sitecontext); diff --git a/admin/roles/assign.php b/admin/roles/assign.php index 4b2c1dfb215..eb8adb085a9 100755 --- a/admin/roles/assign.php +++ b/admin/roles/assign.php @@ -144,11 +144,11 @@ $currenttab = 'assign'; include_once($CFG->dirroot.'/user/tabs.php'); } else if ($context->contextlevel == CONTEXT_SYSTEM) { - admin_externalpage_setup('assignroles'); - admin_externalpage_print_header(); + admin_externalpage_setup('assignroles', '', array('contextid' => $contextid, 'roleid' => $roleid)); + admin_externalpage_print_header(''); } else if ($context->contextlevel==CONTEXT_COURSE and $context->instanceid == SITEID) { - admin_externalpage_setup('frontpageroles'); - admin_externalpage_print_header(); + admin_externalpage_setup('frontpageroles', '', array('contextid' => $contextid, 'roleid' => $roleid)); + admin_externalpage_print_header(''); $currenttab = 'assign'; include_once('tabs.php'); } else { diff --git a/admin/roles/manage.php b/admin/roles/manage.php index c362ecebfe5..43ce8764079 100755 --- a/admin/roles/manage.php +++ b/admin/roles/manage.php @@ -4,8 +4,6 @@ require_once($CFG->libdir.'/adminlib.php'); - admin_externalpage_setup('defineroles'); - $roleid = optional_param('roleid', 0, PARAM_INT); // if set, we are editing a role $name = optional_param('name', '', PARAM_MULTILANG); // new role name $shortname = optional_param('shortname', '', PARAM_RAW); // new role shortname, special cleaning before storage @@ -14,6 +12,8 @@ $confirm = optional_param('confirm', 0, PARAM_BOOL); $cancel = optional_param('cancel', 0, PARAM_BOOL); + admin_externalpage_setup('defineroles', '', array('roleid' => $roleid)); + $sitecontext = get_context_instance(CONTEXT_SYSTEM); require_capability('moodle/role:manage', $sitecontext); @@ -414,7 +414,7 @@ /// print UI now - admin_externalpage_print_header(); + admin_externalpage_print_header(''); $currenttab = 'manage'; include_once('managetabs.php'); diff --git a/admin/roles/override.php b/admin/roles/override.php index 4e2f62150e1..709b6508306 100755 --- a/admin/roles/override.php +++ b/admin/roles/override.php @@ -171,7 +171,7 @@ include_once($CFG->dirroot.'/user/tabs.php'); } else if ($context->contextlevel==CONTEXT_COURSE and $context->instanceid == SITEID) { require_once($CFG->libdir.'/adminlib.php'); - admin_externalpage_setup('frontpageroles'); + admin_externalpage_setup('frontpageroles', '', array('contextid' => $contextid, 'roleid' => $roleid), $CFG->wwwroot . '/' . $CFG->admin . '/roles/override.php'); admin_externalpage_print_header(); $currenttab = 'override'; include_once('tabs.php'); diff --git a/course/category.php b/course/category.php index e0e90927da3..91bc446daf0 100644 --- a/course/category.php +++ b/course/category.php @@ -93,17 +93,13 @@ // Integrate into the admin tree only if the user can edit categories at the top level, // otherwise the admin block does not appear to this user, and you get an error. require_once($CFG->libdir.'/adminlib.php'); - admin_externalpage_setup('coursemgmt'); + admin_externalpage_setup('coursemgmt', $navbaritem, array('id' => $id, + 'page' => $page, 'perpage' => $perpage), $CFG->wwwroot . '/course/category.php'); admin_externalpage_print_header(); } else { print_header("$site->shortname: $category->name", "$site->fullname: $strcourses", $navigation, '', '', true, $navbaritem); } -/// Print button to turn editing off - if ($editingon) { - echo '
'.update_category_button($category->id).'
'; - } - /// Print link to roles if (has_capability('moodle/role:assign', $context)) { echo ''; admin_externalpage_print_footer(); @@ -400,7 +396,7 @@ function print_category_edit_header() { global $SITE; require_once($CFG->libdir.'/adminlib.php'); - admin_externalpage_setup('coursemgmt'); + admin_externalpage_setup('coursemgmt', update_category_button()); admin_externalpage_print_header(); } ?> diff --git a/lib/adminlib.php b/lib/adminlib.php index a4976617ec5..e3aa0f80606 100644 --- a/lib/adminlib.php +++ b/lib/adminlib.php @@ -1315,6 +1315,9 @@ class admin_externalpage extends part_of_admin_tree { * @param string $visiblename The displayed name for this external page. Usually obtained through get_string(). * @param string $url The external URL that we should link to when someone requests this external page. * @param mixed $req_capability The role capability/permission a user must have to access this external page. Defaults to 'moodle/site:config'. + * @param boolean $hidden Is this external page hidden in admin tree block? Default false. + * @param context $context The context the page relates to. Not sure what happens + * if you specify something other than system or front page. Defaults to system. */ function admin_externalpage($name, $visiblename, $url, $req_capability='moodle/site:config', $hidden=false, $context=NULL) { $this->name = $name; @@ -1325,7 +1328,7 @@ class admin_externalpage extends part_of_admin_tree { } else { $this->req_capability = array($req_capability); } - $this->hidden = $hidden; + $this->hidden = $hidden; $this->context = $context; } @@ -4058,8 +4061,13 @@ class admin_setting_managefilters extends admin_setting { * checks specified in page definition. * This function must be called on each admin page before other code. * @param string $section name of page + * @param string $extrabutton extra HTML that is added after the blocks editing on/off button. + * @param string $extraurlparams an array paramname => paramvalue, or parameters that need to be + * added to the turn blocks editing on/off form, so this page reloads correctly. + * @param string $actualurl if the actual page being viewed is not the normal one for this + * page (e.g. admin/roles/allowassin.php, instead of admin/roles/manage.php, you can pass the alternate URL here. */ -function admin_externalpage_setup($section) { +function admin_externalpage_setup($section, $extrabutton='', $extraurlparams=array(), $actualurl='') { global $CFG, $PAGE, $USER; require_once($CFG->libdir.'/blocklib.php'); @@ -4089,6 +4097,8 @@ function admin_externalpage_setup($section) { page_map_class(PAGE_ADMIN, 'page_admin'); $PAGE = page_create_object(PAGE_ADMIN, 0); // there must be any constant id number $PAGE->init_extra($section); // hack alert! + $PAGE->set_extra_button($extrabutton); + $PAGE->set_extra_url_params($extraurlparams, $actualurl); $adminediting = optional_param('adminedit', -1, PARAM_BOOL);