diff --git a/admin/settings/courses.php b/admin/settings/courses.php
index 60f10c5ccc9..4a34a7affe5 100644
--- a/admin/settings/courses.php
+++ b/admin/settings/courses.php
@@ -19,43 +19,41 @@ if ($hassiteconfig
// "backups" settingpage
if (!empty($CFG->backup_version)) {
- $bi = array();
- $bi[] = new admin_setting_configcheckbox('backup_sche_modules', get_string('includemodules'), get_string('backupincludemoduleshelp'), 0);
- $bi[] = new admin_setting_configcheckbox('backup_sche_withuserdata', get_string('includemoduleuserdata'), get_string('backupincludemoduleuserdatahelp'), 0);
- $bi[] = new admin_setting_configcheckbox('backup_sche_metacourse', get_string('metacourse'), get_string('backupmetacoursehelp'), 0);
- $bi[] = new admin_setting_configselect('backup_sche_users', get_string('users'), get_string('backupusershelp'),
- 0, array(0 => get_string('all'), 1 => get_string('course')));
- $bi[] = new admin_setting_configcheckbox('backup_sche_logs', get_string('logs'), get_string('backuplogshelp'), 0);
- $bi[] = new admin_setting_configcheckbox('backup_sche_userfiles', get_string('userfiles'), get_string('backupuserfileshelp'), 0);
- $bi[] = new admin_setting_configcheckbox('backup_sche_coursefiles', get_string('coursefiles'), get_string('backupcoursefileshelp'), 0);
- $bi[] = new admin_setting_configcheckbox('backup_sche_sitefiles', get_string('sitefiles'), get_string('backupsitefileshelp'), 0);
- $bi[] = new admin_setting_configcheckbox('backup_sche_messages', get_string('messages', 'message'), get_string('backupmessageshelp','message'), 0);
- $bi[] = new admin_setting_configcheckbox('backup_sche_blogs', get_string('blogs', 'blog'), get_string('backupblogshelp','blog'), 0);
- $bi[] = new admin_setting_configselect('backup_sche_keep', get_string('keep'),
- get_string('backupkeephelp'), 1, array(0 => get_string('all'), 1 => '1',
- 2 => '2',
- 5 => '5',
- 10 => '10',
- 20 => '20',
- 30 => '30',
- 40 => '40',
- 50 => '50',
- 100 => '100',
- 200 => '200',
- 300 => '300',
- 400 => '400',
- 500 => '500'));
- $bi[] = new admin_setting_configcheckbox('backup_sche_active', get_string('active'), get_string('backupactivehelp'), 0);
- $bi[] = new admin_setting_special_backupdays();
- $bi[] = new admin_setting_configtime('backup_sche_hour', 'backup_sche_minute', get_string('executeat'),
- get_string('backupexecuteathelp'), array('h' => 0, 'm' => 0));
- $bi[] = new admin_setting_configdirectory('backup_sche_destination', get_string('saveto'), get_string('backupsavetohelp'), '');
-
$temp = new admin_settingpage('backups', get_string('backups','admin'), 'moodle/site:backup');
- foreach ($bi as $backupitem) {
- $backupitem->plugin = 'backup';
- $temp->add($backupitem);
- }
+ $temp->add(new admin_setting_configcheckbox('backup/backup_sche_modules', get_string('includemodules'), get_string('backupincludemoduleshelp'), 0));
+ $temp->add(new admin_setting_configcheckbox('backup/backup_sche_withuserdata', get_string('includemoduleuserdata'), get_string('backupincludemoduleuserdatahelp'), 0));
+ $temp->add(new admin_setting_configcheckbox('backup/backup_sche_metacourse', get_string('metacourse'), get_string('backupmetacoursehelp'), 0));
+ $temp->add(new admin_setting_configselect('backup/backup_sche_users', get_string('users'), get_string('backupusershelp'),
+ 0, array(0 => get_string('all'), 1 => get_string('course'))));
+ $temp->add(new admin_setting_configcheckbox('backup/backup_sche_logs', get_string('logs'), get_string('backuplogshelp'), 0));
+ $temp->add(new admin_setting_configcheckbox('backup/backup_sche_userfiles', get_string('userfiles'), get_string('backupuserfileshelp'), 0));
+ $temp->add(new admin_setting_configcheckbox('backup/backup_sche_coursefiles', get_string('coursefiles'), get_string('backupcoursefileshelp'), 0));
+ $temp->add(new admin_setting_configcheckbox('backup/backup_sche_sitefiles', get_string('sitefiles'), get_string('backupsitefileshelp'), 0));
+ $temp->add(new admin_setting_configcheckbox('backup/backup_sche_messages', get_string('messages', 'message'), get_string('backupmessageshelp','message'), 0));
+ $temp->add(new admin_setting_configcheckbox('backup/backup_sche_blogs', get_string('blogs', 'blog'), get_string('backupblogshelp','blog'), 0));
+
+ $keepoptoins = array(
+ 0 => get_string('all'), 1 => '1',
+ 2 => '2',
+ 5 => '5',
+ 10 => '10',
+ 20 => '20',
+ 30 => '30',
+ 40 => '40',
+ 50 => '50',
+ 100 => '100',
+ 200 => '200',
+ 300 => '300',
+ 400 => '400',
+ 500 => '500');
+ $temp->add(new admin_setting_configselect('backup/backup_sche_keep', get_string('keep'),
+ get_string('backupkeephelp'), 1, $keepoptoins));
+ $temp->add(new admin_setting_configcheckbox('backup/backup_sche_active', get_string('active'), get_string('backupactivehelp'), 0));
+ $temp->add(new admin_setting_special_backupdays());
+ $temp->add(new admin_setting_configtime('backup/backup_sche_hour', 'backup_sche_minute', get_string('executeat'),
+ get_string('backupexecuteathelp'), array('h' => 0, 'm' => 0)));
+ $temp->add(new admin_setting_configdirectory('backup/backup_sche_destination', get_string('saveto'), get_string('backupsavetohelp'), ''));
+
$ADMIN->add('courses', $temp);
}
diff --git a/lib/adminlib.php b/lib/adminlib.php
index e4df8f088aa..b8a363abea6 100644
--- a/lib/adminlib.php
+++ b/lib/adminlib.php
@@ -2377,12 +2377,37 @@ class admin_setting {
* @param mixed $defaultsetting string or array depending on implementation
*/
function admin_setting($name, $visiblename, $description, $defaultsetting) {
- $this->name = $name;
+ $this->parse_setting_name($name);
$this->visiblename = $visiblename;
$this->description = $description;
$this->defaultsetting = $defaultsetting;
}
+ /**
+ * Set up $this->name and possibly $this->plugin based on whether $name looks
+ * like 'settingname' or 'plugin/settingname'. Also, do some sanity checking
+ * on the names, that is, output a developer debug warning if the name
+ * contains anything other than [a-zA-Z0-9_]+.
+ *
+ * @param string $name the setting name passed in to the constructor.
+ */
+ private function parse_setting_name($name) {
+ $bits = explode('/', $name);
+ if (count($bits) > 2) {
+ throw new moodle_exception('invalidadminsettingname', '', '', $name);
+ }
+ $this->name = array_pop($bits);
+ if (!preg_match('/^[a-zA-Z0-9_]+$/', $this->name)) {
+ throw new moodle_exception('invalidadminsettingname', '', '', $name);
+ }
+ if (!empty($bits)) {
+ $this->plugin = array_pop($bits);
+ if (!preg_match('/^[a-zA-Z0-9_]+$/', $this->plugin)) {
+ throw new moodle_exception('invalidadminsettingname', '', '', $name);
+ }
+ }
+ }
+
function get_full_name() {
return 's_'.$this->plugin.'_'.$this->name;
}
@@ -4188,11 +4213,10 @@ class admin_setting_pickroles extends admin_setting_configmulticheckbox {
}
/**
- * Text field linked to config_plugins for the quiz, with an advanced checkbox.
+ * Text field with an advanced checkbox, that controls a additional "fix_$name" setting.
*/
-class admin_setting_quiz_text extends admin_setting_configtext {
+class admin_setting_text_with_advanced extends admin_setting_configtext {
function __construct($name, $visiblename, $description, $defaultsetting, $paramtype) {
- $this->plugin = 'quiz';
parent::admin_setting_configtext($name, $visiblename, $description,
$defaultsetting, $paramtype);
}
@@ -4248,11 +4272,10 @@ class admin_setting_quiz_text extends admin_setting_configtext {
}
/**
- * Dropdown menu linked to config_plugins for the quiz, with an advanced checkbox.
+ * Dropdown menu with an advanced checkbox, that controls a additional "fix_$name" setting.
*/
-class admin_setting_quiz_combo extends admin_setting_configselect {
+class admin_setting_combo_with_advanced extends admin_setting_configselect {
function __construct($name, $visiblename, $description, $defaultsetting, $choices) {
- $this->plugin = 'quiz';
parent::admin_setting_configselect($name, $visiblename, $description,
$defaultsetting, $choices);
}
@@ -4316,106 +4339,11 @@ class admin_setting_quiz_combo extends admin_setting_configselect {
}
}
-class admin_setting_quiz_reviewoptions extends admin_setting {
- private static $times = array(
- QUIZ_REVIEW_IMMEDIATELY => 'reviewimmediately',
- QUIZ_REVIEW_OPEN => 'reviewopen',
- QUIZ_REVIEW_CLOSED => 'reviewclosed');
- private static $things = array(
- QUIZ_REVIEW_RESPONSES => 'responses',
- QUIZ_REVIEW_ANSWERS => 'answers',
- QUIZ_REVIEW_FEEDBACK => 'feedback',
- QUIZ_REVIEW_GENERALFEEDBACK => 'generalfeedback',
- QUIZ_REVIEW_SCORES => 'scores',
- QUIZ_REVIEW_OVERALLFEEDBACK => 'overallfeedback');
-
- function __construct($name, $visiblename, $description, $defaultsetting) {
- $this->plugin = 'quiz';
- parent::admin_setting($name, $visiblename, $description, $defaultsetting);
- }
-
- private function normalise_data($data) {
- $value = 0;
- foreach (admin_setting_quiz_reviewoptions::$times as $timemask => $timestring) {
- foreach (admin_setting_quiz_reviewoptions::$things as $thingmask => $thingstring) {
- if (!empty($data[$timemask][$thingmask])) {
- $value += $timemask & $thingmask;
- }
- }
- }
- return $value;
- }
-
- function get_setting() {
- $value = $this->config_read($this->name);
- $fix = $this->config_read('fix_' . $this->name);
- if (is_null($value) or is_null($fix)) {
- return NULL;
- }
- return array('value' => $value, 'fix' => $fix);
- }
-
- function write_setting($data) {
- if (!isset($data['value'])) {
- $data['value'] = $this->normalise_data($data);
- }
- $ok = $this->config_write($this->name, $data['value']);
- if ($ok) {
- if (empty($data['fix'])) {
- $ok = $this->config_write('fix_' . $this->name, 0);
- } else {
- $ok = $this->config_write('fix_' . $this->name, 1);
- }
- }
- if (!$ok) {
- return get_string('errorsetting', 'admin');
- }
- return '';
- }
-
- function output_html($data, $query='') {
- if (!isset($data['value'])) {
- $data['value'] = $this->normalise_data($data);
- }
-
- $return = '
' . "\n";
- foreach (admin_setting_quiz_reviewoptions::$times as $timemask => $timestring) {
- $return .= '
' . get_string($timestring, 'quiz') . "
\n";
- $nameprefix = $this->get_full_name() . '[' . $timemask . ']';
- $idprefix = $this->get_id(). '_' . $timemask . '_';
- foreach (admin_setting_quiz_reviewoptions::$things as $thingmask => $thingstring) {
- $id = $idprefix . $thingmask;
- $state = '';
- if ($data['value'] & $timemask & $thingmask) {
- $state = 'checked="checked" ';
- }
- $return .= '
\n";
- }
- $return .= "
\n";
- }
- $return .= "
\n";
-
- $fix = !empty($data['fix']);
- $return .= '' .
- ' ';
-
- return format_admin_setting($this, $this->visiblename, $return,
- $this->description, true, '', get_string('everythingon', 'quiz'), $query);
- }
-}
-
/**
- * Specialisation of admin_setting_quiz_combo for easy yes/no choices.
+ * Specialisation of admin_setting_combo_with_advanced for easy yes/no choices.
*/
-class admin_setting_quiz_yesno extends admin_setting_quiz_combo {
+class admin_setting_yesno_with_advanced extends admin_setting_combo_with_advanced {
function __construct($name, $visiblename, $description, $defaultsetting) {
- $this->plugin = 'quiz';
parent::__construct($name, $visiblename, $description,
$defaultsetting, array(get_string('no'), get_string('yes')));
}
diff --git a/mod/quiz/settingslib.php b/mod/quiz/settingslib.php
new file mode 100644
index 00000000000..8c8843cf3d9
--- /dev/null
+++ b/mod/quiz/settingslib.php
@@ -0,0 +1,101 @@
+ 'reviewimmediately',
+ QUIZ_REVIEW_OPEN => 'reviewopen',
+ QUIZ_REVIEW_CLOSED => 'reviewclosed');
+ private static $things = array(
+ QUIZ_REVIEW_RESPONSES => 'responses',
+ QUIZ_REVIEW_ANSWERS => 'answers',
+ QUIZ_REVIEW_FEEDBACK => 'feedback',
+ QUIZ_REVIEW_GENERALFEEDBACK => 'generalfeedback',
+ QUIZ_REVIEW_SCORES => 'scores',
+ QUIZ_REVIEW_OVERALLFEEDBACK => 'overallfeedback');
+
+ function __construct($name, $visiblename, $description, $defaultsetting) {
+ $this->plugin = 'quiz';
+ parent::admin_setting($name, $visiblename, $description, $defaultsetting);
+ }
+
+ private function normalise_data($data) {
+ $value = 0;
+ foreach (admin_setting_quiz_reviewoptions::$times as $timemask => $timestring) {
+ foreach (admin_setting_quiz_reviewoptions::$things as $thingmask => $thingstring) {
+ if (!empty($data[$timemask][$thingmask])) {
+ $value += $timemask & $thingmask;
+ }
+ }
+ }
+ return $value;
+ }
+
+ function get_setting() {
+ $value = $this->config_read($this->name);
+ $fix = $this->config_read('fix_' . $this->name);
+ if (is_null($value) or is_null($fix)) {
+ return NULL;
+ }
+ return array('value' => $value, 'fix' => $fix);
+ }
+
+ function write_setting($data) {
+ if (!isset($data['value'])) {
+ $data['value'] = $this->normalise_data($data);
+ }
+ $ok = $this->config_write($this->name, $data['value']);
+ if ($ok) {
+ if (empty($data['fix'])) {
+ $ok = $this->config_write('fix_' . $this->name, 0);
+ } else {
+ $ok = $this->config_write('fix_' . $this->name, 1);
+ }
+ }
+ if (!$ok) {
+ return get_string('errorsetting', 'admin');
+ }
+ return '';
+ }
+
+ function output_html($data, $query='') {
+ if (!isset($data['value'])) {
+ $data['value'] = $this->normalise_data($data);
+ }
+
+ $return = '' . "\n";
+ foreach (admin_setting_quiz_reviewoptions::$times as $timemask => $timestring) {
+ $return .= '
' . get_string($timestring, 'quiz') . "
\n";
+ $nameprefix = $this->get_full_name() . '[' . $timemask . ']';
+ $idprefix = $this->get_id(). '_' . $timemask . '_';
+ foreach (admin_setting_quiz_reviewoptions::$things as $thingmask => $thingstring) {
+ $id = $idprefix . $thingmask;
+ $state = '';
+ if ($data['value'] & $timemask & $thingmask) {
+ $state = 'checked="checked" ';
+ }
+ $return .= '
\n";
+ }
+ $return .= "
\n";
+ }
+ $return .= "
\n";
+
+ $fix = !empty($data['fix']);
+ $return .= '' .
+ ' ';
+
+ return format_admin_setting($this, $this->visiblename, $return,
+ $this->description, true, '', get_string('everythingon', 'quiz'), $query);
+ }
+}
+?>
\ No newline at end of file
diff --git a/mod/quiz/settingstree.php b/mod/quiz/settingstree.php
index 671cf6e6180..1c43d72c371 100644
--- a/mod/quiz/settingstree.php
+++ b/mod/quiz/settingstree.php
@@ -8,6 +8,7 @@
*/
require_once($CFG->dirroot . '/mod/quiz/lib.php');
+require_once($CFG->dirroot . '/mod/quiz/settingslib.php');
// First get a list of quiz reports with there own settings pages. If there none,
// we use a simpler overall menu structure.
@@ -39,7 +40,7 @@ $quizsettings = new admin_settingpage('modsettingquiz', $pagetitle, 'moodle/site
$quizsettings->add(new admin_setting_heading('quizintro', '', get_string('configintro', 'quiz')));
// timelimit
-$quizsettings->add(new admin_setting_quiz_text('timelimit',
+$quizsettings->add(new admin_setting_text_with_advanced('quiz/timelimit',
get_string('timelimit', 'quiz'), get_string('configtimelimit', 'quiz'),
array('value' => '0', 'fix' => false), PARAM_INT));
@@ -57,10 +58,10 @@ for($i=2; $i<=7; $i++) {
$seconds = $i*86400;
$timedelayoptions[$seconds] = get_string('numdays', '', $i);
}
-$quizsettings->add(new admin_setting_quiz_combo('delay1',
+$quizsettings->add(new admin_setting_combo_with_advanced('quiz/delay1',
get_string('delay1', 'quiz'), get_string('configdelay1', 'quiz'),
array('value' => 0, 'fix' => false), $timedelayoptions));
-$quizsettings->add(new admin_setting_quiz_combo('delay2',
+$quizsettings->add(new admin_setting_combo_with_advanced('quiz/delay2',
get_string('delay2', 'quiz'), get_string('configdelay2', 'quiz'),
array('value' => 0, 'fix' => false), $timedelayoptions));
@@ -71,17 +72,17 @@ $perpage[1] = get_string('aftereachquestion', 'quiz');
for ($i = 2; $i <= 50; ++$i) {
$perpage[$i] = get_string('afternquestions', 'quiz', $i);
}
-$quizsettings->add(new admin_setting_quiz_combo('questionsperpage',
+$quizsettings->add(new admin_setting_combo_with_advanced('quiz/questionsperpage',
get_string('newpageevery', 'quiz'), get_string('confignewpageevery', 'quiz'),
array('value' => 1, 'fix' => false), $perpage));
// shufflequestions
-$quizsettings->add(new admin_setting_quiz_yesno('shufflequestions',
+$quizsettings->add(new admin_setting_yesno_with_advanced('quiz/shufflequestions',
get_string('shufflequestions', 'quiz'), get_string('configshufflequestions', 'quiz'),
array('value' => 0, 'fix' => false)));
// shuffleanswers
-$quizsettings->add(new admin_setting_quiz_yesno('shuffleanswers',
+$quizsettings->add(new admin_setting_yesno_with_advanced('quiz/shuffleanswers',
get_string('shufflewithin', 'quiz'), get_string('configshufflewithin', 'quiz'),
array('value' => 1, 'fix' => false)));
@@ -90,33 +91,31 @@ $options = array(get_string('unlimited'));
for ($i = 1; $i <= 6; $i++) {
$options[$i] = $i;
}
-$quizsettings->add(new admin_setting_quiz_combo('attempts',
+$quizsettings->add(new admin_setting_combo_with_advanced('quiz/attempts',
get_string('attemptsallowed', 'quiz'), get_string('configattemptsallowed', 'quiz'),
array('value' => 0, 'fix' => false), $options));
// attemptonlast
-$quizsettings->add(new admin_setting_quiz_yesno('attemptonlast',
+$quizsettings->add(new admin_setting_yesno_with_advanced('quiz/attemptonlast',
get_string('eachattemptbuildsonthelast', 'quiz'), get_string('configeachattemptbuildsonthelast', 'quiz'),
array('value' => 0, 'fix' => false)));
// optionflags
-$quizsettings->add(new admin_setting_quiz_yesno('optionflags',
+$quizsettings->add(new admin_setting_yesno_with_advanced('quiz/optionflags',
get_string('adaptive', 'quiz'), get_string('configadaptive', 'quiz'),
array('value' => 1, 'fix' => false)));
// maximumgrade
-$maxgradesetting = new admin_setting_configtext('maximumgrade',
- get_string('maximumgrade'), get_string('configmaximumgrade', 'quiz'), 10, PARAM_INT);
-$maxgradesetting->plugin = 'quiz';
-$quizsettings->add($maxgradesetting);
+$quizsettings->add(new admin_setting_configtext('quiz/maximumgrade',
+ get_string('maximumgrade'), get_string('configmaximumgrade', 'quiz'), 10, PARAM_INT));
// grademethod
-$quizsettings->add(new admin_setting_quiz_combo('grademethod',
+$quizsettings->add(new admin_setting_combo_with_advanced('quiz/grademethod',
get_string('grademethod', 'quiz'), get_string('configgrademethod', 'quiz'),
array('value' => QUIZ_GRADEHIGHEST, 'fix' => false), quiz_get_grading_options()));
// penaltyscheme
-$quizsettings->add(new admin_setting_quiz_yesno('penaltyscheme',
+$quizsettings->add(new admin_setting_yesno_with_advanced('quiz/penaltyscheme',
get_string('penaltyscheme', 'quiz'), get_string('configpenaltyscheme', 'quiz'),
array('value' => 1, 'fix' => false)));
@@ -125,27 +124,27 @@ $options = array();
for ($i = 0; $i <= 5; $i++) {
$options[$i] = $i;
}
-$quizsettings->add(new admin_setting_quiz_combo('decimalpoints',
+$quizsettings->add(new admin_setting_combo_with_advanced('quiz/decimalpoints',
get_string('decimaldigits', 'quiz'), get_string('configdecimaldigits', 'quiz'),
array('value' => 2, 'fix' => false), $options));
// review
-$quizsettings->add(new admin_setting_quiz_reviewoptions('review',
+$quizsettings->add(new admin_setting_quiz_reviewoptions('quiz/review',
get_string('reviewoptions', 'quiz'), get_string('configreviewoptions', 'quiz'),
array('value' => 0x3fffffff, 'fix' => false)));
// popup
-$quizsettings->add(new admin_setting_quiz_yesno('popup',
+$quizsettings->add(new admin_setting_yesno_with_advanced('quiz/popup',
get_string('popup', 'quiz'), get_string('configpopup', 'quiz'),
array('value' => 0, 'fix' => false)));
// quizpassword
-$quizsettings->add(new admin_setting_quiz_text('password',
+$quizsettings->add(new admin_setting_text_with_advanced('quiz/password',
get_string('requirepassword', 'quiz'), get_string('configrequirepassword', 'quiz'),
array('value' => '', 'fix' => false), PARAM_TEXT));
// subnet
-$quizsettings->add(new admin_setting_quiz_text('subnet',
+$quizsettings->add(new admin_setting_text_with_advanced('quiz/subnet',
get_string('requiresubnet', 'quiz'), get_string('configrequiresubnet', 'quiz'),
array('value' => '', 'fix' => false), PARAM_TEXT));