MDL-81039 qtype_multichoice: better way to control feedback display

This commit is contained in:
Tim Hunt
2024-03-12 12:02:21 +01:00
committed by Sara Arjona
parent 7f7ed47336
commit b200b26636
3 changed files with 35 additions and 9 deletions
+3 -4
View File
@@ -162,10 +162,9 @@ abstract class qtype_multichoice_base extends question_graded_automatically {
break;
}
}
// Param $options->suppresschoicefeedback is a hack specific to the
// oumultiresponse question type. It would be good to refactor to
// avoid refering to it here.
return $options->feedback && empty($options->suppresschoicefeedback) &&
qtype_multichoice::support_legacy_review_options_hack($options);
return $options->feedback &&
$options->feedback !== qtype_multichoice::COMBINED_BUT_NOT_CHOICE_FEEDBACK &&
$isselected;
} else if ($component == 'question' && $filearea == 'hint') {
@@ -37,6 +37,35 @@ require_once($CFG->libdir . '/questionlib.php');
* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
*/
class qtype_multichoice extends question_type {
/**
* @var int a special value that can be set for {@see question_display_options::$feedback}.
*
* This is not used by the core question type, but is used by some variants of this question
* types in the plugins database, including qtype_oumultiresponse and qtype_answersselect.
*
* If ->feedback is set to this value, then the renderer will display the combined feebdack,
* but not the feedback for each specific choice.
*/
const COMBINED_BUT_NOT_CHOICE_FEEDBACK = 0x100;
/**
* Helper to catch and update if a plugin is using the old version of the COMBINED_BUT_NOT_CHOICE_FEEDBACK thing.
*
* @param question_display_options $options to be updated before being used.
*/
public static function support_legacy_review_options_hack(question_display_options $options): void {
if (empty($options->suppresschoicefeedback)) {
return; // Nothing to do.
}
debugging('$options->suppresschoicefeedback should no longer be used. To get a similar effect, ' .
'instead set $options->feedback = $options->feedback && qtype_multichoice::COMBINED_BUT_NOT_CHOICE_FEEDBACK.');
if ($options->feedback) {
$options->feedback = self::COMBINED_BUT_NOT_CHOICE_FEEDBACK;
}
unset($options->suppresschoicefeedback);
}
public function get_question_options($question) {
global $DB, $OUTPUT;
+3 -5
View File
@@ -57,7 +57,7 @@ abstract class qtype_multichoice_renderer_base extends qtype_with_combined_feedb
/**
* Whether a choice should be considered right, wrong or partially right.
* @param question_answer $ans representing one of the choices.
* @return fload 1.0, 0.0 or something in between, respectively.
* @return float 1.0, 0.0 or something in between, respectively.
*/
protected abstract function is_right(question_answer $ans);
@@ -118,10 +118,8 @@ abstract class qtype_multichoice_renderer_base extends qtype_with_combined_feedb
'data-region' => 'answer-label',
]);
// Param $options->suppresschoicefeedback is a hack specific to the
// oumultiresponse question type. It would be good to refactor to
// avoid refering to it here.
if ($options->feedback && empty($options->suppresschoicefeedback) &&
qtype_multichoice::support_legacy_review_options_hack($options);
if ($options->feedback && $options->feedback !== qtype_multichoice::COMBINED_BUT_NOT_CHOICE_FEEDBACK &&
$isselected && trim($ans->feedback)) {
$feedback[] = html_writer::tag('div',
$question->make_html_inline($question->format_text(