add('userinterface', new admin_externalpage('foo', get_string('foo'),
/// $CFG->wwwdir . '/' . '$CFG->admin . '/foo.php', 'some_role_permission'));
/// Next, in foo.php, your file structure would resemble the following:
/// require_once('.../config.php');
/// require_once($CFG->dirroot . '/' . $CFG->admin . '/adminlib.php');
/// admin_externalpage_setup('foo');
/// // functionality like processing form submissions goes here
/// admin_externalpage_print_header();
/// // your HTML goes here
/// admin_externalpage_print_footer();
/// The admin_externalpage_setup() function call ensures the user is logged in,
/// and makes sure that they have the proper role permission to access the page.
/// The admin_externalpage_print_header() function prints the header (it figures
/// out what category and subcategories the page is classified under) and ensures
/// that you're using the admin pagelib (which provides the admin tree block and
/// the admin bookmarks block).
/// The admin_externalpage_print_footer() function properly closes the tables
/// opened up by the admin_externalpage_print_header() function and prints the
/// standard Moodle footer.
/// ADMIN_CATEGORY OBJECTS
/// Above and beyond all this, we have admin_category objects. These objects
/// appear as folders in the admin tree block. They contain admin_settingpage's,
/// admin_externalpage's, and other admin_category's.
/// OTHER NOTES
/// admin_settingpage's, admin_externalpage's, and admin_category's all inherit
/// from part_of_admin_tree (a pseudointerface). This interface insists that
/// a class has a check_access method for access permissions, a locate method
/// used to find a specific node in the $ADMIN tree, and a path method used
/// to determine the path to a specific node in the $ADMIN tree.
/// admin_category's inherit from parentable_part_of_admin_tree. This pseudo-
/// interface ensures that the class implements a recursive add function which
/// accepts a part_of_admin_tree object and searches for the proper place to
/// put it. parentable_part_of_admin_tree implies part_of_admin_tree.
/// Please note that the $this->name field of any part_of_admin_tree must be
/// UNIQUE throughout the ENTIRE admin tree.
/// The $this->name field of an admin_setting object (which is *not* part_of_
/// admin_tree) must be unique on the respective admin_settingpage where it is
/// used.
/// MISCELLANEOUS STUFF (used by classes defined below) ///////////////////////
include_once($CFG->dirroot . '/backup/lib.php');
/// CLASS DEFINITIONS /////////////////////////////////////////////////////////
/**
* Pseudointerface for anything appearing in the admin tree
*
* The pseudointerface that is implemented by anything that appears in the admin tree
* block. It forces inheriting classes to define a method for checking user permissions
* and methods for finding something in the admin tree.
*
* @author Vincenzo K. Marcovecchio
* @package admin
*/
class part_of_admin_tree {
/**
* Finds a named part_of_admin_tree.
*
* Used to find a part_of_admin_tree. If a class only inherits part_of_admin_tree
* and not parentable_part_of_admin_tree, then this function should only check if
* $this->name matches $name. If it does, it should return a reference to $this,
* otherwise, it should return a reference to NULL.
*
* If a class inherits parentable_part_of_admin_tree, this method should be called
* recursively on all child objects (assuming, of course, the parent object's name
* doesn't match the search criterion).
*
* @param string $name The internal name of the part_of_admin_tree we're searching for.
* @return mixed An object reference or a NULL reference.
*/
function &locate($name) {
trigger_error('Admin class does not implement method locate()', E_USER_WARNING);
return;
}
/**
* Verifies current user's access to this part_of_admin_tree.
*
* Used to check if the current user has access to this part of the admin tree or
* not. If a class only inherits part_of_admin_tree and not parentable_part_of_admin_tree,
* then this method is usually just a call to has_capability() in the site context.
*
* If a class inherits parentable_part_of_admin_tree, this method should return the
* logical OR of the return of check_access() on all child objects.
*
* @return bool True if the user has access, false if she doesn't.
*/
function check_access() {
trigger_error('Admin class does not implement method check_access()', E_USER_WARNING);
return;
}
/**
* Determines the path to $name in the admin tree.
*
* Used to determine the path to $name in the admin tree. If a class inherits only
* part_of_admin_tree and not parentable_part_of_admin_tree, then this method should
* check if $this->name matches $name. If it does, $name is pushed onto the $path
* array (at the end), and $path should be returned. If it doesn't, NULL should be
* returned.
*
* If a class inherits parentable_part_of_admin_tree, it should do the above, but not
* return NULL on failure. Instead, it pushes $this->name onto $path, and then
* recursively calls path() on its child objects. If any are non-NULL, it should
* return $path (being certain that the last element of $path is equal to $name).
* If they are all NULL, it returns NULL.
*
* @param string $name The internal name of the part_of_admin_tree we're searching for.
* @param array $path Not used on external calls. Defaults to empty array.
* @return mixed If found, an array containing the internal names of each part_of_admin_tree that leads to $name. If not found, NULL.
*/
function path($name, $path = array()) {
trigger_error('Admin class does not implement method path()', E_USER_WARNING);
return;
}
}
/**
* Pseudointerface implemented by any part_of_admin_tree that has children.
*
* The pseudointerface implemented by any part_of_admin_tree that can be a parent
* to other part_of_admin_tree's. (For now, this only includes admin_category.) Apart
* from ensuring part_of_admin_tree compliancy, it also ensures inheriting methods
* include an add method for adding other part_of_admin_tree objects as children.
*
* @author Vincenzo K. Marcovecchio
* @package admin
*/
class parentable_part_of_admin_tree extends part_of_admin_tree {
/**
* Adds a part_of_admin_tree object to the admin tree.
*
* Used to add a part_of_admin_tree object to this object or a child of this
* object. $something should only be added if $destinationname matches
* $this->name. If it doesn't, add should be called on child objects that are
* also parentable_part_of_admin_tree's.
*
* @param string $destinationname The internal name of the new parent for $something.
* @param part_of_admin_tree &$something The object to be added.
* @return bool True on success, false on failure.
*/
function add($destinationname, &$something) {
trigger_error('Admin class does not implement method add()', E_USER_WARNING);
return;
}
}
/**
* The object used to represent folders (a.k.a. categories) in the admin tree block.
*
* Each admin_category object contains a number of part_of_admin_tree objects.
*
* @author Vincenzo K. Marcovecchio
* @package admin
*/
class admin_category extends parentable_part_of_admin_tree {
/**
* @var mixed An array of part_of_admin_tree objects that are this object's children
*/
var $children;
/**
* @var string An internal name for this category. Must be unique amongst ALL part_of_admin_tree objects
*/
var $name;
/**
* @var string The displayed name for this category. Usually obtained through get_string()
*/
var $visiblename;
// constructor for an empty admin category
// $name is the internal name of the category. it MUST be unique in the entire hierarchy
// $visiblename is the displayed name of the category. use a get_string for this
/**
* Constructor for an empty admin category
*
* @param string $name The internal name for this category. Must be unique amongst ALL part_of_admin_tree objects
* @param string $visiblename The displayed named for this category. Usually obtained through get_string()
* @return mixed Returns the new object.
*/
function admin_category($name, $visiblename) {
$this->children = array();
$this->name = $name;
$this->visiblename = $visiblename;
}
/**
* Finds the path to the part_of_admin_tree called $name.
*
* @param string $name The internal name that we're searching for.
* @param array $path Used internally for recursive calls. Do not specify on external calls. Defaults to array().
* @return mixed An array of internal names that leads to $name, or NULL if not found.
*/
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;
}
/**
* Returns a reference to the part_of_admin_tree object with internal name $name.
*
* @param string $name The internal name of the object we want.
* @return mixed A reference to the object with internal name $name if found, otherwise a reference to 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;
}
/**
* Adds a part_of_admin_tree to a child or grandchild (or great-grandchild, and so forth) of this object.
*
* @param string $destinationame The internal name of the immediate parent that we want for &$something.
* @param mixed &$something A part_of_admin_tree object to be added.
* @param int $precedence The precedence of &$something when displayed. Smaller numbers mean it'll be displayed higher up in the admin menu. Defaults to '', meaning "next available position".
* @return bool True if successfully added, false if &$something is not a part_of_admin_tree or if $name is not found.
*/
function add($destinationname, &$something, $precedence = '') {
if (!is_a($something, '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;
}
unset($entries);
$entries = array_keys($this->children);
foreach($entries as $entry) {
$child =& $this->children[$entry];
if (is_a($child, 'parentable_part_of_admin_tree')) {
if ($child->add($destinationname, $something, $precedence)) {
return true;
}
}
}
return false;
}
/**
* Checks if the user has access to anything in this category.
*
* @return bool True if the user has access to atleast one child in this category, false otherwise.
*/
function check_access() {
$return = false;
foreach ($this->children as $child) {
$return = $return || $child->check_access();
}
return $return;
}
}
/**
* Links external PHP pages into the admin tree.
*
* See detailed usage example at the top of this document (adminlib.php)
*
* @author Vincenzo K. Marcovecchio
* @package admin
*/
class admin_externalpage extends part_of_admin_tree {
/**
* @var string An internal name for this external page. Must be unique amongst ALL part_of_admin_tree objects
*/
var $name;
/**
* @var string The displayed name for this external page. Usually obtained through get_string().
*/
var $visiblename;
/**
* @var string The external URL that we should link to when someone requests this external page.
*/
var $url;
/**
* @var string The role capability/permission a user must have to access this external page.
*/
var $role;
/**
* Constructor for adding an external page into the admin tree.
*
* @param string $name The internal name for this external page. Must be unique amongst ALL part_of_admin_tree objects.
* @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 string $role The role capability/permission a user must have to access this external page. Defaults to 'moodle/legacy:admin'.
*/
function admin_externalpage($name, $visiblename, $url, $role = 'moodle/legacy:admin') {
$this->name = $name;
$this->visiblename = $visiblename;
$this->url = $url;
$this->role = $role;
}
/**
* Finds the path to the part_of_admin_tree called $name.
*
* @param string $name The internal name that we're searching for.
* @param array $path Used internally for recursive calls. Do not specify on external calls. Defaults to array().
* @return mixed An array of internal names that leads to $name, or NULL if not found.
*/
function path($name, $path = array()) {
if ($name == $this->name) {
array_push($path, $this->name);
return $path;
} else {
return NULL;
}
}
/**
* Returns a reference to the part_of_admin_tree object with internal name $name.
*
* @param string $name The internal name of the object we want.
* @return mixed A reference to the object with internal name $name if found, otherwise a reference to NULL.
*/
function &locate($name) {
$return = ($this->name == $name ? $this : NULL);
return $return;
}
/**
* Determines if the current user has access to this external page based on $this->role.
*
* @uses CONTEXT_SYSTEM
* @uses SITEID
* @return bool True if user has access, false otherwise.
*/
function check_access() {
if (!get_site()) {
return true; // no access check before site is fully set up
}
$context = get_context_instance(CONTEXT_SYSTEM, SITEID);
return has_capability($this->role, $context);
}
}
/**
* Used to group a number of admin_setting objects into a page and add them to the admin tree.
*
* @author Vincenzo K. Marcovecchio
* @package admin
*/
class admin_settingpage extends part_of_admin_tree {
/**
* @var string An internal name for this external page. Must be unique amongst ALL part_of_admin_tree objects
*/
var $name;
/**
* @var string The displayed name for this external page. Usually obtained through get_string().
*/
var $visiblename;
/**
* @var mixed An array of admin_setting objects that are part of this setting page.
*/
var $settings;
/**
* @var string The role capability/permission a user must have to access this external page.
*/
var $role;
// see admin_category
function path($name, $path = array()) {
if ($name == $this->name) {
array_push($path, $this->name);
return $path;
} else {
return NULL;
}
}
// see admin_category
function &locate($name) {
$return = ($this->name == $name ? $this : NULL);
return $return;
}
// see admin_externalpage
function admin_settingpage($name, $visiblename, $role = 'moodle/legacy:admin') {
global $CFG;
$this->settings = new stdClass();
$this->name = $name;
$this->visiblename = $visiblename;
$this->role = $role;
}
// not the same as add for admin_category. adds an admin_setting to this admin_settingpage. settings appear (on the settingpage) in the order in which they're added
// n.b. each admin_setting in an admin_settingpage must have a unique internal name
// &$setting is the admin_setting object you want to add
// returns true if successful, false if not (will fail if &$setting is an admin_setting or child thereof)
function add(&$setting) {
if (is_a($setting, 'admin_setting')) {
$this->settings->{$setting->name} =& $setting;
return true;
}
return false;
}
// see admin_externalpage
function check_access() {
if (!get_site()) {
return true; // no access check before site is fully set up
}
$context = get_context_instance(CONTEXT_SYSTEM, SITEID);
return has_capability($this->role, $context);
}
// outputs this page as html in a table (suitable for inclusion in an admin pagetype)
// returns a string of the html
function output_html() {
$return = '
';
return $return;
}
// writes settings (the ones that have been added to this admin_settingpage) to the database, or wherever else they're supposed to be written to
// -- calls write_setting() to each child setting, sending it only the data that matches each setting's internal name
// $data should be the result from data_submitted()
// returns an empty string if everything went well, otherwise returns a printable error string (that's language-specific)
function write_settings($data) {
$return = '';
foreach($this->settings as $setting) {
if (isset($data['s_' . $setting->name])) {
$return .= $setting->write_setting($data['s_' . $setting->name]);
} else {
$return .= $setting->write_setting('');
}
}
return $return;
}
}
// read & write happens at this level; no authentication
class admin_setting {
var $name;
var $visiblename;
var $description;
var $defaultsetting;
function admin_setting($name, $visiblename, $description, $defaultsetting) {
$this->name = $name;
$this->visiblename = $visiblename;
$this->description = $description;
$this->defaultsetting = $defaultsetting;
}
function get_setting() {
return NULL; // 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, $defaultsetting, $paramtype) {
$this->paramtype = $paramtype;
parent::admin_setting($name, $visiblename, $description, $defaultsetting);
}
function get_setting() {
global $CFG;
return (isset($CFG->{$this->name}) ? $CFG->{$this->name} : NULL);
}
function write_setting($data) {
$data = clean_param($data, $this->paramtype);
return (set_config($this->name,$data) ? '' : get_string('errorsetting', 'admin') . $this->visiblename . ' ');
}
function output_html() {
return '
';
}
}
class admin_setting_configselect extends admin_setting {
var $choices;
function admin_setting_configselect($name, $visiblename, $description, $defaultsetting, $choices) {
$this->choices = $choices;
parent::admin_setting($name, $visiblename, $description, $defaultsetting);
}
function get_setting() {
global $CFG;
return (isset($CFG->{$this->name}) ? $CFG->{$this->name} : NULL);
}
function write_setting($data) {
// check that what we got was in the original choices
// or that the data is the default setting - needed during install when choices can not be constructed yet
if ($data != $this->defaultsetting and ! in_array($data, array_keys($this->choices))) {
return 'Error setting ' . $this->visiblename . ' ';
}
return (set_config($this->name, $data) ? '' : get_string('errorsetting', 'admin') . $this->visiblename . ' ');
}
function output_html() {
$return = '
' . $this->visiblename . '
' . $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;
var $defaultsetting2;
function admin_setting_configtime($hoursname, $minutesname, $visiblename, $description, $defaultsetting) {
$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, $defaultsetting);
}
function get_setting() {
global $CFG;
return (isset($CFG->{$this->name}) && isset($CFG->{$this->name2}) ? array($CFG->{$this->name}, $CFG->{$this->name2}) : NULL);
}
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 get_string('errorsetting', 'admin') . $this->visiblename . ' ';
}
return (set_config($this->name, $data['h']) && set_config($this->name2, $data['m']) ? '' : get_string('errorsetting', 'admin') . $this->visiblename . ' ');
}
function output_html() {
$setvalue = $this->get_setting();
if (!is_array($setvalue)) {
$setvalue = array(0,0);
}
$return = '
' . $this->visiblename . '
' . $this->description . '
';
return $return;
}
}
class admin_setting_configmultiselect extends admin_setting_configselect {
function admin_setting_configmultiselect($name, $visiblename, $description, $defaultsetting, $choices) {
parent::admin_setting_configselect($name, $visiblename, $description, $defaultsetting, $choices);
}
function get_setting() {
global $CFG;
return (isset($CFG->{$this->name}) ? explode(',', $CFG->{$this->name}) : NULL);;
}
function write_setting($data) {
foreach ($data as $datum) {
if (! in_array($datum, array_keys($this->choices))) {
return get_string('errorsetting', 'admin') . $this->visiblename . ' ';
}
}
return (set_config($this->name, implode(',',$data)) ? '' : get_string('errorsetting', 'admin') . $this->visiblename . ' ');
}
function output_html() {
$currentsetting = $this->get_setting();
if (!is_array($currentsetting)) {
$currentsetting = array();
}
$return = '
';
return $return;
}
}
class admin_setting_backupselect extends admin_setting_configselect {
function admin_setting_backupselect($name, $visiblename, $description, $default, $choices) {
parent::admin_setting_configselect($name, $visiblename, $description, $default, $choices);
}
function get_setting() {
$backup_config = backup_get_config();
return (isset($backup_config->{$this->name}) ? $backup_config->{$this->name} : NULL);
}
function write_setting($data) {
// check that what we got was in the original choices
if (! in_array($data, array_keys($this->choices))) {
return get_string('errorsetting', 'admin') . $this->visiblename . ' ';
}
return (backup_set_config($this->name, $data) ? '' : get_string('errorsetting', 'admin') . $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, '', PARAM_PATH);
}
function get_setting() {
$backup_config = backup_get_config();
return (isset($backup_config->{$this->name}) ? $backup_config->{$this->name} : NULL);
}
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) ? '' : get_string('errorsetting', 'admin') . $this->visiblename . ' ');
}
}
class admin_setting_backupcheckbox extends admin_setting_configcheckbox {
function admin_setting_backupcheckbox($name, $visiblename, $description, $default) {
parent::admin_setting_configcheckbox($name, $visiblename, $description, $default);
}
function write_setting($data) {
if ($data == '1') {
return (backup_set_config($this->name, 1) ? '' : get_string('errorsetting', 'admin') . $this->visiblename . ' ');
} else {
return (backup_set_config($this->name, 0) ? '' : get_string('errorsetting', 'admin') . $this->visiblename . ' ');
}
}
function get_setting() {
$backup_config = backup_get_config();
return (isset($backup_config->{$this->name}) ? $backup_config->{$this->name} : NULL);
}
}
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');
$default = array('h' => 0, 'm' => 0);
parent::admin_setting_configtime($name, $name2, $visiblename, $description, $default);
}
function get_setting() {
$backup_config = backup_get_config();
return (isset($backup_config->{$this->name}) && isset($backup_config->{$this->name}) ? array($backup_config->{$this->name}, $backup_config->{$this->name2}) : NULL);
}
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 get_string('errorsetting', 'admin') . $this->visiblename . ' ';
}
return (backup_set_config($this->name, $data['h']) && backup_set_config($this->name2, $data['m']) ? '' : get_string('errorsetting', 'admin') . $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, array());
}
function get_setting() {
$backup_config = backup_get_config();
return (isset($backup_config->{$this->name}) ? $backup_config->{$this->name} : NULL);
}
function output_html() {
$currentsetting = $this->get_setting();
if ($currentsetting === NULL) {
$currentsetting = '0000000';
}
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') . '
' .
'
' .
'
' .
'
' .
'
' .
'
' .
'
' .
'
' .
'
' .
'
' . $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)) ? '' : get_string('errorsetting', 'admin') . $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) ? '' : get_string('errorsetting', 'admin') . $this->visiblename . ' ');
} else {
return (set_config($this->name,7) ? '' : get_string('errorsetting', 'admin') . $this->visiblename . ' ');
}
}
function output_html() {
return '
';
}
function admin_externalpage_print_footer() {
echo '
';
print_footer();
}
// n.b. this function unconditionally applies default settings
function apply_default_settings(&$node) {
global $CFG;
if (is_a($node, 'admin_category')) {
$entries = array_keys($node->children);
foreach ($entries as $entry) {
apply_default_settings($node->children[$entry]);
}
return;
}
if (is_a($node, 'admin_settingpage')) {
foreach ($node->settings as $setting) {
$CFG->{$setting->name} = $setting->defaultsetting;
$setting->write_setting($setting->defaultsetting);
unset($setting); // needed to prevent odd (imho) reference behaviour
// see http://www.php.net/manual/en/language.references.whatdo.php#AEN6399
}
return;
}
return;
}
// n.b. this function unconditionally applies default settings
function apply_default_exception_settings($defaults) {
global $CFG;
foreach($defaults as $key => $value) {
$CFG->$key = $value;
set_config($key, $value);
}
}
// 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);
}
}
?>