. /** * Algebra question renderer class. * * @package qtype * @subpackage algebra * @author Roger Moore * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later */ defined('MOODLE_INTERNAL') || die(); /** * Generates the output for algebra questions. * * @copyright 2009 The Open University * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later */ class qtype_algebra_renderer extends qtype_renderer { public function formulation_and_controls(question_attempt $qa, question_display_options $options) { global $CFG; $this->page->requires->js_call_amd('qtype_algebra/display', 'init'); $question = $qa->get_question(); $currentanswer = $qa->get_last_qt_var('answer'); $inputname = $qa->get_qt_field_name('answer'); $nameprefix = str_replace(':', '_', $inputname); // Valid javascript name. $inputattributes = array( 'type' => 'text', 'name' => $inputname, 'value' => $currentanswer, 'id' => $inputname, 'class' => 'algebra_answer', 'size' => 80, ); if ($options->readonly) { $inputattributes['readonly'] = 'readonly'; } $feedbackimg = ''; if ($options->correctness) { $answer = $question->get_matching_answer(array('answer' => $currentanswer)); if ($answer) { $fraction = $answer->fraction; } else { $fraction = 0; } $inputattributes['class'] = $this->feedback_class($fraction). ' algebra_answer'; $feedbackimg = $this->feedback_image($fraction); } else { $inputattributes['class'] = 'algebra_answer'; } // Create an array of variable names to use when displaying the function entered. $vars = array(); if ($question and isset($question->variables)) { $variables = $question->variables; foreach ($question->variables as $var) { $vars[] = $var->name; } } $varnames = implode(',', $vars); $questiontext = $question->format_questiontext($qa); $input = html_writer::empty_tag('input', $inputattributes) . $feedbackimg; $result = html_writer::tag('div', $questiontext, array('class' => 'qtext')); $result .= html_writer::start_tag('div', array('class' => 'ablock')); $result .= html_writer::start_tag('div', array('class' => 'prompt', 'style' => 'vertical-align: top')); if (isset($question->answerprefix) and !empty($question->answerprefix)) { $opts = new StdClass; $opts->para = false; $result .= html_writer::tag('div', format_text($question->answerprefix, FORMAT_MOODLE, $opts) . $input, array('class' => 'answer')); } else { $result .= get_string('answer', 'qtype_algebra', html_writer::tag('div', $input, array('class' => 'answer'))); } $result .= html_writer::end_tag('div'); $result .= html_writer::end_tag('div'); if ($qa->get_state() == question_state::$invalid) { $result .= html_writer::nonempty_tag('div', $question->get_validation_error(array('answer' => $currentanswer)), array('class' => 'validationerror')); } if (get_config('qtype_algebra', 'formuladisplay') == 'iframe') { // Javascript function which the button uses to display the rendering // This function sents the source of the iframe to the 'displayformula.php' script giving // it an argument of the formula entered by the student. $iframename = $nameprefix.'_if'; // Name of the javascript function which causes the entered formula to be rendered. $dfname = $nameprefix.'_display'; $displayfunction = 'function '.$dfname."() {\n". ' var text="vars='.$varnames.'&expr="+escape(document.getElementsByName("'.$inputname.'")[0].value);'."\n". " if(text.length != 0) {\n". ' document.getElementsByName("'.$iframename.'")[0].src="'. $CFG->wwwroot.'/question/type/algebra/displayformula.php?"+'. 'text.replace(/\+/g,"%2b")'."\n". " }\n". " }\n"; $result .= html_writer::tag('script', $displayfunction, array('type' => 'text/javascript')); $result .= html_writer::start_tag('div', array('class' => 'dispresponse')); $result .= html_writer::empty_tag('input', array('type' => 'button', 'value' => get_string('displayresponse', 'qtype_algebra'), 'onclick' => $dfname.'()')); $result .= html_writer::start_tag('iframe', array('name' => $iframename, 'width' => '60%', 'height' => 60, 'align' => 'middle', 'src' => '')); $result .= html_writer::end_tag('iframe'); $result .= html_writer::tag('script', $dfname.'();', array('type' => 'text/javascript')); $result .= html_writer::end_tag('div'); } else { $result .= html_writer::tag('div', $varnames , array( 'type' => 'text', 'name' => $nameprefix . '_vars', 'id' => $nameprefix . '_vars', 'size' => 80, 'style' => 'display:none', ) ); $display = $question->format_text($question->formated_expression($currentanswer, $vars), FORMAT_MOODLE , $qa, 'question', 'questiontext', $question->id); $result .= html_writer::tag('div', $display , array( 'type' => 'text', 'name' => $nameprefix . '_display', 'id' => $nameprefix. '_display', 'size' => 80, 'class' => 'displayformula', ) ); } return $result; } public function specific_feedback(question_attempt $qa) { $question = $qa->get_question(); $answer = $question->get_matching_answer(array('answer' => $qa->get_last_qt_var('answer'))); if (!$answer || !$answer->feedback) { return ''; } return $question->format_text($answer->feedback, $answer->feedbackformat, $qa, 'question', 'answerfeedback', $answer->id); } public function correct_response(question_attempt $qa) { $question = $qa->get_question(); $answer = $question->get_matching_answer($question->get_correct_response()); if (!$answer) { return ''; } $formatoptions = new stdClass; $formatoptions->para = false; $formatoptions->clean = false; $formattedanswer = format_text($question->formated_expression($answer->answer), FORMAT_MOODLE, $formatoptions); return get_string('correctansweris', 'qtype_algebra', s($answer->answer)). $formattedanswer; } }