From 90a73bb361bbc2bfdff1cf41d8ea3aa6e1d6a5fe Mon Sep 17 00:00:00 2001
From: vinkmar
Date: Fri, 18 Aug 2006 07:25:17 +0000
Subject: [PATCH] Admin page cleanup (Google soc 2006)
---
admin/adminlib.php | 1243 ++++++++++++++++++++++++++++++++++++++
admin/auth.php | 28 +-
admin/block.php | 19 +-
admin/blocks.php | 20 +-
admin/enrol.php | 26 +-
admin/enrol_config.php | 30 +-
admin/environment.php | 18 +-
admin/filter.php | 19 +-
admin/filters.php | 63 +-
admin/index.php | 27 +-
admin/lang.php | 38 +-
admin/langdoc.php | 20 +-
admin/langimport.php | 57 +-
admin/maintenance.php | 23 +-
admin/module.php | 19 +-
admin/modules.php | 24 +-
admin/pagelib.php | 114 ++++
admin/roles/manage.php | 33 +-
admin/settings.php | 90 +++
admin/timezoneimport.php | 29 +-
admin/user.php | 35 +-
21 files changed, 1618 insertions(+), 357 deletions(-)
create mode 100644 admin/adminlib.php
create mode 100644 admin/pagelib.php
create mode 100644 admin/settings.php
diff --git a/admin/adminlib.php b/admin/adminlib.php
new file mode 100644
index 0000000000000..0468411dcb551
--- /dev/null
+++ b/admin/adminlib.php
@@ -0,0 +1,1243 @@
+dirroot . '/backup/lib.php');
+
+//---------------------------------------------------------------------------------------------------
+// Interfaces
+//---------------------------------------------------------------------------------------------------
+
+// part_of_admin_tree indicates that a node (whether it be an admin_settingpage or an
+// admin_category or an admin_externalpage) is searchable
+interface part_of_admin_tree {
+
+ function &locate($name);
+ function check_access();
+ function path($name, $path = array());
+
+}
+
+// parentable_part_of_admin_tree indicates that a node can have children in the hierarchy. only
+// admin_category implements this interface (yes, yes, theoretically admin_setting* is a child of
+// admin_settingpage, but you can't navigate admin_setting*s through the hierarchy)
+interface parentable_part_of_admin_tree {
+
+ function add($destinationname, &$something);
+
+}
+
+//---------------------------------------------------------------------------------------------------
+// Classes
+//---------------------------------------------------------------------------------------------------
+
+// admin categories don't handle much... they can't be printed to the screen (except as a hierarchy), and when we
+// check_access() to a category, we're actually just checking if any of its children are accessible
+class admin_category implements part_of_admin_tree, parentable_part_of_admin_tree {
+
+ var $children;
+ var $name;
+ var $visiblename;
+
+ function admin_category($name, $visiblename) {
+ $this->children = array();
+ $this->name = $name;
+ $this->visiblename = $visiblename;
+ }
+
+ function path($name, $path = array()) {
+
+ $path[count($path)] = $this->name;
+
+ if ($this->name == $name) {
+ return $path;
+ }
+
+ foreach($this->children as $child) {
+ if ($return = $child->path($name, $path)) {
+ return $return;
+ }
+ }
+
+ return NULL;
+
+ }
+
+ function &locate($name) {
+
+ if ($this->name == $name) {
+ return $this;
+ }
+
+ foreach($this->children as $child) {
+ if ($return =& $child->locate($name)) {
+ return $return;
+ }
+ }
+ $return = NULL;
+ return $return;
+ }
+
+ function add($destinationname, &$something, $precedence = '') {
+
+ if (!($something instanceof part_of_admin_tree)) {
+ return false;
+ }
+
+ if ($destinationname == $this->name) {
+ if ($precedence === '') {
+ $this->children[] = $something;
+ } else {
+ if (isset($this->children[$precedence])) { // this should never, ever be triggered in a release version of moodle.
+ echo ('There is a precedence conflict in the category ' . $this->name . '. The object named ' . $something->name . ' is overwriting the object named ' . $this->children[$precedence]->name . '. ');
+ }
+ $this->children[$precedence] = $something;
+ }
+ return true;
+ }
+
+ foreach($this->children as $child) {
+ if ($child instanceof parentable_part_of_admin_tree) {
+ if ($child->add($destinationname, $something, $precedence)) {
+ return true;
+ }
+ }
+ }
+
+ return false;
+
+ }
+
+ function check_access() {
+
+ $return = false;
+ foreach ($this->children as $child) {
+ $return = $return || $child->check_access();
+ }
+
+ return $return;
+
+ }
+
+}
+
+// this is the class we use to add an external page to the admin hierarchy. on the
+// external page (if you'd like), do the following for a consistent look & feel:
+// -require_once admin/adminlib.php
+// -start the page with a call to admin_externalpage_setup($name)
+// -use admin_externalpage_print_header() to print the header & blocks
+// -use admin_externalpage_print_footer() to print the footer
+class admin_externalpage implements part_of_admin_tree {
+
+ var $name;
+ var $visiblename;
+ var $url;
+ var $role;
+
+ function admin_externalpage($name, $visiblename, $url, $role = 'moodle/legacy:admin') {
+ $this->name = $name;
+ $this->visiblename = $visiblename;
+ $this->url = $url;
+ $this->role = $role;
+ }
+
+ function path($name, $path = array()) {
+ if ($name == $this->name) {
+ array_push($path, $this->name);
+ return $path;
+ } else {
+ return NULL;
+ }
+ }
+
+ function &locate($name) {
+ $return = ($this->name == $name ? $this : NULL);
+ return $return;
+ }
+
+ function check_access() {
+ $context = get_context_instance(CONTEXT_SYSTEM, SITEID);
+ return has_capability($this->role, $context);
+ }
+
+}
+
+// authentication happens at this level
+// an admin_settingpage is a LEAF of the admin_tree, it can't have children. it only contains
+// an array of admin_settings that can be printed out onto a webpage
+class admin_settingpage implements part_of_admin_tree {
+
+ var $name;
+ var $visiblename;
+ var $settings;
+ var $role;
+
+ function path($name, $path = array()) {
+ if ($name == $this->name) {
+ array_push($path, $this->name);
+ return $path;
+ } else {
+ return NULL;
+ }
+ }
+
+ function &locate($name) {
+ $return = ($this->name == $name ? $this : NULL);
+ return $return;
+ }
+
+ function admin_settingpage($name, $visiblename, $role = 'moodle/legacy:admin') {
+ $this->settings = new stdClass();
+ $this->name = $name;
+ $this->visiblename = $visiblename;
+ $this->role = $role;
+ }
+
+ function add(&$setting) {
+ if ($setting instanceof admin_setting) {
+ $temp = $setting->name;
+ $this->settings->$temp =& $setting;
+ return true;
+ }
+ return false;
+ }
+
+ function check_access() {
+ $context = get_context_instance(CONTEXT_SYSTEM, SITEID);
+ return has_capability($this->role, $context);
+ }
+
+ function output_html() {
+ $return = '' . "\n";
+ foreach($this->settings as $setting) {
+ $return .= $setting->output_html();
+ }
+ $return .= '
';
+ return $return;
+ }
+
+ // return '' (empty string) for successful write, otherwise return language-specific error
+ function write_settings($data) {
+ $return = '';
+ foreach($this->settings as $setting) {
+ $return .= $setting->write_setting($data['s_' . $setting->name]);
+ }
+ return $return;
+ }
+
+}
+
+
+// read & write happens at this level; no authentication
+class admin_setting {
+
+ var $name;
+ var $visiblename;
+ var $description;
+ var $data;
+
+ function admin_setting($name, $visiblename, $description) {
+ $this->name = $name;
+ $this->visiblename = $visiblename;
+ $this->description = $description;
+ }
+
+ function get_setting() {
+ return; // has to be overridden
+ }
+
+ function write_setting($data) {
+ return; // has to be overridden
+ }
+
+ function output_html() {
+ return; // has to be overridden
+ }
+
+}
+
+
+class admin_setting_configtext extends admin_setting {
+
+ var $paramtype;
+
+ function admin_setting_configtext($name, $visiblename, $description, $paramtype = 'PARAM_RAW') {
+ $this->paramtype = $paramtype;
+ parent::admin_setting($name, $visiblename, $description);
+ }
+
+ function get_setting() {
+ global $CFG;
+ $temp = $this->name; // there's gotta be a more elegant way
+ return $CFG->$temp; // of doing this
+ }
+
+ function write_setting($data) {
+ $data = clean_param($data, $this->paramtype);
+ return (set_config($this->name,$data) ? '' : 'Error setting ' . $this->visiblename . ' ');
+ }
+
+ function output_html() {
+ return '' . $this->visiblename . ' ' .
+ ' ' .
+ ' ' . $this->description . ' ';
+ }
+
+}
+
+class admin_setting_configcheckbox extends admin_setting {
+
+ function get_setting() {
+ global $CFG;
+ $temp = $this->name; // there's gotta be a more elegant way
+ return $CFG->$temp; // of doing this
+ }
+
+ function write_setting($data) {
+ if ($data == '1') {
+ return (set_config($this->name,1) ? '' : 'Error setting ' . $this->visiblename . ' ');
+ } else {
+ return (set_config($this->name,0) ? '' : 'Error setting ' . $this->visiblename . ' ');
+ }
+ }
+
+ function output_html() {
+ return '' . $this->visiblename . ' ' .
+ ' get_setting() == true ? 'checked="checked"' : '') . ' /> ' .
+ ' ' . $this->description . ' ';
+ }
+
+}
+
+class admin_setting_configselect extends admin_setting {
+
+ var $choices;
+
+ function admin_setting_configselect($name, $visiblename, $description, $choices) {
+ $this->choices = $choices;
+ parent::admin_setting($name, $visiblename, $description);
+ }
+
+ function get_setting() {
+ global $CFG;
+ $temp = $this->name;
+ return $CFG->$temp;
+ }
+
+ function write_setting($data) {
+ // check that what we got was in the original choices
+ if (! in_array($data, array_keys($this->choices))) {
+ return 'Error setting ' . $this->visiblename . ' ';
+ }
+
+ return (set_config($this->name, $data) ? '' : 'Error setting ' . $this->visiblename . ' ');
+ }
+
+ function output_html() {
+ $return = '' . $this->visiblename . ' ';
+ foreach ($this->choices as $key => $value) {
+ $return .= 'get_setting() ? ' selected="selected"' : '') . '>' . $value . ' ';
+ }
+ $return .= ' ' . $this->description . ' ';
+ return $return;
+ }
+
+}
+
+// this is a liiitle bit messy. we're using two selects, but we're returning them as an array named after $name (so we only use $name2
+// internally for the setting)
+class admin_setting_configtime extends admin_setting {
+
+ var $name2;
+ var $choices;
+ var $choices2;
+
+ function admin_setting_configtime($hoursname, $minutesname, $visiblename, $description) {
+ $this->name2 = $minutesname;
+ $this->choices = array();
+ for ($i = 0; $i < 24; $i++) {
+ $this->choices[$i] = $i;
+ }
+ $this->choices2 = array();
+ for ($i = 0; $i < 60; $i += 5) {
+ $this->choices2[$i] = $i;
+ }
+ parent::admin_setting($hoursname, $visiblename, $description);
+ }
+
+ function get_setting() {
+ global $CFG;
+ $temp = $this->name;
+ $temp2 = $this->name2;
+ return array((empty($CFG->$temp) ? 0 : $CFG->$temp), (empty($CFG->$temp2) ? 0 : $CFG->$temp2));
+ }
+
+ function write_setting($data) {
+ // check that what we got was in the original choices
+ if (!(in_array($data['h'], array_keys($this->choices)) && in_array($data['m'], array_keys($this->choices2)))) {
+ return 'Error setting ' . $this->visiblename . ' ';
+ }
+
+ return (set_config($this->name, $data['h']) && set_config($this->name2, $data['m']) ? '' : 'Error setting ' . $this->visiblename . ' ');
+ }
+
+ function output_html() {
+ $setvalue = $this->get_setting();
+ $return = '' . $this->visiblename . ' ';
+ foreach ($this->choices as $key => $value) {
+ $return .= '' . $value . ' ';
+ }
+ $return .= ' ';
+ foreach ($this->choices2 as $key => $value) {
+ $return .= '' . $value . ' ';
+ }
+ $return .= ' ' . $this->description . ' ';
+ return $return;
+ }
+
+}
+
+class admin_setting_configmultiselect extends admin_setting_configselect {
+
+ function get_setting() {
+ global $CFG;
+ $temp = $this->name;
+ return explode(',', $CFG->$temp);
+ }
+
+ function write_setting($data) {
+ foreach ($data as $datum) {
+ if (! in_array($datum, array_keys($this->choices))) {
+ return 'Error setting ' . $this->visiblename . ' ';
+ }
+ }
+
+ return (set_config($this->name, implode(',',$data)) ? '' : 'Error setting ' . $this->visiblename . ' ');
+ }
+
+ function output_html() {
+ $return = '' . $this->visiblename . ' ';
+ foreach ($this->choices as $key => $value) {
+ $return .= 'get_setting()) ? ' selected="selected"' : '') . '>' . $value . ' ';
+ }
+ $return .= ' ' . $this->description . ' ';
+ return $return;
+ }
+
+}
+
+class admin_setting_special_adminseesall extends admin_setting_configcheckbox {
+
+ function admin_setting_special_adminseesall() {
+ $name = 'calendar_adminseesall';
+ $visiblename = get_string('adminseesall', 'admin');
+ $description = get_string('helpadminseesall', 'admin');
+ parent::admin_setting_configcheckbox($name, $visiblename, $description);
+ }
+
+ function write_setting($data) {
+ global $SESSION;
+ unset($SESSION->cal_courses_shown);
+ parent::write_setting($data);
+ }
+}
+
+class admin_setting_sitesetselect extends admin_setting_configselect {
+
+ var $id;
+
+ function admin_setting_sitesetselect($name, $visiblename, $description, $choices) {
+
+ $site = get_site();
+ $this->id = $site->id;
+ parent::admin_setting_configselect($name, $visiblename, $description, $choices);
+
+ }
+
+ function get_setting() {
+ $site = get_site();
+ $temp = $this->name;
+ return $site->$temp;
+ }
+
+ function write_setting($data) {
+ if (!in_array($data, array_keys($this->choices))) {
+ return 'Error setting ' . $this->visiblename . ' ';
+ }
+ $record = new stdClass();
+ $record->id = $this->id;
+ $temp = $this->name;
+ $record->$temp = $data;
+ $record->timemodified = time();
+ return (update_record('course', $record) ? '' : 'Error setting ' . $this->visiblename . ' ');
+ }
+
+}
+
+
+class admin_setting_special_frontpage extends admin_setting_configselect {
+
+ function admin_setting_special_frontpage($loggedin = false) {
+ global $CFG;
+ require_once($CFG->dirroot . '/course/lib.php');
+ $name = 'frontpage' . ($loggedin ? 'loggedin' : '');
+ $visiblename = get_string('frontpage' . ($loggedin ? 'loggedin' : ''),'admin');
+ $description = get_string('configfrontpage' . ($loggedin ? 'loggedin' : ''),'admin');
+ $choices = array(FRONTPAGENEWS => get_string('frontpagenews'),
+ FRONTPAGECOURSELIST => get_string('frontpagecourselist'),
+ FRONTPAGECATEGORYNAMES => get_string('frontpagecategorynames'),
+ FRONTPAGECATEGORYCOMBO => get_string('frontpagecategorycombo'),
+ '' => get_string('none'));
+ if (count_records("course") > FRONTPAGECOURSELIMIT) {
+ unset($choices[FRONTPAGECOURSELIST]);
+ }
+ parent::admin_setting_configselect($name, $visiblename, $description, $choices);
+ }
+
+ function get_setting() {
+ global $CFG;
+ $temp = $this->name;
+ return (explode(',', $CFG->$temp));
+ }
+
+ function write_setting($data) {
+ if (empty($data)) {
+ $data = array();
+ }
+ foreach($data as $datum) {
+ if (! in_array($datum, array_keys($this->choices))) {
+ return 'Error setting ' . $this->visiblename . ' ';
+ }
+ }
+ return (set_config($this->name, implode(',', $data)) ? '' : 'Error setting ' . $this->visiblename . ' ');
+ }
+
+ function output_html() {
+
+ $currentsetting = $this->get_setting();
+ $return = '' . $this->visiblename . ' ';
+ for ($i = 0; $i < count($this->choices) - 1; $i++) {
+ $return .='';
+ foreach ($this->choices as $key => $value) {
+ $return .= '' . $value . ' ';
+ }
+ $return .= ' ';
+ if ($i !== count($this->choices) - 2) {
+ $return .= ' ' . get_string('then') . ' ';
+ }
+ }
+ $return .= ' ' . $this->description . ' ';
+ return $return;
+
+
+ }
+}
+
+class admin_setting_sitesetcheckbox extends admin_setting_configcheckbox {
+
+ var $id;
+
+ function admin_setting_sitesetcheckbox($name, $visiblename, $description) {
+
+ $site = get_site();
+ $this->id = $site->id;
+ parent::admin_setting_configcheckbox($name, $visiblename, $description);
+
+ }
+
+ function get_setting() {
+ $site = get_site();
+ $temp = $this->name;
+ return ($site->$temp == '1' ? 1 : 0);
+ }
+
+ function write_setting($data) {
+ $record = new stdClass();
+ $record->id = $this->id;
+ $temp = $this->name;
+ $record->$temp = ($data == '1' ? 1 : 0);
+ $record->timemodified = time();
+ return (update_record('course', $record) ? '' : 'Error setting ' . $this->visiblename . ' ');
+ }
+
+}
+
+class admin_setting_sitesettext extends admin_setting_configtext {
+
+ var $id;
+
+ function admin_setting_sitesettext($name, $visiblename, $description) {
+
+ $site = get_site();
+ $this->id = $site->id;
+ parent::admin_setting_configtext($name, $visiblename, $description);
+
+ }
+
+ function get_setting() {
+ $site = get_site();
+ $temp = $this->name;
+ return $site->$temp;
+ }
+
+ function write_setting($data) {
+ $record = new stdClass();
+ $record->id = $this->id;
+ $temp = $this->name;
+ $record->$temp = $data;
+ $record->timemodified = time();
+ return (update_record('course', $record) ? '' : 'Error setting ' . $this->visiblename . ' ');
+ }
+
+}
+
+class admin_setting_special_frontpagedesc extends admin_setting {
+
+ var $id;
+
+ function admin_setting_special_frontpagedesc() {
+ $site = get_site();
+ $this->id = $site->id;
+ $name = 'summary';
+ $visiblename = get_string('frontpagedescription');
+ $description = get_string('frontpagedescriptionhelp');
+ parent::admin_setting($name, $visiblename, $description);
+ }
+
+ function output_html() {
+
+ $usehtmleditor = can_use_html_editor();
+
+ $return = '' . $this->visiblename . ' ' .
+ '';
+
+ ob_start(); // double-check the number of columns below... might overrun some screen resolutions
+ print_textarea($usehtmleditor, 20, 40, 0, 0, 's_' . $this->name, $this->get_setting());
+
+ if ($usehtmleditor) {
+ use_html_editor();
+ }
+ $return .= ob_get_contents();
+ ob_end_clean();
+ $return .= ' ' . $this->description . ' ';
+ return $return;
+
+ }
+
+ function get_setting() {
+
+ $site = get_site();
+ $temp = $this->name;
+ return ($site->$temp);
+
+ }
+
+ function write_setting($data) {
+
+ $data = addslashes(clean_param($data, PARAM_CLEANHTML));
+
+ $record = new stdClass();
+ $record->id = $this->id;
+ $temp = $this->name;
+ $record->$temp = $data;
+ $record->timemodified = time();
+
+ return(update_record('course', $record) ? '' : 'Error setting ' . $this->visiblename . ' ');
+
+ }
+
+}
+
+
+class admin_setting_special_editorfontlist extends admin_setting {
+
+ var $items;
+
+ function admin_setting_special_editorfontlist() {
+ global $CFG;
+ $name = 'editorfontlist';
+ $visiblename = get_string('editorfontlist', 'admin');
+ $description = get_string('configeditorfontlist', 'admin');
+ $items = explode(';', $CFG->editorfontlist);
+ $this->items = array();
+ foreach ($items as $item) {
+ $item = explode(':', $item);
+ $this->items[$item[0]] = $item[1];
+ }
+ parent::admin_setting($name, $visiblename, $description);
+ }
+
+ function get_setting() {
+ return $this->items;
+ }
+
+ function write_setting($data) {
+
+ // there miiight be an easier way to do this :)
+
+ $keys = array();
+ $values = array();
+
+ foreach ($data as $key => $value) {
+ if (substr($key,0,1) == 'k') {
+ $keys[substr($key,1)] = $value;
+ } elseif (substr($key,0,1) == 'v') {
+ $values[substr($key,1)] = $value;
+ }
+ }
+
+ $result = '';
+ for ($i = 0; $i < count($keys); $i++) {
+ if (($keys[$i] !== '') && ($values[$i] !== '')) {
+ $result .= $keys[$i] . ':' . $values[$i] . ';';
+ }
+ }
+
+ $result = substr($result, 0, -1); // trim the last semicolon
+
+ return (set_config($this->name, $result) ? '' : 'Error setting ' . $this->visiblename . ' ');
+ }
+
+ function output_html() {
+ $return = '' . $this->visiblename . ' ';
+ $count = 0;
+ foreach ($this->items as $key => $value) {
+ $return .= ' ';
+ $return .= ' ';
+ $return .= ' ';
+ $count++;
+ }
+ $return .= ' ';
+ $return .= ' ';
+ $return .= ' ';
+ $return .= ' ';
+ $return .= ' ';
+ $return .= ' ';
+ $return .= ' ' . $this->description . ' ';
+ return $return;
+ }
+
+}
+
+class admin_setting_special_editordictionary extends admin_setting_configselect {
+
+ function admin_setting_special_editordictionary() {
+ $name = 'editordictionary';
+ $visiblename = get_string('editordictionary','admin');
+ $description = get_string('configeditordictionary', 'admin');
+ $choices = $this->editor_get_dictionaries();
+ if (! is_array($choices)) {
+ $choices = array('');
+ }
+
+ parent::admin_setting_configselect($name, $visiblename, $description, $choices);
+ }
+
+ // function borrowed from the old moodle/admin/editor.php, slightly modified
+ function editor_get_dictionaries () {
+ /// Get all installed dictionaries in the system
+
+ global $CFG;
+
+// error_reporting(E_ALL); // for debug, final version shouldn't have this...
+ clearstatcache();
+
+ // If aspellpath isn't set don't even bother ;-)
+ if (empty($CFG->aspellpath)) {
+ return 'Empty aspell path!';
+ }
+
+ // Do we have access to popen function?
+ if (!function_exists('popen')) {
+ return 'Popen function disabled!';
+ }
+
+ $cmd = $CFG->aspellpath;
+ $output = '';
+ $dictionaries = array();
+ $dicts = array();
+
+ if(!($handle = @popen(escapeshellarg($cmd) .' dump dicts', 'r'))) {
+ return 'Couldn\'t create handle!';
+ }
+
+ while(!feof($handle)) {
+ $output .= fread($handle, 1024);
+ }
+ @pclose($handle);
+
+ $dictionaries = explode(chr(10), $output);
+
+ // Get rid of possible empty values
+ if (is_array($dictionaries)) {
+
+ $cnt = count($dictionaries);
+
+ for ($i = 0; $i < $cnt; $i++) {
+ if (!empty($dictionaries[$i])) {
+ $dicts[] = $dictionaries[$i];
+ }
+ }
+ }
+
+ if (count($dicts) >= 1) {
+ return $dicts;
+ }
+
+ return 'Error! Check your aspell installation!';
+ }
+
+
+
+}
+
+
+class admin_setting_special_editorhidebuttons extends admin_setting {
+
+ var $name;
+ var $visiblename;
+ var $description;
+ var $items;
+
+ function admin_setting_special_editorhidebuttons() {
+ $this->name = 'editorhidebuttons';
+ $this->visiblename = get_string('editorhidebuttons', 'admin');
+ $this->description = get_string('confeditorhidebuttons', 'admin');
+ // weird array... buttonname => buttonimage (assume proper path appended). if you leave buttomimage blank, text will be printed instead
+ $this->items = array('fontname' => '',
+ 'fontsize' => '',
+ 'formatblock' => '',
+ 'bold' => 'ed_format_bold.gif',
+ 'italic' => 'ed_format_italic.gif',
+ 'underline' => 'ed_format_underline.gif',
+ 'strikethrough' => 'ed_format_strike.gif',
+ 'subscript' => 'ed_format_sub.gif',
+ 'superscript' => 'ed_format_sup.gif',
+ 'copy' => 'ed_copy.gif',
+ 'cut' => 'ed_cut.gif',
+ 'paste' => 'ed_paste.gif',
+ 'clean' => 'ed_wordclean.gif',
+ 'undo' => 'ed_undo.gif',
+ 'redo' => 'ed_redo.gif',
+ 'justifyleft' => 'ed_align_left.gif',
+ 'justifycenter' => 'ed_align_center.gif',
+ 'justifyright' => 'ed_align_right.gif',
+ 'justifyfull' => 'ed_align_justify.gif',
+ 'lefttoright' => 'ed_left_to_right.gif',
+ 'righttoleft' => 'ed_right_to_left.gif',
+ 'insertorderedlist' => 'ed_list_num.gif',
+ 'insertunorderedlist' => 'ed_list_bullet.gif',
+ 'outdent' => 'ed_indent_less.gif',
+ 'indent' => 'ed_indent_more.gif',
+ 'forecolor' => 'ed_color_fg.gif',
+ 'hilitecolor' => 'ed_color_bg.gif',
+ 'inserthorizontalrule' => 'ed_hr.gif',
+ 'createanchor' => 'ed_anchor.gif',
+ 'createlink' => 'ed_link.gif',
+ 'unlink' => 'ed_unlink.gif',
+ 'insertimage' => 'ed_image.gif',
+ 'inserttable' => 'insert_table.gif',
+ 'insertsmile' => 'em.icon.smile.gif',
+ 'insertchar' => 'icon_ins_char.gif',
+ 'spellcheck' => 'spell-check.gif',
+ 'htmlmode' => 'ed_html.gif',
+ 'popupeditor' => 'fullscreen_maximize.gif',
+ 'search_replace' => 'ed_replace.gif');
+ }
+
+ function get_setting() {
+ global $CFG;
+ $temp = $this->name;
+ return explode(' ', $CFG->$temp);
+ }
+
+ function write_setting($data) {
+ $result = array();
+ if (empty($data)) { $data = array(); }
+ foreach ($data as $key => $value) {
+ if (!in_array($key, array_keys($this->items))) {
+ return 'Error setting ' . $this->visiblename . ' ';
+ }
+ if ($value == '1') {
+ $result[] = $key;
+ }
+ }
+ return (set_config($this->name, implode(' ',$result)) ? '' : 'Error setting ' . $this->visiblename . ' ');
+ }
+
+ function output_html() {
+
+ global $CFG;
+
+ // checkboxes with input name="$this->name[$key]" value="1"
+ // we do 15 fields per column
+
+ $currentsetting = $this->get_setting();
+
+ $return = '' . $this->visiblename . ' ';
+
+ $return .= '';
+ $return .= ' ' . $this->description . ' ';
+
+ return $return;
+ }
+
+}
+
+class admin_setting_backupselect extends admin_setting_configselect {
+
+ function get_setting() {
+ $backup_config = backup_get_config(); // we need this function from backup/lib.php ... but it causes conflicts. ideas?
+ $temp = $this->name;
+ return (isset($backup_config->$temp) ? $backup_config->$temp : 0); // we default to false/0 if the pair doesn't exist
+ }
+
+ function write_setting($data) {
+ // check that what we got was in the original choices
+ if (! in_array($data, array_keys($this->choices))) {
+ return 'Error setting ' . $this->visiblename . ' ';
+ }
+
+ return (backup_set_config($this->name, $data) ? '' : 'Error setting ' . $this->visiblename . ' ');
+ }
+
+}
+
+class admin_setting_special_backupsaveto extends admin_setting_configtext {
+
+ function admin_setting_special_backupsaveto() {
+ $name = 'backup_sche_destination';
+ $visiblename = get_string('saveto');
+ $description = get_string('backupsavetohelp');
+ parent::admin_setting_configtext($name, $visiblename, $description);
+ }
+
+ function get_setting() {
+ $backup_config = backup_get_config();
+ $temp = $this->name;
+ return (isset($backup_config->$temp) ? $backup_config->$temp : ''); // we default to false/0 if the pair doesn't exist
+ }
+
+ function write_setting($data) {
+ $data = clean_param($data, PARAM_PATH);
+ if (!empty($data) and (substr($data,-1) == '/' or substr($data,-1) == '\\')) {
+ return get_string('pathslasherror') . ' ';
+ } else if (!empty($data) and !is_dir($data)) {
+ return get_string('pathnotexists') . ' ';
+ }
+ return (backup_set_config($this->name, $data) ? '' : 'Error setting ' . $this->visiblename . ' ');
+ }
+
+}
+
+class admin_setting_backupcheckbox extends admin_setting_configcheckbox {
+
+ function write_setting($data) {
+ if ($data == '1') {
+ return (backup_set_config($this->name, 1) ? '' : 'Error setting ' . $this->visiblename . ' ');
+ } else {
+ return (backup_set_config($this->name, 0) ? '' : 'Error setting ' . $this->visiblename . ' ');
+ }
+ }
+
+ function get_setting() {
+ $backup_config = backup_get_config();
+ $temp = $this->name;
+ return (isset($backup_config->$temp) ? $backup_config->$temp : 0); // we default to false if the pair doesn't exist
+ }
+
+}
+
+class admin_setting_special_backuptime extends admin_setting_configtime {
+
+ function admin_setting_special_backuptime() {
+ $name = 'backup_sche_hour';
+ $name2 = 'backup_sche_minute';
+ $visiblename = get_string('executeat');
+ $description = get_string('backupexecuteathelp');
+ parent::admin_setting_configtime($name, $name2, $visiblename, $description);
+ }
+
+ function get_setting() {
+ $backup_config = backup_get_config();
+ $temp = $this->name;
+ $temp2 = $this->name2;
+ return array(isset($backup_config->$temp) ? $backup_config->$temp : 0, isset($backup_config->$temp2) ? $backup_config->$temp2 : 0); // we default to 0:0 if the pair doesn't exist
+ }
+
+ function write_setting($data) {
+ // check that what we got was in the original choices
+ if (!(in_array($data['h'], array_keys($this->choices)) && in_array($data['m'], array_keys($this->choices2)))) {
+ return 'Error setting ' . $this->visiblename . ' ';
+ }
+
+ return (backup_set_config($this->name, $data['h']) && backup_set_config($this->name2, $data['m']) ? '' : 'Error setting ' . $this->visiblename . ' ');
+ }
+
+}
+
+class admin_setting_special_backupdays extends admin_setting {
+
+ function admin_setting_special_backupdays() {
+ $name = 'backup_sche_weekdays';
+ $visiblename = get_string('schedule');
+ $description = get_string('backupschedulehelp');
+ parent::admin_setting($name, $visiblename, $description);
+ }
+
+ function get_setting() {
+ $backup_config = backup_get_config();
+ $temp = $this->name;
+ return (isset($backup_config->$temp) ? $backup_config->$temp : '0000000');
+ }
+
+ function output_html() {
+
+ return '' . $this->visiblename . ' ' .
+ ' ' . get_string('sunday', 'calendar') . '
' .
+ get_string('monday', 'calendar') . '
' . get_string('tuesday', 'calendar') . '
' .
+ get_string('wednesday', 'calendar') . '
' . get_string('thursday', 'calendar') . '
' .
+ get_string('friday', 'calendar') . '
' . get_string('saturday', 'calendar') . '
' .
+ ' get_setting(),0,1) == '1' ? 'checked="checked"' : '') . ' />
' .
+ ' get_setting(),1,1) == '1' ? 'checked="checked"' : '') . ' />
' .
+ ' get_setting(),2,1) == '1' ? 'checked="checked"' : '') . ' />
' .
+ ' get_setting(),3,1) == '1' ? 'checked="checked"' : '') . ' />
' .
+ ' get_setting(),4,1) == '1' ? 'checked="checked"' : '') . ' />
' .
+ ' get_setting(),5,1) == '1' ? 'checked="checked"' : '') . ' />
' .
+ ' get_setting(),6,1) == '1' ? 'checked="checked"' : '') . ' />
' .
+ '
' .
+ ' ' . $this->description . ' ';
+
+ }
+
+ // we're using the array trick (see http://ca.php.net/manual/en/faq.html.php#faq.html.arrays) to get the data passed to use without having to modify
+ // admin_settingpage (note that admin_settingpage only calls write_setting with the data that matches $this->name... so if we have multiple form fields,
+ // they MUST go into an array named $this->name, or else we won't receive them here
+ function write_setting($data) {
+ $week = 'umtwrfs';
+ $result = array(0 => 0, 1 => 0, 2 => 0, 3 => 0, 4 => 0, 5 => 0, 6 => 0);
+ foreach($data as $key => $value) {
+ if ($value == '1') {
+ $result[strpos($week, $key)] = 1;
+ }
+ }
+ return (backup_set_config($this->name, implode('',$result)) ? '' : 'Error setting ' . $this->visiblename . ' ');
+ }
+}
+
+class admin_setting_special_debug extends admin_setting_configcheckbox {
+
+ function admin_setting_special_debug() {
+ $name = 'debug';
+ $visiblename = get_string('debug', 'admin');
+ $description = get_string('configdebug', 'admin');
+ parent::admin_setting_configcheckbox($name, $visiblename, $description);
+ }
+
+ function write_setting($data) {
+ if ($data == '1') {
+ return (set_config($this->name,15) ? '' : 'Error setting ' . $this->visiblename . ' ');
+ } else {
+ return (set_config($this->name,7) ? '' : 'Error setting ' . $this->visiblename . ' ');
+ }
+ }
+
+ function output_html() {
+ return '' . $this->visiblename . ' ' .
+ ' get_setting() == 15 ? 'checked="checked"' : '') . ' /> ' .
+ ' ' . $this->description . ' ';
+ }
+
+}
+
+
+class admin_setting_special_calendar_weekend extends admin_setting {
+
+ function admin_setting_special_calendar_weekend() {
+ $name = 'calendar_weekend';
+ $visiblename = get_string('calendar_weekend', 'admin');
+ $description = get_string('helpweekenddays', 'admin');
+ parent::admin_setting($name, $visiblename, $description);
+ }
+
+ function get_setting() {
+ global $CFG;
+ $temp = $this->name;
+ $setting = intval($CFG->$temp);
+ return array('u' => $setting & 1, 'm' => $setting & 2, 't' => $setting & 4, 'w' => $setting & 8, 'r' => $setting & 16, 'f' => $setting & 32, 's' => $setting & 64);
+ }
+
+ function write_setting($data) {
+ $week = 'umtwrfs';
+ $result = array(0 => 0, 1 => 0, 2 => 0, 3 => 0, 4 => 0, 5 => 0, 6 => 0);
+ foreach($data as $key => $value) {
+ if ($value == '1') {
+ $result[strpos($week, $key)] = 1;
+ }
+ }
+ return (set_config($this->name, bindec(implode('',$result))) ? '' : 'Error setting ' . $this->visiblename . ' ');
+ }
+
+ function output_html() {
+
+ $result = $this->get_setting();
+
+ return '' . $this->visiblename . ' ' .
+ '' .
+ ' ' . $this->description . ' ';
+
+ }
+
+}
+
+
+class admin_setting_special_perfdebug extends admin_setting_configcheckbox {
+
+ function admin_setting_special_perfdebug() {
+ $name = 'perfdebug';
+ $visiblename = get_string('perfdebug', 'admin');
+ $description = get_string('configperfdebug', 'admin');
+ parent::admin_setting_configcheckbox($name, $visiblename, $description);
+ }
+
+ function write_setting($data) {
+ if ($data == '1') {
+ return (set_config($this->name,15) ? '' : 'Error setting ' . $this->visiblename . ' ');
+ } else {
+ return (set_config($this->name,7) ? '' : 'Error setting ' . $this->visiblename . ' ');
+ }
+ }
+
+ function output_html() {
+ return '' . $this->visiblename . ' ' .
+ ' get_setting() == 15 ? 'checked="checked"' : '') . ' /> ' .
+ ' ' . $this->description . ' ';
+ }
+
+}
+
+// Code for a function that helps externalpages print proper headers and footers
+// N.B.: THIS FUNCTION HANDLES AUTHENTICATION
+function admin_externalpage_setup($section) {
+
+ global $CFG, $ADMIN, $PAGE, $_GET, $root;
+
+ require_once($CFG->libdir . '/blocklib.php');
+ require_once($CFG->dirroot . '/admin/pagelib.php');
+
+ // we really shouldn't do this... but it works. and it's so elegantly simple.
+ // oh well :)
+ $_GET['section'] = $section;
+
+ define('TEMPORARY_ADMIN_PAGE_ID',26);
+
+ define('BLOCK_L_MIN_WIDTH',160);
+ define('BLOCK_L_MAX_WIDTH',210);
+
+ $pagetype = PAGE_ADMIN; // erm... someone should check this. does
+ $pageclass = 'page_admin'; // any of it duplicate the code I have in
+ page_map_class($pagetype, $pageclass); // admin/pagelib.php?
+
+ $PAGE = page_create_object($pagetype,TEMPORARY_ADMIN_PAGE_ID);
+
+ $PAGE->init_full();
+
+ $root = $ADMIN->locate($PAGE->section);
+
+ if ($site = get_site()) {
+ require_login();
+ } else {
+ redirect($CFG->wwwroot . '/admin/index.php');
+ die;
+ }
+
+ if (!($root instanceof admin_externalpage)) {
+ error('Section does not exist, is invalid, or should not be accessed via this URL.');
+ die;
+ }
+
+ // this eliminates our need to authenticate on the actual pages
+ if (!($root->check_access())) {
+ error('Access denied.');
+ die;
+ }
+
+}
+
+function admin_externalpage_print_header() {
+
+ global $CFG, $ADMIN, $PAGE, $_GET, $root;
+
+ $pageblocks = blocks_setup($PAGE);
+
+ $preferred_width_left = bounded_number(BLOCK_L_MIN_WIDTH, blocks_preferred_width($pageblocks[BLOCK_POS_LEFT]), BLOCK_L_MAX_WIDTH);
+
+ $PAGE->print_header();
+ echo '';
+ echo '';
+ blocks_print_group($PAGE, $pageblocks, BLOCK_POS_LEFT);
+ echo ' ';
+ echo '';
+
+}
+
+function admin_externalpage_print_footer() {
+
+ echo '
';
+ print_footer();
+
+}
+
+
+
+// Code to build admin-tree ----------------------------------------------------------------------------
+
+// hrm... gotta put this somewhere more systematic
+$site = get_site();
+
+// start the admin tree!
+$ADMIN = new admin_category('root','Administration');
+
+// we process this file first to get categories up and running
+include_once($CFG->dirroot . '/admin/settings/first.php');
+
+// now we process all other files in admin/settings to build the
+// admin tree
+foreach (glob($CFG->dirroot . '/admin/settings/*.php') as $file) {
+ if ($file != $CFG->dirroot . '/admin/settings/first.php') {
+ include_once($file);
+ }
+}
+
+?>
\ No newline at end of file
diff --git a/admin/auth.php b/admin/auth.php
index 80af18c75efe5..9362c7bae4257 100644
--- a/admin/auth.php
+++ b/admin/auth.php
@@ -3,21 +3,12 @@
require_once('../config.php');
- $auth = optional_param('auth', '', PARAM_SAFEDIR);
+ require_once($CFG->dirroot . '/admin/adminlib.php');
- require_login();
+ admin_externalpage_setup('userauthentication');
- if (!$site = get_site()) {
- redirect("index.php");
- }
+ $auth = optional_param('auth', '', PARAM_SAFEDIR);
- if (!isadmin()) {
- error("Only the admin can use this page");
- }
-
- if (!confirm_sesskey()) {
- error(get_string('confirmsesskeybad', 'error'));
- }
$focus = '';
@@ -25,6 +16,10 @@
if ($config = data_submitted()) {
+ if (!confirm_sesskey()) {
+ error(get_string('confirmsesskeybad', 'error'));
+ }
+
$config = (array)$config;
// extract and sanitize the auth key explicitly
@@ -126,17 +121,18 @@
$strsettings = get_string("settings");
$strusers = get_string("users");
- print_header("$site->shortname: $strauthenticationoptions", "$site->fullname",
- "$stradministration -> $strusers -> $strauthenticationoptions", "$focus");
+ admin_externalpage_print_header();
echo "";
echo " ";
+ echo " ";
print_simple_box_start("center", "100%");
print_heading($options[$auth]);
@@ -235,7 +231,7 @@
print_simple_box_end();
- print_footer();
+ admin_externalpage_print_footer();
exit;
/// Functions /////////////////////////////////////////////////////////////////
diff --git a/admin/block.php b/admin/block.php
index 522da78fb9591..8ea52e08344a0 100644
--- a/admin/block.php
+++ b/admin/block.php
@@ -3,17 +3,10 @@
// block.php - allows admin to edit all local configuration variables for a block
require_once('../config.php');
+ require_once($CFG->dirroot . '/admin/adminlib.php');
+ admin_externalpage_setup('blockmanagement');
require_once($CFG->libdir.'/blocklib.php');
- require_login();
-
- if (!isadmin()) {
- error('Only an admin can use this page');
- }
- if (!$site = get_site()) {
- error("Site isn't defined!");
- }
-
$blockid = required_param('block', PARAM_INT);
if(($blockrecord = blocks_get_record($blockid)) === false) {
@@ -62,10 +55,8 @@
// of the page. It is also used to generate the link to the Moodle Docs for this view.
$CFG->pagepath = 'block/' . $block->name() . '/config';
- print_header($site->shortname.': '.$strblockname.": $strconfiguration", $site->fullname,
- "$stradmin -> ".
- "$strconfiguration -> ".
- "$strmanageblocks -> ".$strblockname);
+
+ admin_externalpage_print_header();
print_heading($strblockname);
@@ -80,6 +71,6 @@
echo '
';
$block->config_print();
echo '';
- print_footer();
+ admin_externalpage_print_footer();
?>
diff --git a/admin/blocks.php b/admin/blocks.php
index 895fb111d2c5a..f6e4ebfb3b919 100644
--- a/admin/blocks.php
+++ b/admin/blocks.php
@@ -3,6 +3,8 @@
// Allows the admin to configure blocks (hide/show, delete and configure)
require_once('../config.php');
+ require_once($CFG->dirroot . '/admin/adminlib.php');
+ admin_externalpage_setup('blockmanagement');
require_once($CFG->libdir.'/blocklib.php');
require_once($CFG->libdir.'/tablelib.php');
@@ -12,16 +14,6 @@
$delete = optional_param('delete', 0, PARAM_INT);
$multiple = optional_param('multiple', 0, PARAM_INT);
- require_login();
-
- if (!isadmin()) {
- error("Only administrators can use this page!");
- }
-
- if (!$site = get_site()) {
- error("Site isn't defined!");
- }
-
/// Print headings
@@ -37,9 +29,7 @@
$strname = get_string('name');
$strmultiple = get_string('blockmultiple', 'admin');
- print_header("$site->shortname: $strmanageblocks", "$site->fullname",
- "$stradministration -> ".
- "$strconfiguration -> $strmanageblocks");
+ admin_externalpage_print_header();
print_heading($strmanageblocks);
@@ -85,7 +75,7 @@
notice_yesno(get_string('blockdeleteconfirm', '', $strblockname),
'blocks.php?delete='.$block->id.'&confirm=1&sesskey='.$USER->sesskey,
'blocks.php');
- print_footer();
+ admin_externalpage_print_footer();
exit;
} else {
@@ -241,6 +231,6 @@
$table->print_html();
}
- print_footer();
+ admin_externalpage_print_footer();
?>
diff --git a/admin/enrol.php b/admin/enrol.php
index 61c9ed3423e6c..1661bb7281055 100644
--- a/admin/enrol.php
+++ b/admin/enrol.php
@@ -3,29 +3,23 @@
// Yes, enrol is correct English spelling.
require_once('../config.php');
+ require_once($CFG->dirroot . '/admin/adminlib.php');
$enrol = optional_param('enrol', $CFG->enrol, PARAM_SAFEDIR);
$CFG->pagepath = 'enrol';
- require_login();
+ admin_externalpage_setup('enrolment');
- if (!$site = get_site()) {
- redirect("index.php");
- }
-
- if (!isadmin()) {
- error("Only the admin can use this page");
- }
- if (!confirm_sesskey()) {
- error(get_string('confirmsesskeybad', 'error'));
- }
require_once("$CFG->dirroot/enrol/enrol.class.php"); /// Open the factory class
/// Save settings
if ($frm = data_submitted()) {
+ if (!confirm_sesskey()) {
+ error(get_string('confirmsesskeybad', 'error'));
+ }
if (empty($frm->enable)) {
$frm->enable = array();
}
@@ -39,16 +33,14 @@
$frm->enable = array_merge(array('manual'), $frm->enable); // make sure manual plugin is called first
set_config('enrol_plugins_enabled', implode(',', $frm->enable));
set_config('enrol', $frm->default);
- redirect("enrol.php?sesskey=$USER->sesskey", get_string("changessaved"), 1);
+ redirect("enrol.php", get_string("changessaved"), 1);
}
/// Print the form
$str = get_strings(array('enrolmentplugins', 'users', 'administration', 'settings', 'edit'));
- print_header("$site->shortname: $str->enrolmentplugins", "$site->fullname",
- "$str->administration ->
- $str->users -> $str->enrolmentplugins");
+ admin_externalpage_print_header();
$modules = get_list_of_plugins("enrol");
$options = array();
@@ -97,7 +89,7 @@
$default = '';
}
$table->data[$name] = array($name, $enable, $default,
- ''.$str->edit.' ');
+ ''.$str->edit.' ');
}
asort($table->data);
@@ -106,6 +98,6 @@
echo " \n";
echo "";
- print_footer();
+ admin_externalpage_print_footer();
?>
\ No newline at end of file
diff --git a/admin/enrol_config.php b/admin/enrol_config.php
index f78a915e5760b..1bbc993910c45 100644
--- a/admin/enrol_config.php
+++ b/admin/enrol_config.php
@@ -3,23 +3,13 @@
// Yes, enrol is correct English spelling.
require_once("../config.php");
+ require_once($CFG->dirroot . '/admin/adminlib.php');
+
+ admin_externalpage_setup('enrolment');
$enrol = required_param('enrol', PARAM_ALPHA);
$CFG->pagepath = 'enrol/' . $enrol;
-
- require_login();
-
- if (!$site = get_site()) {
- redirect("index.php");
- }
- if (!isadmin()) {
- error("Only the admin can use this page");
- }
-
- if (!confirm_sesskey()) {
- error(get_string('confirmsesskeybad', 'error'));
- }
require_once("$CFG->dirroot/enrol/enrol.class.php"); /// Open the factory class
@@ -28,6 +18,9 @@
/// If data submitted, then process and store.
if ($frm = data_submitted()) {
+ if (!confirm_sesskey()) {
+ error(get_string('confirmsesskeybad', 'error'));
+ }
if ($enrolment->process_config($frm)) {
redirect("enrol.php?sesskey=$USER->sesskey", get_string("changessaved"), 1);
}
@@ -40,6 +33,7 @@
/// get language strings
$str = get_strings(array('enrolmentplugins', 'configuration', 'users', 'administration'));
+ unset($options);
$modules = get_list_of_plugins("enrol");
foreach ($modules as $module) {
@@ -47,11 +41,7 @@
}
asort($options);
- print_header("$site->shortname: $str->enrolmentplugins", "$site->fullname",
- "$str->administration ->
- $str->users ->
- sesskey\">$str->enrolmentplugins ->
- $str->configuration");
+ admin_externalpage_print_header();
echo "
-
-
diff --git a/admin/index.php b/admin/index.php
index b5f0a4ae906e5..c1712e11195d5 100644
--- a/admin/index.php
+++ b/admin/index.php
@@ -347,11 +347,16 @@
/// At this point everything is set up and the user is an admin, so print menu
- $stradministration = get_string("administration");
- print_header("$site->shortname: $stradministration","$site->fullname", "$stradministration");
- print_simple_box_start('center', '100%', '', 20);
- print_heading($stradministration);
-
+# $stradministration = get_string("administration");
+# print_header("$site->shortname: $stradministration","$site->fullname", "$stradministration");
+# print_simple_box_start('center', '100%', '', 20);
+# print_heading($stradministration);
+
+ require_once($CFG->dirroot . '/admin/adminlib.php');
+ admin_externalpage_setup('adminnotifications');
+ admin_externalpage_print_header();
+ echo 'Umm... any notifications should show up here... I hope :) ';
+ echo 'Also, I\'m including the old admin menu on this page incase I forgot any links in the new admin structure. It should be removed after. ';
/// Deprecated database! Warning!!
if (!empty($CFG->migrated_to_new_db)) {
print_simple_box_start('center','60%');
@@ -402,6 +407,7 @@
print_simple_box_end();
}
+// keeping this old menu here for a little while /*
$table->tablealign = "center";
$table->align = array ("right", "left");
$table->wrap = array ("nowrap", "nowrap");
@@ -436,7 +442,6 @@
$table->data[] = array(''.get_string('configuration').' ', $configdata);
-
$userdata = '';
$userdata .= ''.get_string('edituser').
@@ -461,7 +466,7 @@
$table->data[] = array(''.get_string('courses').' ', $coursedata);
-
+
$miscdata = '';
$miscdata .= ''.get_string('stickyblocks','admin').
@@ -491,13 +496,13 @@
/// The eventual official versions may not look like this
if (isset($CFG->portfolio) && file_exists("$CFG->dirroot/$CFG->portfolio")) {
$table->data[] = array("".get_string('portfolio','portfolio').'
-trong>',
+strong>',
''.get_string('adminhelpportfolio','portfolio').'
');
}
if (isset($CFG->repo) && file_exists("$CFG->dirroot/$CFG->repo")) {
$table->data[] = array("".get_string('repository','
-epository').' ',
+repository').' ',
'
'.get_string('adminhelprepository','repository').'
');
}
@@ -505,6 +510,8 @@
print_table($table);
+// old stuff ends here */
+
//////////////////////////////////////////////////////////////////////////////////////////////////
//// IT IS ILLEGAL AND A VIOLATION OF THE GPL TO REMOVE OR MODIFY THE COPYRIGHT NOTICE BELOW ////
$copyrighttext = '
Moodle '.
@@ -533,6 +540,6 @@
}
- print_footer($site);
+ admin_externalpage_print_footer();
?>
diff --git a/admin/lang.php b/admin/lang.php
index aeb1e786e10f4..cc418e2e6d509 100644
--- a/admin/lang.php
+++ b/admin/lang.php
@@ -33,6 +33,8 @@
*/
require_once('../config.php');
+ require_once($CFG->dirroot . '/admin/adminlib.php');
+ admin_externalpage_setup('langedit');
define('LANG_SUBMIT_REPEAT', 1); // repeat displaying submit button?
define('LANG_SUBMIT_REPEAT_EVERY', 20); // if so, after how many lines?
@@ -55,16 +57,6 @@
$SESSION->langtranslateintolocal = $uselocal;
}
- require_login();
-
- if (!isadmin()) {
- error("You need to be admin to edit this page");
- }
-
- if (! $site = get_site()) {
- error("Site not defined!");
- }
-
$stradministration = get_string("administration");
$strconfiguration = get_string("configuration");
$strlanguage = get_string("language");
@@ -118,37 +110,25 @@
}
- print_header("$site->shortname: $title", "$site->fullname",
- "
$stradministration -> ".
- "
$strconfiguration -> $navigation",
- '', '', true, $button);
+ admin_externalpage_print_header();
if (!$mode) {
print_simple_box_start('center','80%');
- echo '
';
- print_string('managelang','admin');
- echo ' ';
+ echo '';
print_string('editlang','admin');
- echo '
';
- print_string('lang16notify','admin');
- echo '
'.get_string('langimport','admin').' ';
- echo ' ';
+ echo ' ';
$currlang = current_language();
$langs = get_list_of_languages();
- echo "";
echo "$strcurrentlanguage: ";
- echo " ";
+ echo ' ';
echo popup_form ("$CFG->wwwroot/$CFG->admin/lang.php?lang=", $langs, "chooselang", $currlang, "", "", "", true);
- echo ' ';
$options["lang"] = $currentlang;
- //print_single_button("http://moodle.org/download/lang/", $options, get_string("latestlanguagepack"));
- echo "
";
print_heading("$strmissingstrings ");
print_heading("$streditstrings ");
print_heading("$stredithelpdocs ");
- echo '
';
+ echo '
';
print_simple_box_end();
- print_footer();
+ admin_externalpage_print_footer();
exit;
}
@@ -519,7 +499,7 @@
}
}
- print_footer();
+ admin_externalpage_print_footer();
//////////////////////////////////////////////////////////////////////
diff --git a/admin/langdoc.php b/admin/langdoc.php
index 7530a9822af77..920a73534bf95 100755
--- a/admin/langdoc.php
+++ b/admin/langdoc.php
@@ -10,6 +10,8 @@
* for intensive testing of this my first contribution
*/
require_once('../config.php');
+ require_once($CFG->dirroot . '/admin/adminlib.php');
+ admin_externalpage_setup('langedit');
//
// Some local configuration
@@ -24,16 +26,6 @@
$currentfile = optional_param('currentfile', 'docs/README.txt', PARAM_PATH);
- require_login();
-
- if (!isadmin()) {
- error("You need to be admin to edit this page");
- }
-
- if (! $site = get_site()) {
- error("Site not defined!");
- }
-
$stradministration = get_string("administration");
$strconfiguration = get_string("configuration");
$strlanguage = get_string("language");
@@ -41,11 +33,7 @@
$strthislanguage = get_string("thislanguage");
$stredithelpdocs = get_string('edithelpdocs', 'admin');
- print_header("$site->shortname: $stredithelpdocs: $currentfile", "$site->fullname",
- " $stradministration -> ".
- "
$strconfiguration ->
-
$strlanguage -> $stredithelpdocs",
- 'choosefile.popup', '', true);
+ admin_externalpage_print_header();
$currentlang = current_language();
$langdir = "$CFG->dataroot/lang/$currentlang";
@@ -207,7 +195,7 @@
error_reporting($CFG->debug);
}
- print_footer();
+ admin_externalpage_print_footer();
//////////////////////////////////////////////////////////////////////
diff --git a/admin/langimport.php b/admin/langimport.php
index 4ff88921939a4..b019a6072ba40 100755
--- a/admin/langimport.php
+++ b/admin/langimport.php
@@ -5,6 +5,8 @@
///This helps to avoid confusion.
require_once('../config.php');
+ require_once($CFG->dirroot . '/admin/adminlib.php');
+ admin_externalpage_setup('langimport');
$mode = optional_param('mode', 0, PARAM_INT); //phase
$pack = optional_param('pack', '', PARAM_FILE); //pack to install
@@ -17,16 +19,6 @@
define('CHANGE_SITE_LANG', 3);
define('DELETION_OF_SELECTED_LANG', 4);
define('UPDATE_ALL_LANG', 5);
-
- require_login();
-
- if (!isadmin()) {
- error('You must be an admin');
- }
-
- if (!$site = get_site()) {
- error("Site not defined!");
- }
$strlang = get_string('langimport','admin');
@@ -35,14 +27,9 @@
$strlanguage = get_string("language");
$strthislanguage = get_string("thislanguage");
$title = $strlang;
+
+ admin_externalpage_print_header();
- print_header("$site->shortname: $title", "$site->fullname",
- "
$stradministration -> ".
- "
$strconfiguration -> ".
- "
$strlanguage -> $strlang",
- '', '', true, '');
-
- print_heading('');
switch ($mode){
@@ -284,23 +271,25 @@
echo '
';
/// Display option to change site language
+
+ /// Erm... this doesn't seem to work. Plus it's redundant. -vinkmar
- print_string('changesitelang','admin');
- $sitelanguage = get_record('config','name','lang');
- echo '
';
+// print_string('changesitelang','admin');
+// $sitelanguage = get_record('config','name','lang');
+// echo '
';
/// display to be installed langs here
@@ -354,7 +343,7 @@
} //close of main switch
- print_footer();
+ admin_externalpage_print_footer();
/* returns a list of available language packs from a
* local copy shipped with standard moodle distro
diff --git a/admin/maintenance.php b/admin/maintenance.php
index 2be4eb1ea0d7e..da8e96764f85d 100644
--- a/admin/maintenance.php
+++ b/admin/maintenance.php
@@ -2,14 +2,11 @@
// Enables/disables maintenance mode
require('../config.php');
+ require_once($CFG->dirroot . '/admin/adminlib.php');
$action = optional_param('action', '', PARAM_ALPHA);
- require_login();
-
- if (!isadmin()) {
- error('You need to be admin to use this page');
- }
+ admin_externalpage_setup('maintenancemode');
//Check folder exists
if (! make_upload_directory(SITEID)) { // Site folder
@@ -22,27 +19,19 @@
if (confirm_sesskey()) {
if ($form->action == "disable") {
unlink($filename);
- redirect('index.php', get_string('sitemaintenanceoff','admin'));
+ redirect('maintenance.php', get_string('sitemaintenanceoff','admin'));
} else {
$file = fopen($filename, 'w');
fwrite($file, stripslashes($form->text));
fclose($file);
- redirect('index.php', get_string('sitemaintenanceon', 'admin'));
+ redirect('maintenance.php', get_string('sitemaintenanceon', 'admin'));
}
}
}
/// Print the header stuff
- $strmaintenance = get_string('sitemaintenancemode', 'admin');
- $stradmin = get_string('administration');
- $strconfiguration = get_string('configuration');
-
- print_header("$SITE->shortname: $strmaintenance", $SITE->fullname,
- "
$stradmin -> ".
- "
$strconfiguration -> $strmaintenance");
-
- print_heading($strmaintenance);
+ admin_externalpage_print_header();
/// Print the appropriate form
@@ -74,5 +63,5 @@
}
}
- print_footer();
+ admin_externalpage_print_footer();
?>
diff --git a/admin/module.php b/admin/module.php
index e1e8be547578e..b2e60b37c1da8 100644
--- a/admin/module.php
+++ b/admin/module.php
@@ -2,16 +2,8 @@
// module.php - allows admin to edit all local configuration variables for a module
require_once('../config.php');
-
- require_login();
-
- if (!isadmin()) {
- error("Only an admin can use this page");
- }
-
- if (!$site = get_site()) {
- error("Site isn't defined!");
- }
+ require_once($CFG->dirroot . '/admin/adminlib.php');
+ admin_externalpage_setup('modulemanagement');
/// If data submitted, then process and store.
@@ -61,10 +53,7 @@
// of the page. It is also used to generate the link to the Moodle Docs for this view.
$CFG->pagepath = 'mod/' . $module . '/config';
- print_header("$site->shortname: $strmodulename: $strconfiguration", $site->fullname,
- "
$stradmin -> ".
- "
$strconfiguration -> ".
- "
$strmanagemodules -> $strmodulename");
+ admin_externalpage_print_header();
print_heading($strmodulename);
@@ -75,6 +64,6 @@
include("$CFG->dirroot/mod/$module/config.html");
print_simple_box_end();
- print_footer();
+ admin_externalpage_print_footer();
?>
diff --git a/admin/modules.php b/admin/modules.php
index 25d9492a0947a..3070028d423b9 100644
--- a/admin/modules.php
+++ b/admin/modules.php
@@ -2,6 +2,8 @@
// Allows the admin to manage activity modules
require_once('../config.php');
+ require_once($CFG->dirroot . '/admin/adminlib.php');
+ admin_externalpage_setup('modulemanagement');
require_once('../course/lib.php');
$show = optional_param('show', '', PARAM_SAFEDIR);
@@ -9,16 +11,6 @@
$delete = optional_param('delete', '', PARAM_SAFEDIR);
$confirm = optional_param('confirm', '', PARAM_BOOL);
- require_login();
-
- if (!isadmin()) {
- error("Only administrators can use this page!");
- }
-
- if (!$site = get_site()) {
- error("Site isn't defined!");
- }
-
/// Print headings
@@ -33,9 +25,11 @@
$stractivities = get_string("activities");
$stractivitymodule = get_string("activitymodule");
- print_header("$site->shortname: $strmanagemodules", "$site->fullname",
- "
$stradministration -> ".
- "
$strconfiguration -> $strmanagemodules");
+// print_header("$site->shortname: $strmanagemodules", "$site->fullname",
+// "
$stradministration -> ".
+// "
$strconfiguration -> $strmanagemodules");
+
+ admin_externalpage_print_header();
print_heading($strmanagemodules);
@@ -72,7 +66,7 @@
notice_yesno(get_string("moduledeleteconfirm", "", $strmodulename),
"modules.php?delete=$delete&confirm=1&sesskey=$USER->sesskey",
"modules.php");
- print_footer();
+ admin_externalpage_print_footer();
exit;
} else { // Delete everything!!
@@ -201,6 +195,6 @@
echo "
";
- print_footer();
+ admin_externalpage_print_footer();
?>
diff --git a/admin/pagelib.php b/admin/pagelib.php
new file mode 100644
index 0000000000000..01d95af7f0c28
--- /dev/null
+++ b/admin/pagelib.php
@@ -0,0 +1,114 @@
+libdir.'/pagelib.php');
+
+define('PAGE_ADMIN', 'admin-index');
+
+page_map_class(PAGE_ADMIN, 'page_admin');
+
+// $DEFINEDPAGES = array(PAGE_CHAT_VIEW); -- is anything like this needed?
+
+class page_admin extends page_base {
+
+ var $section;
+ var $pathtosection;
+ var $visiblepathtosection;
+
+ function init_full() {
+ global $CFG, $ADMIN;
+
+ if($this->full_init_done) {
+ return;
+ }
+
+ // fetch the path parameter
+ $this->section = optional_param("section","",PARAM_PATH);
+
+ $this->visiblepathtosection = array();
+
+ // this part is (potentially) processor-intensive... there's gotta be a better way
+ // of handling this
+ if ($this->pathtosection = $ADMIN->path($this->section)) {
+ foreach($this->pathtosection as $element) {
+ if ($pointer = $ADMIN->locate($element)) {
+ array_push($this->visiblepathtosection, $pointer->visiblename);
+ }
+ }
+ }
+
+ // all done
+ $this->full_init_done = true;
+ }
+
+ function blocks_get_default() {
+ return 'admin_2';
+ }
+
+ // seems reasonable that the only people that can edit blocks on the admin pages
+ // are the admins... but maybe we want a role for this?
+ function user_allowed_editing() {
+ return isadmin();
+ }
+
+ // has to be fixed. i know there's a "proper" way to do this
+ function user_is_editing() {
+ global $USER;
+ return (($_GET["edit"] == 'on') && isadmin());
+ }
+
+ function url_get_path() { // erm.... this has to be based on the current location, right?
+ global $CFG;
+ return $CFG->wwwroot .'/admin/settings.php';
+ }
+
+ function url_get_parameters() { // only handles parameters relevant to the admin pagetype
+ $this->init_full();
+ return array('section' => $this->section);
+ }
+
+ function blocks_get_positions() {
+ return array(BLOCK_POS_LEFT);
+ }
+
+ function blocks_default_position() {
+ return BLOCK_POS_LEFT;
+ }
+
+ // does anything need to be done here?
+ function init_quick($data) {
+ parent::init_quick($data);
+ }
+
+ function print_header() {
+ global $USER, $CFG, $SITE;
+
+ $this->init_full();
+
+ // should this rely on showblocksonmodpages in any way? after all, teachers aren't accessing this...
+ if ($this->user_allowed_editing()) {
+ $buttons = '
';
+ } else {
+ $buttons = ' ';
+ }
+
+/*ML*/ print_header("$SITE->shortname: " . implode(": ",$this->visiblepathtosection), $SITE->fullname, implode(" -> ",$this->visiblepathtosection),'', '', true, $buttons, '');
+ }
+
+ function get_type() {
+ return PAGE_ADMIN;
+ }
+}
+
+?>
diff --git a/admin/roles/manage.php b/admin/roles/manage.php
index 552c9baa7301f..c184cb1221886 100755
--- a/admin/roles/manage.php
+++ b/admin/roles/manage.php
@@ -3,7 +3,9 @@
//testing
require_once('../../config.php');
- require_login();
+ require_once($CFG->dirroot . '/admin/adminlib.php');
+ admin_externalpage_setup('manageroles');
+// require_login();
$roleid = optional_param('roleid', 0, PARAM_INT); // if set, we are editing a role
$action = optional_param('action', '', PARAM_ALPHA);
@@ -13,13 +15,13 @@
$sitecontext = get_context_instance(CONTEXT_SYSTEM, SITEID);
- if (!isadmin()) {
- error('Only admins can access this page');
- }
+// if (!isadmin()) {
+// error('Only admins can access this page');
+// }
- if (!$site = get_site()) {
- redirect('index.php');
- }
+// if (!$site = get_site()) {
+// redirect('index.php');
+// }
$stradministration = get_string('administration');
$strmanageroles = get_string('manageroles');
@@ -32,11 +34,12 @@
$editingstr ='';
}
- print_header("$site->shortname: $strmanageroles",
- "$site->fullname",
- "
$stradministration ->
$strmanageroles
- $editingstr
- ");
+ admin_externalpage_print_header();
+// print_header("$site->shortname: $strmanageroles",
+// "$site->fullname",
+// "
$stradministration ->
$strmanageroles
+// $editingstr
+// ");
// form processing, editing a role, adding a role or deleting a role
if ($action && confirm_sesskey()) {
@@ -128,7 +131,8 @@
echo ('
');
echo ('are you sure?');
echo ('
');
- print_footer($course);
+ admin_externalpage_print_footer();
+// print_footer($course);
exit;
// prints confirmation form
@@ -205,5 +209,6 @@
}
use_html_editor("description");
- print_footer($course);
+ admin_externalpage_print_footer();
+// print_footer($course);
?>
diff --git a/admin/settings.php b/admin/settings.php
new file mode 100644
index 0000000000000..284afdec4ba0d
--- /dev/null
+++ b/admin/settings.php
@@ -0,0 +1,90 @@
+dirroot . '/admin/adminlib.php');
+
+// for external pages, most of this code is duplicated in the admin_externalpage_print_header()
+// and admin_externalpage_print_footer() functions... just include adminlib.php!
+//
+// lines marked //d at the end are handled (for other pages) by admin_externalpage_print_header()
+// and admin_externalpage_print_footer()
+require_once($CFG->libdir . '/blocklib.php'); //d
+require_once($CFG->dirroot . '/admin/pagelib.php'); //d
+
+if ($site = get_site()) { //d
+ require_login(); //d
+} //d
+
+// Question: what pageid should be used for this?
+
+define('TEMPORARY_ADMIN_PAGE_ID',26); //d
+
+define('BLOCK_L_MIN_WIDTH',160); //d
+define('BLOCK_L_MAX_WIDTH',210); //d
+
+$pagetype = PAGE_ADMIN; //d
+$pageclass = 'page_admin'; //d
+page_map_class($pagetype, $pageclass); //d
+
+$PAGE = page_create_object($pagetype,TEMPORARY_ADMIN_PAGE_ID); //d
+
+$PAGE->init_full(); //d
+
+unset($root); //d
+
+$root = $ADMIN->locate($PAGE->section); //d
+
+if (!($root instanceof admin_settingpage)) { //d
+ error('Section does not exist, is invalid, or should not be accessed via this URL.'); //d
+ die; //d
+} //d
+
+if (!($root->check_access())) { //d
+ error('Access denied.'); //d
+ die; //d
+} //d
+
+// WRITING SUBMITTED DATA (IF ANY) -------------------------------------------------------------------------------
+
+if ($data = data_submitted()) {
+ if (confirm_sesskey()) {
+ $errors = $root->write_settings((array)$data);
+ if (empty($errors)) {
+ redirect("$CFG->wwwroot/admin/settings.php?section=" . $PAGE->section, get_string('changessaved'),1);
+ } else {
+ error('The following errors occurred when trying to save settings:
' . $errors);
+ }
+ } else {
+ error(get_string('confirmsesskeybad', 'error'));
+ die;
+ }
+}
+
+// ---------------------------------------------------------------------------------------------------------------
+
+$pageblocks = blocks_setup($PAGE);
+
+$preferred_width_left = bounded_number(BLOCK_L_MIN_WIDTH, blocks_preferred_width($pageblocks[BLOCK_POS_LEFT]), BLOCK_L_MAX_WIDTH);
+
+// print header stuff
+$PAGE->print_header();
+echo '
';
+echo '';
+blocks_print_group($PAGE, $pageblocks, BLOCK_POS_LEFT);
+echo ' ';
+echo '';
+echo '';
+print_simple_box_end();
+echo '
'; //d
+
+print_footer(); //d
+
+?>
\ No newline at end of file
diff --git a/admin/timezoneimport.php b/admin/timezoneimport.php
index 29473c38a63a4..308c0fab79d92 100644
--- a/admin/timezoneimport.php
+++ b/admin/timezoneimport.php
@@ -1,22 +1,16 @@
dirroot .'/admin/adminlib.php');
require_once($CFG->libdir.'/filelib.php');
require_once($CFG->libdir.'/olson.php');
- $ok = optional_param('ok', 0, PARAM_BOOL);
-
- require_login();
+ admin_externalpage_setup('timezoneimport');
- if (!isadmin()) {
- error('Only administrators can use this page!');
- }
+ $ok = optional_param('ok', 0, PARAM_BOOL);
- if (!$site = get_site()) {
- error('Site isn\'t defined!');
- }
/// Print headings
@@ -25,10 +19,7 @@
$strcalendarsettings = get_string('calendarsettings', 'admin');
$strimporttimezones = get_string('importtimezones', 'admin');
- print_header("$site->shortname: $strcalendarsettings", "$site->fullname",
- "
$stradministration -> ".
- "
$strconfiguration -> ".
- "
$strcalendarsettings -> $strimporttimezones");
+ admin_externalpage_print_header();
print_heading($strimporttimezones);
@@ -42,9 +33,9 @@
$message = get_string("configintrotimezones", 'admin', $message);
- notice_yesno($message, 'timezoneimport.php?ok=1&sesskey='.sesskey(), 'calendar.php');
+ notice_yesno($message, 'timezoneimport.php?ok=1&sesskey='.sesskey(), 'index.php');
- print_footer();
+ admin_externalpage_print_footer();
exit;
}
@@ -110,7 +101,7 @@
$a->source = $importdone;
print_heading(get_string('importtimezonescount', 'admin', $a), '', 3);
- print_continue('calendar.php');
+ print_continue('index.php');
$timezonelist = array();
foreach ($timezones as $timezone) {
@@ -131,9 +122,9 @@
} else {
print_heading(get_string('importtimezonesfailed', 'admin'), '', 3);
- print_continue('calendar.php');
+ print_continue('index.php');
}
- print_footer();
+ admin_externalpage_print_footer();
?>
diff --git a/admin/user.php b/admin/user.php
index 0714fdec8feab..32f03bde6aea6 100644
--- a/admin/user.php
+++ b/admin/user.php
@@ -1,6 +1,11 @@
dirroot . '/admin/adminlib.php');
+
+admin_externalpage_setup('editusers');
+admin_externalpage_print_header();
+
$newuser = optional_param('newuser', 0, PARAM_BOOL);
$delete = optional_param('delete', 0, PARAM_INT);
@@ -106,7 +111,7 @@
if ($newuser && confirm_sesskey()) { // Create a new user
- if (!has_capability('moodle/user:create', $context)) {
+ if (!has_capability('moodle/user:create', $context->id)) {
error('You do not have the required permission to create new users.');
}
@@ -130,7 +135,7 @@
} else { // List all users for editing
- if (!has_capability('moodle/user:update', $context)) {
+ if (!has_capability('moodle/user:update', $context->id)) {
error('You do not have the required permission to edit users.');
}
@@ -143,16 +148,6 @@
$strsearch = get_string("search");
$strshowallusers = get_string("showallusers");
- if ($firstinitial or $lastinitial or $search or $page) {
- print_header("$site->shortname: $stredituser", $site->fullname,
- "
$stradministration -> ".
- "
$strusers -> ".
- "
$stredituser ");
- } else {
- print_header("$site->shortname: $stredituser", $site->fullname,
- "
$stradministration -> ".
- "
$strusers -> $stredituser");
- }
if ($confirmuser and confirm_sesskey()) {
if (!$user = get_record("user", "id", "$confirmuser")) {
@@ -172,7 +167,7 @@
} else if ($delete and confirm_sesskey()) { // Delete a selected user, after confirmation
- if (!has_capability('moodle/user:delete', $context)) {
+ if (!has_capability('moodle/user:delete', $context->id)) {
error('You do not have the required permission to delete a user.');
}
@@ -344,7 +339,7 @@
if ($user->id == $USER->id or $user->username == "changeme") {
$deletebutton = "";
} else {
- if (has_capability('moodle/user:delete', $context)) {
+ if (has_capability('moodle/user:delete', $context->id)) {
$deletebutton = "
id&sesskey=$USER->sesskey\">$strdelete "; } else {
$deletebutton ="";
}
@@ -361,7 +356,7 @@
}
$fullname = fullname($user, true);
- if (has_capability('moodle/user:edit', $context)) {
+ if (has_capability('moodle/user:edit', $context->id)) {
$table->data[] = array ("
id&course=$site->id\">$fullname ",
"$user->email",
@@ -394,7 +389,7 @@
echo "";
echo "";
- if (has_capability('moodle/user:create', $context)) {
+ if (has_capability('moodle/user:create', $context->id)) {
print_heading("
sesskey\">".get_string("addnewuser")." ");
}
if (!empty($table)) {
@@ -402,13 +397,13 @@
print_paging_bar($usercount, $page, $perpage,
"user.php?sort=$sort&dir=$dir&perpage=$perpage".
"&firstinitial=$firstinitial&lastinitial=$lastinitial&search=".urlencode(stripslashes($search))."&");
- if (has_capability('moodle/user:create', $context)) {
+ if (has_capability('moodle/user:create', $context->id)) {
print_heading("
sesskey\">".get_string("addnewuser")." ");
}
}
- print_footer();
+ admin_externalpage_print_footer();
}
-?>
+?>
\ No newline at end of file