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));