Merge branch 'MDL-67351-master_required_setting' of https://github.com/catalyst/moodle

This commit is contained in:
Adrian Greeve
2020-01-30 08:11:33 +08:00
6 changed files with 86 additions and 72 deletions
+5 -1
View File
@@ -1179,7 +1179,7 @@ abstract class moodleform_mod extends moodleform {
}
/**
* Get the list of admin settings for this module and apply any defaults/advanced/locked settings.
* Get the list of admin settings for this module and apply any defaults/advanced/locked/required settings.
*
* @param $datetimeoffsets array - If passed, this is an array of fieldnames => times that the
* default date/time value should be relative to. If not passed, all
@@ -1221,6 +1221,10 @@ abstract class moodleform_mod extends moodleform {
if (!empty($settings->$advancedsetting)) {
$mform->setAdvanced($name);
}
$requiredsetting = $name . '_required';
if (!empty($settings->$requiredsetting)) {
$mform->addRule($name, null, 'required', null, 'client');
}
}
}
}
+1
View File
@@ -1039,6 +1039,7 @@ $string['reportsmanage'] = 'Manage reports';
$string['requiredentrieschanged'] = 'Note: After upgrading, the setting \'Required entries before viewing\' is now enforced in the following database activities:<br/>{$a->text}<br/>';
$string['requiremodintro'] = 'Require activity description';
$string['requiremodintro_desc'] = 'If enabled, users will be forced to enter a description for each activity.';
$string['required'] = 'Required';
$string['requires'] = 'Requires';
$string['purgecaches'] = 'Purge all caches';
$string['purgecachesconfirm'] = 'Moodle can cache themes, javascript, language strings, filtered text, rss feeds and many other pieces of calculated data. Purging these caches will delete that data from the server and force browsers to refetch data, so that you can be sure you are seeing the most up-to-date values produced by the current code. There is no danger in purging caches, but your site may appear slower for a while until the server and clients calculate new information and cache it.';
+11 -1
View File
@@ -1748,6 +1748,16 @@ abstract class admin_setting {
$this->set_flag_options($enabled, $default, 'locked', new lang_string('locked', 'core_admin'));
}
/**
* Set the required options flag on this admin setting.
*
* @param bool $enabled - One of self::OPTION_ENABLED or self::OPTION_DISABLED.
* @param bool $default - The default for the flag.
*/
public function set_required_flag_options($enabled, $default) {
$this->set_flag_options($enabled, $default, 'required', new lang_string('required', 'core_admin'));
}
/**
* Get the currently saved value for a setting flag
*
@@ -2074,7 +2084,7 @@ abstract class admin_setting {
/**
* An additional option that can be applied to an admin setting.
* The currently supported options are 'ADVANCED' and 'LOCKED'.
* The currently supported options are 'ADVANCED', 'LOCKED' and 'REQUIRED'.
*
* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
*/
+6
View File
@@ -22,6 +22,12 @@ information provided here is intended especially for developers.
incompatible takes a single int corresponding to the first incompatible branch. Any Moodle versions including and
above this will be prevented from installing the plugin, and a message will be given when attempting installation.
* Added the <component>_bulk_user_actions() callback which returns a list of custom action_links objects
* Add 'required' admin flag for mod forms allows elements to be toggled between being required or not in admin settings.
- In mod settings, along with lock, advanced flags, the required flag can now be set with $setting->set_required_flag_options().
The name of the admin setting must be exactly the same as the mod_form element.
- Currently supported by:
- mod_assign
- mod_quiz
=== 3.8 ===
* Add CLI option to notify all cron tasks to stop: admin/cli/cron.php --stop
+1 -39
View File
@@ -94,15 +94,11 @@ class mod_quiz_mod_form extends moodleform_mod {
$mform->addElement('duration', 'timelimit', get_string('timelimit', 'quiz'),
array('optional' => true));
$mform->addHelpButton('timelimit', 'timelimit', 'quiz');
$mform->setAdvanced('timelimit', $quizconfig->timelimit_adv);
$mform->setDefault('timelimit', $quizconfig->timelimit);
// What to do with overdue attempts.
$mform->addElement('select', 'overduehandling', get_string('overduehandling', 'quiz'),
quiz_get_overdue_handling_options());
$mform->addHelpButton('overduehandling', 'overduehandling', 'quiz');
$mform->setAdvanced('overduehandling', $quizconfig->overduehandling_adv);
$mform->setDefault('overduehandling', $quizconfig->overduehandling);
// TODO Formslib does OR logic on disableif, and we need AND logic here.
// $mform->disabledIf('overduehandling', 'timelimit', 'eq', 0);
// $mform->disabledIf('overduehandling', 'timeclose', 'eq', 0);
@@ -111,8 +107,6 @@ class mod_quiz_mod_form extends moodleform_mod {
$mform->addElement('duration', 'graceperiod', get_string('graceperiod', 'quiz'),
array('optional' => true));
$mform->addHelpButton('graceperiod', 'graceperiod', 'quiz');
$mform->setAdvanced('graceperiod', $quizconfig->graceperiod_adv);
$mform->setDefault('graceperiod', $quizconfig->graceperiod);
$mform->hideIf('graceperiod', 'overduehandling', 'neq', 'graceperiod');
// -------------------------------------------------------------------------------
@@ -135,15 +129,11 @@ class mod_quiz_mod_form extends moodleform_mod {
}
$mform->addElement('select', 'attempts', get_string('attemptsallowed', 'quiz'),
$attemptoptions);
$mform->setAdvanced('attempts', $quizconfig->attempts_adv);
$mform->setDefault('attempts', $quizconfig->attempts);
// Grading method.
$mform->addElement('select', 'grademethod', get_string('grademethod', 'quiz'),
quiz_get_grading_options());
$mform->addHelpButton('grademethod', 'grademethod', 'quiz');
$mform->setAdvanced('grademethod', $quizconfig->grademethod_adv);
$mform->setDefault('grademethod', $quizconfig->grademethod);
if ($this->get_max_attempts_for_any_override() < 2) {
$mform->hideIf('grademethod', 'attempts', 'eq', 1);
}
@@ -154,7 +144,6 @@ class mod_quiz_mod_form extends moodleform_mod {
$pagegroup = array();
$pagegroup[] = $mform->createElement('select', 'questionsperpage',
get_string('newpage', 'quiz'), quiz_questions_per_page_options(), array('id' => 'id_questionsperpage'));
$mform->setDefault('questionsperpage', $quizconfig->questionsperpage);
if (!empty($this->_cm)) {
$pagegroup[] = $mform->createElement('checkbox', 'repaginatenow', '',
@@ -164,14 +153,11 @@ class mod_quiz_mod_form extends moodleform_mod {
$mform->addGroup($pagegroup, 'questionsperpagegrp',
get_string('newpage', 'quiz'), null, false);
$mform->addHelpButton('questionsperpagegrp', 'newpage', 'quiz');
$mform->setAdvanced('questionsperpagegrp', $quizconfig->questionsperpage_adv);
// Navigation method.
$mform->addElement('select', 'navmethod', get_string('navmethod', 'quiz'),
quiz_get_navigation_options());
$mform->addHelpButton('navmethod', 'navmethod', 'quiz');
$mform->setAdvanced('navmethod', $quizconfig->navmethod_adv);
$mform->setDefault('navmethod', $quizconfig->navmethod);
// -------------------------------------------------------------------------------
$mform->addElement('header', 'interactionhdr', get_string('questionbehaviour', 'quiz'));
@@ -179,8 +165,6 @@ class mod_quiz_mod_form extends moodleform_mod {
// Shuffle within questions.
$mform->addElement('selectyesno', 'shuffleanswers', get_string('shufflewithin', 'quiz'));
$mform->addHelpButton('shuffleanswers', 'shufflewithin', 'quiz');
$mform->setAdvanced('shuffleanswers', $quizconfig->shuffleanswers_adv);
$mform->setDefault('shuffleanswers', $quizconfig->shuffleanswers);
// How questions behave (question behaviour).
if (!empty($this->current->preferredbehaviour)) {
@@ -192,14 +176,11 @@ class mod_quiz_mod_form extends moodleform_mod {
$mform->addElement('select', 'preferredbehaviour',
get_string('howquestionsbehave', 'question'), $behaviours);
$mform->addHelpButton('preferredbehaviour', 'howquestionsbehave', 'question');
$mform->setDefault('preferredbehaviour', $quizconfig->preferredbehaviour);
// Can redo completed questions.
$redochoices = array(0 => get_string('no'), 1 => get_string('canredoquestionsyes', 'quiz'));
$mform->addElement('select', 'canredoquestions', get_string('canredoquestions', 'quiz'), $redochoices);
$mform->addHelpButton('canredoquestions', 'canredoquestions', 'quiz');
$mform->setAdvanced('canredoquestions', $quizconfig->canredoquestions_adv);
$mform->setDefault('canredoquestions', $quizconfig->canredoquestions);
foreach ($behaviours as $behaviour => $notused) {
if (!question_engine::can_questions_finish_during_the_attempt($behaviour)) {
$mform->hideIf('canredoquestions', 'preferredbehaviour', 'eq', $behaviour);
@@ -210,8 +191,6 @@ class mod_quiz_mod_form extends moodleform_mod {
$mform->addElement('selectyesno', 'attemptonlast',
get_string('eachattemptbuildsonthelast', 'quiz'));
$mform->addHelpButton('attemptonlast', 'eachattemptbuildsonthelast', 'quiz');
$mform->setAdvanced('attemptonlast', $quizconfig->attemptonlast_adv);
$mform->setDefault('attemptonlast', $quizconfig->attemptonlast);
if ($this->get_max_attempts_for_any_override() < 2) {
$mform->hideIf('attemptonlast', 'attempts', 'eq', 1);
}
@@ -253,8 +232,6 @@ class mod_quiz_mod_form extends moodleform_mod {
$mform->addElement('select', 'showuserpicture', get_string('showuserpicture', 'quiz'),
quiz_get_user_image_options());
$mform->addHelpButton('showuserpicture', 'showuserpicture', 'quiz');
$mform->setAdvanced('showuserpicture', $quizconfig->showuserpicture_adv);
$mform->setDefault('showuserpicture', $quizconfig->showuserpicture);
// Overall decimal points.
$options = array();
@@ -264,8 +241,6 @@ class mod_quiz_mod_form extends moodleform_mod {
$mform->addElement('select', 'decimalpoints', get_string('decimalplaces', 'quiz'),
$options);
$mform->addHelpButton('decimalpoints', 'decimalplaces', 'quiz');
$mform->setAdvanced('decimalpoints', $quizconfig->decimalpoints_adv);
$mform->setDefault('decimalpoints', $quizconfig->decimalpoints);
// Question decimal points.
$options = array(-1 => get_string('sameasoverall', 'quiz'));
@@ -275,14 +250,10 @@ class mod_quiz_mod_form extends moodleform_mod {
$mform->addElement('select', 'questiondecimalpoints',
get_string('decimalplacesquestion', 'quiz'), $options);
$mform->addHelpButton('questiondecimalpoints', 'decimalplacesquestion', 'quiz');
$mform->setAdvanced('questiondecimalpoints', $quizconfig->questiondecimalpoints_adv);
$mform->setDefault('questiondecimalpoints', $quizconfig->questiondecimalpoints);
// Show blocks during quiz attempt.
$mform->addElement('selectyesno', 'showblocks', get_string('showblocks', 'quiz'));
$mform->addHelpButton('showblocks', 'showblocks', 'quiz');
$mform->setAdvanced('showblocks', $quizconfig->showblocks_adv);
$mform->setDefault('showblocks', $quizconfig->showblocks);
// -------------------------------------------------------------------------------
$mform->addElement('header', 'security', get_string('extraattemptrestrictions', 'quiz'));
@@ -291,22 +262,16 @@ class mod_quiz_mod_form extends moodleform_mod {
$mform->addElement('passwordunmask', 'quizpassword', get_string('requirepassword', 'quiz'));
$mform->setType('quizpassword', PARAM_TEXT);
$mform->addHelpButton('quizpassword', 'requirepassword', 'quiz');
$mform->setAdvanced('quizpassword', $quizconfig->password_adv);
$mform->setDefault('quizpassword', $quizconfig->password);
// IP address.
$mform->addElement('text', 'subnet', get_string('requiresubnet', 'quiz'));
$mform->setType('subnet', PARAM_TEXT);
$mform->addHelpButton('subnet', 'requiresubnet', 'quiz');
$mform->setAdvanced('subnet', $quizconfig->subnet_adv);
$mform->setDefault('subnet', $quizconfig->subnet);
// Enforced time delay between quiz attempts.
$mform->addElement('duration', 'delay1', get_string('delay1st2nd', 'quiz'),
array('optional' => true));
$mform->addHelpButton('delay1', 'delay1st2nd', 'quiz');
$mform->setAdvanced('delay1', $quizconfig->delay1_adv);
$mform->setDefault('delay1', $quizconfig->delay1);
if ($this->get_max_attempts_for_any_override() < 2) {
$mform->hideIf('delay1', 'attempts', 'eq', 1);
}
@@ -314,8 +279,6 @@ class mod_quiz_mod_form extends moodleform_mod {
$mform->addElement('duration', 'delay2', get_string('delaylater', 'quiz'),
array('optional' => true));
$mform->addHelpButton('delay2', 'delaylater', 'quiz');
$mform->setAdvanced('delay2', $quizconfig->delay2_adv);
$mform->setDefault('delay2', $quizconfig->delay2);
if ($this->get_max_attempts_for_any_override() < 3) {
$mform->hideIf('delay2', 'attempts', 'eq', 1);
$mform->hideIf('delay2', 'attempts', 'eq', 2);
@@ -325,8 +288,6 @@ class mod_quiz_mod_form extends moodleform_mod {
$mform->addElement('select', 'browsersecurity', get_string('browsersecurity', 'quiz'),
quiz_access_manager::get_browser_security_choices());
$mform->addHelpButton('browsersecurity', 'browsersecurity', 'quiz');
$mform->setAdvanced('browsersecurity', $quizconfig->browsersecurity_adv);
$mform->setDefault('browsersecurity', $quizconfig->browsersecurity);
// Any other rule plugins.
quiz_access_manager::add_settings_form_fields($this, $mform);
@@ -400,6 +361,7 @@ class mod_quiz_mod_form extends moodleform_mod {
$mform->setDefault('grade', $quizconfig->maximumgrade);
// -------------------------------------------------------------------------------
$this->apply_admin_defaults();
$this->add_action_buttons();
$PAGE->requires->yui_module('moodle-mod_quiz-modform', 'M.mod_quiz.modform.init');
+62 -31
View File
@@ -60,9 +60,11 @@ if ($ADMIN->fulltree) {
$quizsettings->add(new admin_setting_heading('quizintro', '', get_string('configintro', 'quiz')));
// Time limit.
$quizsettings->add(new admin_setting_configduration_with_advanced('quiz/timelimit',
$setting = new admin_setting_configduration('quiz/timelimit',
get_string('timelimit', 'quiz'), get_string('configtimelimitsec', 'quiz'),
array('value' => '0', 'adv' => false), 60));
'0', 60);
$setting->set_advanced_flag_options(admin_setting_flag::ENABLED, false);
$quizsettings->add($setting);
// What to do with overdue attempts.
$quizsettings->add(new mod_quiz_admin_setting_overduehandling('quiz/overduehandling',
@@ -70,9 +72,11 @@ if ($ADMIN->fulltree) {
array('value' => 'autosubmit', 'adv' => false), null));
// Grace period time.
$quizsettings->add(new admin_setting_configduration_with_advanced('quiz/graceperiod',
$setting = new admin_setting_configduration('quiz/graceperiod',
get_string('graceperiod', 'quiz'), get_string('graceperiod_desc', 'quiz'),
array('value' => '86400', 'adv' => false)));
'86400');
$setting->set_advanced_flag_options(admin_setting_flag::ENABLED, false);
$quizsettings->add($setting);
// Minimum grace period used behind the scenes.
$quizsettings->add(new admin_setting_configduration('quiz/graceperiodmin',
@@ -84,9 +88,11 @@ if ($ADMIN->fulltree) {
for ($i = 1; $i <= QUIZ_MAX_ATTEMPT_OPTION; $i++) {
$options[$i] = $i;
}
$quizsettings->add(new admin_setting_configselect_with_advanced('quiz/attempts',
$setting = new admin_setting_configselect('quiz/attempts',
get_string('attemptsallowed', 'quiz'), get_string('configattemptsallowed', 'quiz'),
array('value' => 0, 'adv' => false), $options));
0, $options);
$setting->set_advanced_flag_options(admin_setting_flag::ENABLED, false);
$quizsettings->add($setting);
// Grading method.
$quizsettings->add(new mod_quiz_admin_setting_grademethod('quiz/grademethod',
@@ -104,19 +110,25 @@ if ($ADMIN->fulltree) {
for ($i = 2; $i <= QUIZ_MAX_QPP_OPTION; ++$i) {
$perpage[$i] = get_string('afternquestions', 'quiz', $i);
}
$quizsettings->add(new admin_setting_configselect_with_advanced('quiz/questionsperpage',
$setting = new admin_setting_configselect('quiz/questionsperpage',
get_string('newpageevery', 'quiz'), get_string('confignewpageevery', 'quiz'),
array('value' => 1, 'adv' => false), $perpage));
1, $perpage);
$setting->set_advanced_flag_options(admin_setting_flag::ENABLED, false);
$quizsettings->add($setting);
// Navigation method.
$quizsettings->add(new admin_setting_configselect_with_advanced('quiz/navmethod',
$setting = new admin_setting_configselect('quiz/navmethod',
get_string('navmethod', 'quiz'), get_string('confignavmethod', 'quiz'),
array('value' => QUIZ_NAVMETHOD_FREE, 'adv' => true), quiz_get_navigation_options()));
QUIZ_NAVMETHOD_FREE, quiz_get_navigation_options());
$setting->set_advanced_flag_options(admin_setting_flag::ENABLED, true);
$quizsettings->add($setting);
// Shuffle within questions.
$quizsettings->add(new admin_setting_configcheckbox_with_advanced('quiz/shuffleanswers',
$setting = new admin_setting_configcheckbox('quiz/shuffleanswers',
get_string('shufflewithin', 'quiz'), get_string('configshufflewithin', 'quiz'),
array('value' => 1, 'adv' => false)));
1);
$setting->set_advanced_flag_options(admin_setting_flag::ENABLED, false);
$quizsettings->add($setting);
// Preferred behaviour.
$quizsettings->add(new admin_setting_question_behaviour('quiz/preferredbehaviour',
@@ -124,16 +136,20 @@ if ($ADMIN->fulltree) {
'deferredfeedback'));
// Can redo completed questions.
$quizsettings->add(new admin_setting_configselect_with_advanced('quiz/canredoquestions',
$setting = new admin_setting_configselect('quiz/canredoquestions',
get_string('canredoquestions', 'quiz'), get_string('canredoquestions_desc', 'quiz'),
array('value' => 0, 'adv' => true),
array(0 => get_string('no'), 1 => get_string('canredoquestionsyes', 'quiz'))));
0,
array(0 => get_string('no'), 1 => get_string('canredoquestionsyes', 'quiz')));
$setting->set_advanced_flag_options(admin_setting_flag::ENABLED, true);
$quizsettings->add($setting);
// Each attempt builds on last.
$quizsettings->add(new admin_setting_configcheckbox_with_advanced('quiz/attemptonlast',
$setting = new admin_setting_configcheckbox('quiz/attemptonlast',
get_string('eachattemptbuildsonthelast', 'quiz'),
get_string('configeachattemptbuildsonthelast', 'quiz'),
array('value' => 0, 'adv' => true)));
0);
$setting->set_advanced_flag_options(admin_setting_flag::ENABLED, true);
$quizsettings->add($setting);
// Review options.
$quizsettings->add(new admin_setting_heading('reviewheading',
@@ -161,42 +177,57 @@ if ($ADMIN->fulltree) {
for ($i = 0; $i <= QUIZ_MAX_DECIMAL_OPTION; $i++) {
$options[$i] = $i;
}
$quizsettings->add(new admin_setting_configselect_with_advanced('quiz/decimalpoints',
$setting = new admin_setting_configselect('quiz/decimalpoints',
get_string('decimalplaces', 'quiz'), get_string('configdecimalplaces', 'quiz'),
array('value' => 2, 'adv' => false), $options));
2, $options);
$setting->set_advanced_flag_options(admin_setting_flag::ENABLED, false);
$quizsettings->add($setting);
// Decimal places for question grades.
$options = array(-1 => get_string('sameasoverall', 'quiz'));
for ($i = 0; $i <= QUIZ_MAX_Q_DECIMAL_OPTION; $i++) {
$options[$i] = $i;
}
$quizsettings->add(new admin_setting_configselect_with_advanced('quiz/questiondecimalpoints',
$setting = new admin_setting_configselect('quiz/questiondecimalpoints',
get_string('decimalplacesquestion', 'quiz'),
get_string('configdecimalplacesquestion', 'quiz'),
array('value' => -1, 'adv' => true), $options));
-1, $options);
$setting->set_advanced_flag_options(admin_setting_flag::ENABLED, false);
$quizsettings->add($setting);
// Show blocks during quiz attempts.
$quizsettings->add(new admin_setting_configcheckbox_with_advanced('quiz/showblocks',
$setting = new admin_setting_configcheckbox('quiz/showblocks',
get_string('showblocks', 'quiz'), get_string('configshowblocks', 'quiz'),
array('value' => 0, 'adv' => true)));
0);
$setting->set_advanced_flag_options(admin_setting_flag::ENABLED, true);
$quizsettings->add($setting);
// Password.
$quizsettings->add(new admin_setting_configpasswordunmask_with_advanced('quiz/password',
$setting = new admin_setting_configpasswordunmask('quiz/quizpassword',
get_string('requirepassword', 'quiz'), get_string('configrequirepassword', 'quiz'),
array('value' => '', 'adv' => false)));
'');
$setting->set_advanced_flag_options(admin_setting_flag::ENABLED, false);
$setting->set_required_flag_options(admin_setting_flag::ENABLED, false);
$quizsettings->add($setting);
// IP restrictions.
$quizsettings->add(new admin_setting_configtext_with_advanced('quiz/subnet',
$setting = new admin_setting_configtext('quiz/subnet',
get_string('requiresubnet', 'quiz'), get_string('configrequiresubnet', 'quiz'),
array('value' => '', 'adv' => true), PARAM_TEXT));
'', PARAM_TEXT);
$setting->set_advanced_flag_options(admin_setting_flag::ENABLED, true);
$quizsettings->add($setting);
// Enforced delay between attempts.
$quizsettings->add(new admin_setting_configduration_with_advanced('quiz/delay1',
$setting = new admin_setting_configduration('quiz/delay1',
get_string('delay1st2nd', 'quiz'), get_string('configdelay1st2nd', 'quiz'),
array('value' => 0, 'adv' => true), 60));
$quizsettings->add(new admin_setting_configduration_with_advanced('quiz/delay2',
0, 60);
$setting->set_advanced_flag_options(admin_setting_flag::ENABLED, true);
$quizsettings->add($setting);
$setting = new admin_setting_configduration('quiz/delay2',
get_string('delaylater', 'quiz'), get_string('configdelaylater', 'quiz'),
array('value' => 0, 'adv' => true), 60));
0, 60);
$setting->set_advanced_flag_options(admin_setting_flag::ENABLED, true);
$quizsettings->add($setting);
// Browser security.
$quizsettings->add(new mod_quiz_admin_setting_browsersecurity('quiz/browsersecurity',