1
0
mirror of https://github.com/moodle/moodle.git synced 2025-03-20 07:30:01 +01:00

MDL-79863 qtype_ordering: qtype/ordering fix errors related to html editors when creating new Ordering questions

This commit is contained in:
Gordon Bateson 2015-11-18 22:53:12 +09:00 committed by Mathew May
parent b71ca209ce
commit 141809c027
3 changed files with 117 additions and 99 deletions

@ -36,10 +36,11 @@ defined('MOODLE_INTERNAL') || die();
*/
class qtype_ordering_edit_form extends question_edit_form {
const NUM_ANS_ROWS = 2;
const NUM_ANS_COLS = 60;
const NUM_ANS_START = 6;
const NUM_ANS_ADD = 3;
const NUM_ANS_ROWS = 2;
const NUM_ANS_COLS = 60;
const NUM_ANS_DEFAULT = 6;
const NUM_ANS_MIN = 3;
const NUM_ANS_ADD = 3;
// this functionality is currently disabled
// because it is not fully functional
@ -109,29 +110,25 @@ class qtype_ordering_edit_form extends question_edit_form {
$options[$name] = array('expanded' => true);
$name = 'answer';
$label = get_string($name, $plugin);
if ($this->use_editor_for_answers) {
if (isset($this->question->id)) {
$elements[] = $mform->createElement('editor', $name, $label, $this->get_editor_attributes(), $this->get_editor_options());
$elements[] = $mform->createElement('submit', $name.'removeeditor', get_string('removeeditor', $plugin));
$elements[] = $mform->createElement('submit', $name.'removeeditor', get_string('removeeditor', $plugin), array('onclick' => 'skipClientValidation = true;'));
//$elements[] = $mform->createElement('submit', $name.'removeitem', get_string('removeitem', $plugin));
} else {
$elements[] = $mform->createElement('textarea', $name, $label, array('rows' => self::NUM_ANS_ROWS, 'cols' => self::NUM_ANS_COLS));
$elements[] = $mform->createElement('textarea', $name, $label, $this->get_editor_attributes());
}
$options[$name] = array('type' => PARAM_RAW);
if (empty($this->question->options)){
$start = 0;
} else {
$start = count($this->question->options->answers);
$repeats = $this->get_answer_repeats($this->question);
$label = get_string('addmoreanswers', $plugin, self::NUM_ANS_ADD); // button text
$this->repeat_elements($elements, $repeats, $options, 'countanswers', 'addanswers', self::NUM_ANS_ADD, $label);
if (optional_param('addanswers', 0, PARAM_RAW)) {
$repeats += self::NUM_ANS_ADD;
}
if ($start < self::NUM_ANS_START) {
$start = self::NUM_ANS_START;
}
$buttontext = get_string('addmoreanswers', $plugin, self::NUM_ANS_ADD);
$this->repeat_elements($elements, $start, $options, 'countanswers', 'addanswers', self::NUM_ANS_ADD, $buttontext);
// adjust HTML editor and removal buttons
$this->adjust_html_editors($mform, $name);
$this->adjust_html_editors($mform, $name, $repeats);
// feedback
$this->add_ordering_feedback_fields(true);
@ -140,6 +137,18 @@ class qtype_ordering_edit_form extends question_edit_form {
$this->add_ordering_interactive_settings(true, true);
}
protected function get_answer_repeats($question) {
if (isset($question->id)) {
$repeats = count($question->options->answers);
} else {
$repeats = self::NUM_ANS_DEFAULT;
}
if ($repeats < self::NUM_ANS_MIN) {
$repeats = self::NUM_ANS_MIN;
}
return $repeats;
}
/**
* get_editor_attributes
*/
@ -161,62 +170,75 @@ class qtype_ordering_edit_form extends question_edit_form {
);
}
/**
* reset_editor_format
*/
protected function reset_editor_format($editor, $format=FORMAT_MOODLE) {
$value = $editor->getValue();
$value['format'] = $format;
$value = $editor->setValue($value);
return $editor->getFormat();
}
/**
* adjust_html_editors
*/
protected function adjust_html_editors($mform, $name) {
protected function adjust_html_editors($mform, $name, $repeats) {
// check whether or not we are using editors
if (! $this->use_editor_for_answers) {
return;
}
// cache the number of supported formats
// for the preferred editor for each format
// cache the number of formats supported
// by the preferred editor for each format
$count = array();
$ids = array_keys($this->question->options->answers);
foreach ($ids as $i => $id) {
if (isset($this->question->options->answers)) {
$ids = array_keys($this->question->options->answers);
} else {
$ids = array();
}
for ($i=0; $i<$repeats; $i++) {
$editor = $name.'['.$i.']';
if (! $mform->elementExists($editor)) {
continue;
}
$editor = $mform->getElement($editor);
if ($mform->elementExists($editor)) {
$editor = $mform->getElement($editor);
// the old/new name of the button to remove the HTML editor
// old : the name of the button when added by repeat_elements
// new : the simplified name of the button to satisfy
// "no_submit_button_pressed()" in lib/formslib.php
$oldname = $name.'removeeditor['.$i.']';
$newname = $name.'removeeditor_'.$i;
// remove HTML editor, if necessary
if (optional_param($newname, 0, PARAM_RAW)) {
$value = $editor->getValue();
$value['format'] = FORMAT_MOODLE;
$value = $editor->setValue($value);
$format = $editor->getFormat();
// override incoming format value
$_POST['answer'][$i]['format'] = $format;
} else {
$format = $this->question->options->answers[$id]->answerformat;
}
// check we have a submit button - it should always be there !!
if ($mform->elementExists($oldname)) {
if (! isset($count[$format])) {
$editor = editors_get_preferred_editor($format);
$count[$format] = $editor->get_supported_formats();
$count[$format] = count($count[$format]);
}
if ($count[$format] > 1) {
$mform->removeElement($oldname);
if (isset($ids[$i])) {
$id = $ids[$i];
} else {
$submit = $mform->getElement($oldname);
$submit->setName($newname);
$id = 0;
}
// the old/new name of the button to remove the HTML editor
// old : the name of the button when added by repeat_elements
// new : the simplified name of the button to satisfy
// "no_submit_button_pressed()" in lib/formslib.php
$oldname = $name.'removeeditor['.$i.']';
$newname = $name.'removeeditor_'.$i;
// remove HTML editor, if necessary
if (optional_param($newname, 0, PARAM_RAW)) {
$format = $this->reset_editor_format($editor);
$_POST['answer'][$i]['format'] = $format; // overwrite incoming data
} else if ($id) {
$format = $this->question->options->answers[$id]->answerformat;
} else {
$format = $this->reset_editor_format($editor);
}
// check we have a submit button - it should always be there !!
if ($mform->elementExists($oldname)) {
if (! isset($count[$format])) {
$editor = editors_get_preferred_editor($format);
$count[$format] = $editor->get_supported_formats();
$count[$format] = count($count[$format]);
}
if ($count[$format] > 1) {
$mform->removeElement($oldname);
} else {
$submit = $mform->getElement($oldname);
$submit->setName($newname);
}
$mform->registerNoSubmitButton($newname);
}
$mform->registerNoSubmitButton($newname);
}
}
}
@ -236,43 +258,33 @@ class qtype_ordering_edit_form extends question_edit_form {
$question->answer = array();
$question->fraction = array();
if (isset($question->options->answers)) {
if (empty($question->options->answers)) {
$answerids = array();
} else {
$answerids = array_keys($question->options->answers);
}
$i = 0;
foreach ($question->options->answers as $answerid => $answer) {
$repeats = $this->get_answer_repeats($question);
for ($i=0; $i<$repeats; $i++) {
if (trim($answer->answer)=='') {
continue; // skip empty answers
}
if ($this->use_editor_for_answers) {
$itemid = file_get_submitted_draft_itemid("answer[$i]");
if (isset($answer->answer)) {
$text = $answer->answer;
} else {
$text = '';
}
if (isset($answer->answerformat)) {
$format = $answer->answerformat;
} else {
$format = FORMAT_MOODLE;
}
$text = file_prepare_draft_area($itemid, $this->context->id, 'question', 'answer',
$answerid, $this->editoroptions, $text);
$question->answer[$i] = array('text' => $text,
'format' => $format,
'itemid' => $itemid);
} else {
$question->answer[$i]= $answer->answer;
}
$question->fraction[$i] = ($i + 1);
$i++;
if ($answerid = array_shift($answerids)) {
$answer = $question->options->answers[$answerid];
} else {
$answer = (object)array(
'answer' => '',
'answerformat' => FORMAT_MOODLE,
);
$answerid = $answer->id;
}
$itemid = file_get_submitted_draft_itemid("answer[$i]");
$format = $answer->answerformat;
$text = file_prepare_draft_area($itemid, $this->context->id, 'question', 'answer',
$answerid, $this->editoroptions, $answer->answer);
$question->answer[$i] = array('text' => $text,
'format' => $format,
'itemid' => $itemid);
$question->fraction[$i] = ($i + 1);
}
// layouttype

@ -166,6 +166,12 @@ class qtype_ordering extends question_type {
if (substr_count($answertext, '<p>')==1) {
$answertext = preg_replace($p_search, $p_replace, $answertext);
}
$answertext = trim($answertext);
// skip empty answers
if ($answertext=='') {
continue;
}
// standardize vertical align of img tags
$answertext = preg_replace($img_search, $img_replace, $answertext);

@ -30,6 +30,6 @@ defined('MOODLE_INTERNAL') || die();
$plugin->cron = 0;
$plugin->component = 'qtype_ordering';
$plugin->maturity = MATURITY_STABLE; // ALPHA=50, BETA=100, RC=150, STABLE=200
$plugin->release = '2015-11-18 (31)';
$plugin->version = 2015111831;
$plugin->release = '2015-11-18 (32)';
$plugin->version = 2015111832;
$plugin->requires = 2010112400; // Moodle 2.0