protected function definition() { global $PAGE; $labelsharedwildcard = get_string("sharedwildcard", "qtype_calculated"); $mform = $this->_form; $mform->setDisableShortforms(); $strquestionlabel = $this->qtypeobj->comment_header($this->question); if ($this->maxnumber != -1) { $this->noofitems = $this->maxnumber; } else { $this->noofitems = 0; } $label = get_string("sharedwildcards", "qtype_calculated"); $html2 = $this->qtypeobj->print_dataset_definitions_category_shared($this->question, $this->datasetdefs); $mform->addElement('static', 'listcategory', $label, $html2); // ...----------------------------------------------------------------------. $mform->addElement('submit', 'updatedatasets', get_string('updatedatasetparam', 'qtype_calculated')); $mform->registerNoSubmitButton('updatedatasets'); $mform->addElement('header', 'additemhdr', get_string('itemtoadd', 'qtype_calculated')); $idx = 1; $data = array(); $j = $this->noofitems * count($this->datasetdefs) + 1; foreach ($this->datasetdefs as $defkey => $datasetdef) { if ($datasetdef->category |= 0) { $name = get_string('sharedwildcard', 'qtype_calculated', $datasetdef->name); } else { $name = get_string('wildcard', 'qtype_calculated', $datasetdef->name); } $mform->addElement('text', "number[{$j}]", $name); $mform->setType("number[{$j}]", PARAM_RAW); // This parameter will be validated in validation(). $this->qtypeobj->custom_generator_tools_part($mform, $idx, $j); $idx++; $mform->addElement('hidden', "definition[{$j}]"); $mform->setType("definition[{$j}]", PARAM_RAW); $mform->addElement('hidden', "itemid[{$j}]"); $mform->setType("itemid[{$j}]", PARAM_RAW); $mform->addElement('static', "divider[{$j}]", '', '<hr />'); $mform->setType("divider[{$j}]", PARAM_RAW); $j++; } $mform->addElement('header', 'updateanswershdr', get_string('answerstoleranceparam', 'qtype_calculated')); $mform->addElement('submit', 'updateanswers', get_string('updatetolerancesparam', 'qtype_calculated')); $mform->setAdvanced('updateanswers', true); $mform->registerNoSubmitButton('updateanswers'); $answers = fullclone($this->question->options->answers); $key1 = 1; foreach ($answers as $key => $answer) { $ans = shorten_text($answer->answer, 17, true); if ($ans === '*') { $mform->addElement('static', 'answercomment[' . ($this->noofitems + $key1) . ']', $ans); $mform->addElement('hidden', 'tolerance[' . $key . ']', ''); $mform->setType('tolerance[' . $key . ']', PARAM_RAW); $mform->setAdvanced('tolerance[' . $key . ']', true); $mform->addElement('hidden', 'tolerancetype[' . $key . ']', ''); $mform->setType('tolerancetype[' . $key . ']', PARAM_RAW); $mform->setAdvanced('tolerancetype[' . $key . ']', true); $mform->addElement('hidden', 'correctanswerlength[' . $key . ']', ''); $mform->setType('correctanswerlength[' . $key . ']', PARAM_RAW); $mform->setAdvanced('correctanswerlength[' . $key . ']', true); $mform->addElement('hidden', 'correctanswerformat[' . $key . ']', ''); $mform->setType('correctanswerformat[' . $key . ']', PARAM_RAW); $mform->setAdvanced('correctanswerformat[' . $key . ']', true); } else { if ($ans !== '') { $mform->addElement('static', 'answercomment[' . ($this->noofitems + $key1) . ']', $ans); $mform->addElement('text', 'tolerance[' . $key . ']', get_string('tolerance', 'qtype_calculated')); $mform->setType('tolerance[' . $key . ']', PARAM_RAW); $mform->setAdvanced('tolerance[' . $key . ']', true); $mform->addElement('select', 'tolerancetype[' . $key . ']', get_string('tolerancetype', 'qtype_numerical'), $this->qtypeobj->tolerance_types()); $mform->setAdvanced('tolerancetype[' . $key . ']', true); $mform->addElement('select', 'correctanswerlength[' . $key . ']', get_string('correctanswershows', 'qtype_calculated'), range(0, 9)); $mform->setAdvanced('correctanswerlength[' . $key . ']', true); $answerlengthformats = array('1' => get_string('decimalformat', 'qtype_numerical'), '2' => get_string('significantfiguresformat', 'qtype_calculated')); $mform->addElement('select', 'correctanswerformat[' . $key . ']', get_string('correctanswershowsformat', 'qtype_calculated'), $answerlengthformats); $mform->setAdvanced('correctanswerformat[' . $key . ']', true); $mform->addElement('static', 'dividertolerance', '', '<hr />'); $mform->setAdvanced('dividertolerance', true); } } $key1++; } $addremoveoptions = array(); $addremoveoptions['1'] = '1'; for ($i = 10; $i <= 100; $i += 10) { $addremoveoptions["{$i}"] = "{$i}"; } $showoptions = array(); $showoptions['1'] = '1'; $showoptions['2'] = '2'; $showoptions['5'] = '5'; for ($i = 10; $i <= 100; $i += 10) { $showoptions["{$i}"] = "{$i}"; } $mform->addElement('header', 'addhdr', get_string('add', 'moodle')); $mform->closeHeaderBefore('addhdr'); if ($this->qtypeobj->supports_dataset_item_generation()) { $radiogrp = array(); $radiogrp[] =& $mform->createElement('radio', 'nextpageparam[forceregeneration]', null, get_string('reuseifpossible', 'qtype_calculated'), 0); $radiogrp[] =& $mform->createElement('radio', 'nextpageparam[forceregeneration]', null, get_string('forceregenerationshared', 'qtype_calculated'), 1); $radiogrp[] =& $mform->createElement('radio', 'nextpageparam[forceregeneration]', null, get_string('forceregenerationall', 'qtype_calculated'), 2); $mform->addGroup($radiogrp, 'forceregenerationgrp', get_string('nextitemtoadd', 'qtype_calculated'), "<br/>", false); } $mform->addElement('submit', 'getnextbutton', get_string('getnextnow', 'qtype_calculated')); $mform->addElement('static', "dividera", '', '<hr />'); $addgrp = array(); $addgrp[] =& $mform->createElement('submit', 'addbutton', get_string('add', 'moodle')); $addgrp[] =& $mform->createElement('select', "selectadd", get_string('additem', 'qtype_calculated'), $addremoveoptions); $addgrp[] =& $mform->createElement('static', "stat", "Items", get_string('newsetwildcardvalues', 'qtype_calculatedsimple')); $mform->addGroup($addgrp, 'addgrp', get_string('additem', 'qtype_calculated'), ' ', false); $mform->addElement('static', "divideradd", '', ''); if ($this->noofitems > 0) { $mform->addElement('header', 'deleteitemhdr', get_string('delete', 'moodle')); $deletegrp = array(); $deletegrp[] = $mform->createElement('submit', 'deletebutton', get_string('delete', 'moodle')); $deletegrp[] = $mform->createElement('select', 'selectdelete', get_string('deleteitem', 'qtype_calculated') . "1", $addremoveoptions); $deletegrp[] = $mform->createElement('static', "stat", "Items", get_string('setwildcardvalues', 'qtype_calculatedsimple')); $mform->addGroup($deletegrp, 'deletegrp', '', ' ', false); } else { $mform->addElement('static', 'warning', '', '<span class="error">' . get_string('youmustaddatleastoneitem', 'qtype_calculated') . '</span>'); } $addgrp1 = array(); $addgrp1[] = $mform->createElement('submit', 'showbutton', get_string('showitems', 'qtype_calculated')); $addgrp1[] = $mform->createElement('select', "selectshow", '', $showoptions); $addgrp1[] = $mform->createElement('static', "stat", '', get_string('setwildcardvalues', 'qtype_calculated')); $mform->addGroup($addgrp1, 'addgrp1', '', ' ', false); $mform->registerNoSubmitButton('showbutton'); $mform->closeHeaderBefore('addgrp1'); // ...----------------------------------------------------------------------. $j = $this->noofitems * count($this->datasetdefs); $k = optional_param('selectshow', 1, PARAM_INT); for ($i = $this->noofitems; $i >= 1; $i--) { if ($k > 0) { $mform->addElement('header', 'setnoheader' . $i, "<b>" . get_string('setno', 'qtype_calculated', $i) . "</b> "); } foreach ($this->datasetdefs as $defkey => $datasetdef) { if ($k > 0) { if ($datasetdef->category == 0) { $mform->addElement('text', "number[{$j}]", get_string('wildcard', 'qtype_calculated', $datasetdef->name)); } else { $mform->addElement('text', "number[{$j}]", get_string('sharedwildcard', 'qtype_calculated', $datasetdef->name)); } } else { $mform->addElement('hidden', "number[{$j}]", ''); } $mform->setType("number[{$j}]", PARAM_RAW); // This parameter will be validated in validation(). $mform->addElement('hidden', "itemid[{$j}]"); $mform->setType("itemid[{$j}]", PARAM_INT); $mform->addElement('hidden', "definition[{$j}]"); $mform->setType("definition[{$j}]", PARAM_NOTAGS); $data[$datasetdef->name] = $datasetdef->items[$i]->value; $j--; } if ('' != $strquestionlabel && $k > 0) { // ... $this->outsidelimit || !empty($this->numbererrors ). $repeated[] = $mform->addElement('static', "answercomment[{$i}]", $strquestionlabel); // Decode equations in question text. $qtext = $this->qtypeobj->substitute_variables($this->question->questiontext, $data); $textequations = $this->qtypeobj->find_math_equations($qtext); if ($textequations != '' && count($textequations) > 0) { $mform->addElement('static', "divider1[{$j}]", '', 'Formulas {=..} in question text'); foreach ($textequations as $key => $equation) { if ($formulaerrors = qtype_calculated_find_formula_errors($equation)) { $str = $formulaerrors; } else { eval('$str = ' . $equation . ';'); } $equation = shorten_text($equation, 17, true); $mform->addElement('static', "textequation", "{={$equation}}", "=" . $str); } } } $k--; } $mform->addElement('static', 'outsidelimit', '', ''); // Submit buttons. if ($this->noofitems > 0) { $buttonarray = array(); $buttonarray[] = $mform->createElement('submit', 'savechanges', get_string('savechanges')); $previewlink = $PAGE->get_renderer('core_question')->question_preview_link($this->question->id, $this->categorycontext, true); $buttonarray[] = $mform->createElement('static', 'previewlink', '', $previewlink); $mform->addGroup($buttonarray, 'buttonar', '', array(' '), false); $mform->closeHeaderBefore('buttonar'); } $this->add_hidden_fields(); $mform->addElement('hidden', 'category'); $mform->setType('category', PARAM_SEQUENCE); $mform->addElement('hidden', 'wizard', 'datasetitems'); $mform->setType('wizard', PARAM_ALPHA); }
function substitute_variables($str, $dataset) { $formula = parent::substitute_variables($str, $dataset); if ($error = qtype_calculated_find_formula_errors($formula)) { return $error; } /// Calculate the correct answer if (empty($formula)) { $str = ''; } else { if ($formula === '*') { $str = '*'; } else { eval('$str = ' . $formula . ';'); } } return $str; }
protected function definition() { $labelsharedwildcard = get_string("sharedwildcard", "qtype_calculated"); $mform =& $this->_form; $strquestionlabel = $this->qtypeobj->comment_header($this->question); if ($this->maxnumber != -1 ) { $this->noofitems = $this->maxnumber; } else { $this->noofitems = 0; } $label = get_string("sharedwildcards", "qtype_calculated"); $html2 = $this->qtypeobj->print_dataset_definitions_category_shared( $this->question, $this->datasetdefs); $mform->addElement('static', 'listcategory', $label, $html2); //---------------------------------------------------------------------- $mform->addElement('submit', 'updatedatasets', get_string('updatedatasetparam', 'qtype_calculated')); $mform->registerNoSubmitButton('updatedatasets'); $mform->addElement('header', 'additemhdr', get_string('itemtoadd', 'qtype_calculated')); $idx = 1; $data = array(); $j = (($this->noofitems) * count($this->datasetdefs))+1; foreach ($this->datasetdefs as $defkey => $datasetdef) { if ($datasetdef->category |= 0 ) { $name = get_string('sharedwildcard', 'qtype_calculated', $datasetdef->name); } else { $name = get_string('wildcard', 'qtype_calculated', $datasetdef->name); } $mform->addElement('text', "number[$j]", $name); $mform->setType("number[$j]", PARAM_NUMBER); $this->qtypeobj->custom_generator_tools_part($mform, $idx, $j); $idx++; $mform->addElement('hidden', "definition[$j]"); $mform->setType("definition[$j]", PARAM_RAW); $mform->addElement('hidden', "itemid[$j]"); $mform->setType("itemid[$j]", PARAM_RAW); $mform->addElement('static', "divider[$j]", '', '<hr />'); $mform->setType("divider[$j]", PARAM_RAW); $j++; } $mform->addElement('header', 'updateanswershdr', get_string('answerstoleranceparam', 'qtype_calculated')); $mform->addElement('submit', 'updateanswers', get_string('updatetolerancesparam', 'qtype_calculated')); $mform->setAdvanced('updateanswers', true); $mform->registerNoSubmitButton('updateanswers'); $answers = fullclone($this->question->options->answers); $key1 =1; foreach ($answers as $key => $answer) { if ('' === $answer->answer) { // Do nothing. } else if ('*' === $answer->answer) { $mform->addElement('static', 'answercomment[' . ($this->noofitems+$key1) . ']', $answer->answer); $mform->addElement('hidden', 'tolerance['.$key.']', ''); $mform->setType('tolerance['.$key.']', PARAM_RAW); $mform->setAdvanced('tolerance['.$key.']', true); $mform->addElement('hidden', 'tolerancetype['.$key.']', ''); $mform->setType('tolerancetype['.$key.']', PARAM_RAW); $mform->setAdvanced('tolerancetype['.$key.']', true); $mform->addElement('hidden', 'correctanswerlength['.$key.']', ''); $mform->setType('correctanswerlength['.$key.']', PARAM_RAW); $mform->setAdvanced('correctanswerlength['.$key.']', true); $mform->addElement('hidden', 'correctanswerformat['.$key.']', ''); $mform->setType('correctanswerformat['.$key.']', PARAM_RAW); $mform->setAdvanced('correctanswerformat['.$key.']', true); } else { $mform->addElement('static', 'answercomment[' . ($this->noofitems+$key1) . ']', $answer->answer); $mform->addElement('text', 'tolerance['.$key.']', get_string('tolerance', 'qtype_calculated')); $mform->setAdvanced('tolerance['.$key.']', true); $mform->addElement('select', 'tolerancetype['.$key.']', get_string('tolerancetype', 'qtype_numerical'), $this->qtypeobj->tolerance_types()); $mform->setAdvanced('tolerancetype['.$key.']', true); $mform->addElement('select', 'correctanswerlength['.$key.']', get_string('correctanswershows', 'qtype_calculated'), range(0, 9)); $mform->setAdvanced('correctanswerlength['.$key.']', true); $answerlengthformats = array( '1' => get_string('decimalformat', 'qtype_numerical'), '2' => get_string('significantfiguresformat', 'qtype_calculated') ); $mform->addElement('select', 'correctanswerformat['.$key.']', get_string('correctanswershowsformat', 'qtype_calculated'), $answerlengthformats); $mform->setAdvanced('correctanswerformat['.$key.']', true); $mform->addElement('static', 'dividertolerance', '', '<hr />'); $mform->setAdvanced('dividertolerance', true); } $key1++; } $addremoveoptions = array(); $addremoveoptions['1']='1'; for ($i=10; $i<=100; $i+=10) { $addremoveoptions["$i"]="$i"; } $showoptions = Array(); $showoptions['1']='1'; $showoptions['2']='2'; $showoptions['5']='5'; for ($i=10; $i<=100; $i+=10) { $showoptions["$i"]="$i"; } $mform->addElement('header', 'additemhdr', get_string('add', 'moodle')); $mform->closeHeaderBefore('additemhdr'); if ($this->qtypeobj->supports_dataset_item_generation()) { $radiogrp = array(); $radiogrp[] =& $mform->createElement('radio', 'nextpageparam[forceregeneration]', null, get_string('reuseifpossible', 'qtype_calculated'), 0); $radiogrp[] =& $mform->createElement('radio', 'nextpageparam[forceregeneration]', null, get_string('forceregenerationshared', 'qtype_calculated'), 1); $radiogrp[] =& $mform->createElement('radio', 'nextpageparam[forceregeneration]', null, get_string('forceregenerationall', 'qtype_calculated'), 2); $mform->addGroup($radiogrp, 'forceregenerationgrp', get_string('nextitemtoadd', 'qtype_calculated'), "<br/>", false); } $mform->addElement('submit', 'getnextbutton', get_string('getnextnow', 'qtype_calculated')); $mform->addElement('static', "dividera", '', '<hr />'); $addgrp = array(); $addgrp[] =& $mform->createElement('submit', 'addbutton', get_string('add', 'moodle')); $addgrp[] =& $mform->createElement('select', "selectadd", get_string('additem', 'qtype_calculated'), $addremoveoptions); $addgrp[] = & $mform->createElement('static', "stat", "Items", get_string('newsetwildcardvalues', 'qtype_calculatedsimple')); $mform->addGroup($addgrp, 'addgrp', get_string('additem', 'qtype_calculated'), ' ', false); $mform->addElement('static', "divideradd", '', ''); if ($this->noofitems > 0) { $mform->addElement('header', 'additemhdr', get_string('delete', 'moodle')); $deletegrp = array(); $deletegrp[] = $mform->createElement('submit', 'deletebutton', get_string('delete', 'moodle')); $deletegrp[] = $mform->createElement('select', 'selectdelete', get_string('deleteitem', 'qtype_calculated')."1", $addremoveoptions); $deletegrp[] = $mform->createElement('static', "stat", "Items", get_string('setwildcardvalues', 'qtype_calculatedsimple')); $mform->addGroup($deletegrp, 'deletegrp', '', ' ', false); } else { $mform->addElement('static', 'warning', '', '<span class="error">' . get_string('youmustaddatleastoneitem', 'qtype_calculated').'</span>'); } $addgrp1 = array(); $addgrp1[] = $mform->createElement('submit', 'showbutton', get_string('showitems', 'qtype_calculated')); $addgrp1[] = $mform->createElement('select', "selectshow", '' , $showoptions); $addgrp1[] = $mform->createElement('static', "stat", '', get_string('setwildcardvalues', 'qtype_calculated')); $mform->addGroup($addgrp1, 'addgrp1', '', ' ', false); $mform->registerNoSubmitButton('showbutton'); $mform->closeHeaderBefore('addgrp1'); //---------------------------------------------------------------------- $j = $this->noofitems * count($this->datasetdefs); $k = 1; if ("" != optional_param('selectshow', '', PARAM_INT)) { $k = optional_param('selectshow', '', PARAM_INT); } for ($i = $this->noofitems; $i >= 1; $i--) { if ($k > 0) { $mform->addElement('header', '', "<b>" . get_string('setno', 'qtype_calculated', $i)."</b> "); } foreach ($this->datasetdefs as $defkey => $datasetdef) { if ($k > 0) { if ($datasetdef->category == 0 ) { $mform->addElement('text', "number[$j]", get_string('wildcard', 'qtype_calculated', $datasetdef->name)); } else { $mform->addElement('text', "number[$j]", get_string( 'sharedwildcard', 'qtype_calculated', $datasetdef->name)); } } else { $mform->addElement('hidden', "number[$j]" , ''); } $mform->setType("number[$j]", PARAM_NUMBER); $mform->addElement('hidden', "itemid[$j]"); $mform->setType("itemid[$j]", PARAM_INT); $mform->addElement('hidden', "definition[$j]"); $mform->setType("definition[$j]", PARAM_NOTAGS); $data[$datasetdef->name] =$datasetdef->items[$i]->value; $j--; } if ('' != $strquestionlabel && ($k > 0 )) { //|| $this->outsidelimit || !empty($this->numbererrors ) $repeated[] = $mform->addElement('static', "answercomment[$i]", $strquestionlabel); // decode equations in question text $qtext = $this->qtypeobj->substitute_variables( $this->question->questiontext, $data); $textequations = $this->qtypeobj->find_math_equations($qtext); if ($textequations != '' && count($textequations) > 0 ) { $mform->addElement('static', "divider1[$j]", '', 'Formulas {=..} in question text'); foreach ($textequations as $key => $equation) { if ($formulaerrors = qtype_calculated_find_formula_errors($equation)) { $str=$formulaerrors; } else { eval('$str = '.$equation.';'); } $mform->addElement('static', "textequation", "{=$equation}", "=".$str); } } } $k--; } $mform->addElement('static', 'outsidelimit', '', ''); //---------------------------------------------------------------------- // Non standard name for button element needed so not using add_action_buttons if (!($this->noofitems==0) ) { $mform->addElement('submit', 'savechanges', get_string('savechanges')); $mform->closeHeaderBefore('savechanges'); } //hidden elements $mform->addElement('hidden', 'id'); $mform->setType('id', PARAM_INT); $mform->addElement('hidden', 'courseid'); $mform->setType('courseid', PARAM_INT); $mform->setDefault('courseid', 0); $mform->addElement('hidden', 'category'); $mform->setType('category', PARAM_RAW); $mform->setDefault('category', array('contexts' => array($this->categorycontext))); $mform->addElement('hidden', 'cmid'); $mform->setType('cmid', PARAM_INT); $mform->setDefault('cmid', 0); $mform->addElement('hidden', 'wizard', 'datasetitems'); $mform->setType('wizard', PARAM_ALPHA); $mform->addElement('hidden', 'returnurl'); $mform->setType('returnurl', PARAM_LOCALURL); $mform->setDefault('returnurl', 0); }