function set_data($question) { $formdata = array(); //fill out all data sets and also the fields for the next item to add. $j = $this->noofitems * count($this->datasetdefs); for ($itemnumber = $this->noofitems; $itemnumber >= 1; $itemnumber--) { $data = array(); foreach ($this->datasetdefs as $defid => $datasetdef) { if (isset($datasetdef->items[$itemnumber])) { $formdata["number[{$j}]"] = $datasetdef->items[$itemnumber]->value; $formdata["definition[{$j}]"] = $defid; $formdata["itemid[{$j}]"] = $datasetdef->items[$itemnumber]->id; $data[$datasetdef->name] = $datasetdef->items[$itemnumber]->value; } $j--; } $formdata['answercomment[' . $itemnumber . ']'] = $this->qtypeobj->comment_on_datasetitems($this->question, $data, $itemnumber); } $formdata['nextpageparam[forceregeneration]'] = $this->regenerate; $formdata['selectdelete'] = '1'; $formdata['selectadd'] = '1'; $j = $this->noofitems * count($this->datasetdefs) + 1; $data = array(); // data for comment_on_datasetitems later //dataset generation dafaults if ($this->qtypeobj->supports_dataset_item_generation()) { $itemnumber = $this->noofitems + 1; foreach ($this->datasetdefs as $defid => $datasetdef) { $formdata["number[{$j}]"] = $this->qtypeobj->generate_dataset_item($datasetdef->options); $formdata["definition[{$j}]"] = $defid; $formdata["itemid[{$j}]"] = isset($datasetdef->items[$itemnumber]) ? $datasetdef->items[$itemnumber]->id : 0; $data[$datasetdef->name] = $formdata["number[{$j}]"]; $j++; } } //existing records override generated data depending on radio element $j = $this->noofitems * count($this->datasetdefs) + 1; if (!$this->regenerate) { $idx = 1; $itemnumber = $this->noofitems + 1; foreach ($this->datasetdefs as $defid => $datasetdef) { if (isset($datasetdef->items[$itemnumber])) { $formdata["number[{$j}]"] = $datasetdef->items[$itemnumber]->value; $formdata["definition[{$j}]"] = $defid; $formdata["itemid[{$j}]"] = $datasetdef->items[$itemnumber]->id; $data[$datasetdef->name] = $datasetdef->items[$itemnumber]->value; } $j++; } } //default answercomment will get ignored if answer element is not in the form. $formdata['answercomment[' . ($this->noofitems + 1) . ']'] = $this->qtypeobj->comment_on_datasetitems($this->question, $data, $this->noofitems + 1); $formdata = $this->qtypeobj->custom_generator_set_data($this->datasetdefs, $formdata); parent::set_data((object) ($formdata + (array) $question)); }
function definition() { global $SESSION; $mform =& $this->_form; $stringfile = 'qtype_' . $this->question->qtype; $possibledatasets = $this->qtypeobj->find_dataset_names($this->question->questiontext); $mandatorydatasets = array(); if (isset($this->question->options->answers)) { foreach ($this->question->options->answers as $answer) { $mandatorydatasets += $this->qtypeobj->find_dataset_names($answer->answer); } } else { foreach ($SESSION->datasetdependent->questionform->answers as $answer) { $mandatorydatasets += $this->qtypeobj->find_dataset_names($answer); } } $key = 0; $datadefscat = array(); $datadefscat = $this->qtypeobj->get_dataset_definitions_category($this->question); $datasetmenus = array(); $label = "<div class='mdl-align'>" . get_string('datasetrole', 'qtype_datasetdependent', 'numerical') . "</div>"; $mform->addElement('html', $label); // explaining the role of datasets so other strings can be shortened $mform->addElement('header', 'mandatoryhdr', get_string('mandatoryhdr', $stringfile)); $labelsharedwildcard = get_string("sharedwildcard", "qtype_datasetdependent"); foreach ($mandatorydatasets as $datasetname) { if (!isset($datasetmenus[$datasetname])) { list($options, $selected) = $this->qtypeobj->dataset_options($this->question, $datasetname); unset($options['0']); // Mandatory... $label = get_string("wildcard", "quiz") . " <strong>{$datasetname}</strong> "; $mform->addElement('select', "dataset[{$key}]", $label, $options); if (isset($datadefscat[$datasetname])) { $mform->addElement('static', "there is a category", $labelsharedwildcard . " <strong>{$datasetname} </strong>", get_string('dataitemdefined', "qtype_datasetdependent", $datadefscat[$datasetname])); } $mform->setDefault("dataset[{$key}]", $selected); $datasetmenus[$datasetname] = ''; $key++; } } $mform->addElement('header', 'possiblehdr', get_string('possiblehdr', $stringfile)); foreach ($possibledatasets as $datasetname) { if (!isset($datasetmenus[$datasetname])) { list($options, $selected) = $this->qtypeobj->dataset_options($this->question, $datasetname, false); $label = get_string("wildcard", "quiz") . " <strong>{$datasetname}</strong> "; $mform->addElement('select', "dataset[{$key}]", $label, $options); // $mform->addRule("dataset[$key]", null, 'required', null, 'client'); if (isset($datadefscat[$datasetname])) { $mform->addElement('static', "there is a category", $labelsharedwildcard . " <strong>{$datasetname} </strong>", get_string('dataitemdefined', "qtype_datasetdependent", $datadefscat[$datasetname])); } // $selected ="0"; $mform->setDefault("dataset[{$key}]", $selected); $datasetmenus[$datasetname] = ''; $key++; } } $this->add_action_buttons(false, get_string('nextpage', 'qtype_calculated')); //hidden elements $mform->addElement('hidden', 'returnurl'); $mform->setType('returnurl', PARAM_URL); $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', 'cmid'); $mform->setType('cmid', PARAM_INT); $mform->setDefault('cmid', 0); $mform->addElement('hidden', 'category'); $mform->setType('category', PARAM_RAW); $mform->setDefault('category', array('contexts' => array($this->categorycontext))); $mform->setType('id', PARAM_INT); $mform->addElement('hidden', 'wizard', 'datasetitems'); $mform->setType('wizard', PARAM_ALPHA); }
function set_data($question) { $formdata = array(); $fromform = new stdClass(); if (isset($question->options)) { $answers = $question->options->answers; if (count($answers)) { if (optional_param('updateanswers', '', PARAM_RAW) != '' || optional_param('updatedatasets', '', PARAM_RAW) != '') { foreach ($answers as $key => $answer) { $fromform->tolerance[$key] = $this->_form->getElementValue('tolerance[' . $key . ']'); $answer->tolerance = $fromform->tolerance[$key]; $fromform->tolerancetype[$key] = $this->_form->getElementValue('tolerancetype[' . $key . ']'); if (is_array($fromform->tolerancetype[$key])) { $fromform->tolerancetype[$key] = $fromform->tolerancetype[$key][0]; } $answer->tolerancetype = $fromform->tolerancetype[$key]; $fromform->correctanswerlength[$key] = $this->_form->getElementValue('correctanswerlength[' . $key . ']'); if (is_array($fromform->correctanswerlength[$key])) { $fromform->correctanswerlength[$key] = $fromform->correctanswerlength[$key][0]; } $answer->correctanswerlength = $fromform->correctanswerlength[$key]; $fromform->correctanswerformat[$key] = $this->_form->getElementValue('correctanswerformat[' . $key . ']'); if (is_array($fromform->correctanswerformat[$key])) { $fromform->correctanswerformat[$key] = $fromform->correctanswerformat[$key][0]; } $answer->correctanswerformat = $fromform->correctanswerformat[$key]; } $this->qtypeobj->save_question_calculated($question, $fromform); } else { foreach ($answers as $key => $answer) { $formdata['tolerance[' . $key . ']'] = $answer->tolerance; $formdata['tolerancetype[' . $key . ']'] = $answer->tolerancetype; $formdata['correctanswerlength[' . $key . ']'] = $answer->correctanswerlength; $formdata['correctanswerformat[' . $key . ']'] = $answer->correctanswerformat; } } } } //fill out all data sets and also the fields for the next item to add. $j = $this->noofitems * count($this->datasetdefs); for ($itemnumber = $this->noofitems; $itemnumber >= 1; $itemnumber--) { $data = array(); foreach ($this->datasetdefs as $defid => $datasetdef) { if (isset($datasetdef->items[$itemnumber])) { $formdata["number[{$j}]"] = $datasetdef->items[$itemnumber]->value; $formdata["definition[{$j}]"] = $defid; $formdata["itemid[{$j}]"] = $datasetdef->items[$itemnumber]->id; $data[$datasetdef->name] = $datasetdef->items[$itemnumber]->value; } $j--; } $comment = $this->qtypeobj->comment_on_datasetitems($question->id, $answers, $data, $itemnumber); if ($comment->outsidelimit) { $this->outsidelimit = $comment->outsidelimit; } $totalcomment = ''; foreach ($question->options->answers as $key => $answer) { $totalcomment .= $comment->stranswers[$key] . '<br/>'; } $formdata['answercomment[' . $itemnumber . ']'] = $totalcomment; } $formdata['nextpageparam[forceregeneration]'] = $this->regenerate; $formdata['selectdelete'] = '1'; $formdata['selectadd'] = '1'; $j = $this->noofitems * count($this->datasetdefs) + 1; $data = array(); // data for comment_on_datasetitems later //dataset generation dafaults if ($this->qtypeobj->supports_dataset_item_generation()) { $itemnumber = $this->noofitems + 1; foreach ($this->datasetdefs as $defid => $datasetdef) { if (optional_param('updatedatasets', '', PARAM_RAW) == '' && optional_param('updateanswers', '', PARAM_RAW) == '') { $formdata["number[{$j}]"] = $this->qtypeobj->generate_dataset_item($datasetdef->options); } else { $formdata["number[{$j}]"] = $this->_form->getElementValue("number[{$j}]"); } $formdata["definition[{$j}]"] = $defid; $formdata["itemid[{$j}]"] = isset($datasetdef->items[$itemnumber]) ? $datasetdef->items[$itemnumber]->id : 0; $data[$datasetdef->name] = $formdata["number[{$j}]"]; $j++; } } //existing records override generated data depending on radio element $j = $this->noofitems * count($this->datasetdefs) + 1; if (!$this->regenerate && (optional_param('updatedatasets', '', PARAM_RAW) == '' && optional_param('updateanswers', '', PARAM_RAW) == '')) { $idx = 1; $itemnumber = $this->noofitems + 1; foreach ($this->datasetdefs as $defid => $datasetdef) { if (isset($datasetdef->items[$itemnumber])) { $formdata["number[{$j}]"] = $datasetdef->items[$itemnumber]->value; $formdata["definition[{$j}]"] = $defid; $formdata["itemid[{$j}]"] = $datasetdef->items[$itemnumber]->id; $data[$datasetdef->name] = $datasetdef->items[$itemnumber]->value; } $j++; } } //default answercomment will get ignored if answer element is not in the form. $comment = $this->qtypeobj->comment_on_datasetitems($question->id, $answers, $data, $this->noofitems + 1); if ($comment->outsidelimit) { $this->outsidelimit = $comment->outsidelimit; } $key1 = 1; foreach ($question->options->answers as $key => $answer) { $formdata['answercomment[' . ($this->noofitems + $key1) . ']'] = $comment->stranswers[$key]; $key1++; } if ($this->outsidelimit) { $formdata['outsidelimit'] = '<span class="error">' . get_string('oneanswertrueansweroutsidelimits', 'qtype_datasetdependent') . '</span>'; } $formdata = $this->qtypeobj->custom_generator_set_data($this->datasetdefs, $formdata); parent::set_data((object) ($formdata + (array) $question)); }
/** * Runs all the code required to set up and save an essay question for testing purposes. * Alternate DB table prefix may be used to facilitate data deletion. */ function generate_test($name, $courseid = null) { list($form, $question) = parent::generate_test($name, $courseid); $form->feedback = 1; $form->multiplier = array(1, 1); $form->shuffleanswers = 1; $form->noanswers = 1; $form->qtype = 'calculated'; $question->qtype = 'calculated'; $form->answers = array('{a} + {b}'); $form->fraction = array(1); $form->tolerance = array(0.01); $form->tolerancetype = array(1); $form->correctanswerlength = array(2); $form->correctanswerformat = array(1); $form->questiontext = "What is {a} + {b}?"; if ($courseid) { $course = get_record('course', 'id', $courseid); } $new_question = $this->save_question($question, $form, $course); $dataset_form = new stdClass(); $dataset_form->nextpageparam["forceregeneration"] = 1; $dataset_form->calcmin = array(1 => 1.0, 2 => 1.0); $dataset_form->calcmax = array(1 => 10.0, 2 => 10.0); $dataset_form->calclength = array(1 => 1, 2 => 1); $dataset_form->number = array(1 => 5.4, 2 => 4.9); $dataset_form->itemid = array(1 => '', 2 => ''); $dataset_form->calcdistribution = array(1 => 'uniform', 2 => 'uniform'); $dataset_form->definition = array(1 => "1-0-a", 2 => "1-0-b"); $dataset_form->nextpageparam = array('forceregeneration' => false); $dataset_form->addbutton = 1; $dataset_form->selectadd = 1; $dataset_form->courseid = $courseid; $dataset_form->cmid = 0; $dataset_form->id = $new_question->id; $this->save_dataset_items($new_question, $dataset_form); return $new_question; }
protected function definition() { global $SESSION; $mform = $this->_form; $possibledatasets = $this->qtypeobj->find_dataset_names($this->question->questiontext); $mandatorydatasets = array(); if (isset($this->question->options->answers)) { foreach ($this->question->options->answers as $answer) { $mandatorydatasets += $this->qtypeobj->find_dataset_names($answer->answer); } } else { foreach ($SESSION->calculated->questionform->answers as $answer) { $mandatorydatasets += $this->qtypeobj->find_dataset_names($answer); } } $key = 0; $datadefscat= array(); $datadefscat = $this->qtypeobj->get_dataset_definitions_category($this->question); $datasetmenus = array(); $label = "<div class='mdl-align'>".get_string('datasetrole', 'qtype_calculated')."</div>"; // explaining the role of datasets so other strings can be shortened $mform->addElement('html', $label); $mform->addElement('header', 'mandatoryhdr', get_string('mandatoryhdr', 'qtype_calculated')); $labelsharedwildcard = get_string('sharedwildcard', 'qtype_calculated'); foreach ($mandatorydatasets as $datasetname) { if (!isset($datasetmenus[$datasetname])) { list($options, $selected) = $this->qtypeobj->dataset_options($this->question, $datasetname); unset($options['0']); // Mandatory... $label = get_string('wildcard', 'qtype_calculated', $datasetname); $mform->addElement('select', "dataset[$key]", $label, $options); if (isset($datadefscat[$datasetname])) { $mform->addElement('static', "there is a category", get_string('sharedwildcard', 'qtype_calculated', $datasetname), get_string('dataitemdefined', 'qtype_calculated', $datadefscat[$datasetname])); } $mform->setDefault("dataset[$key]", $selected); $datasetmenus[$datasetname] = ''; $key++; } } $mform->addElement('header', 'possiblehdr', get_string('possiblehdr', 'qtype_calculated')); foreach ($possibledatasets as $datasetname) { if (!isset($datasetmenus[$datasetname])) { list($options, $selected) = $this->qtypeobj->dataset_options( $this->question, $datasetname, false); $label = get_string('wildcard', 'qtype_calculated', $datasetname); $mform->addElement('select', "dataset[$key]", $label, $options); if (isset($datadefscat[$datasetname])) { $mform->addElement('static', "there is a category", get_string('sharedwildcard', 'qtype_calculated', $datasetname), get_string('dataitemdefined', 'qtype_calculated', $datadefscat[$datasetname])); } $mform->setDefault("dataset[$key]", $selected); $datasetmenus[$datasetname] = ''; $key++; } } // temporary strings $mform->addElement('header', 'synchronizehdr', get_string('synchronize', 'qtype_calculated')); $mform->addElement('radio', 'synchronize', '', get_string('synchronizeno', 'qtype_calculated'), 0); $mform->addElement('radio', 'synchronize', '', get_string('synchronizeyes', 'qtype_calculated'), 1); $mform->addElement('radio', 'synchronize', '', get_string('synchronizeyesdisplay', 'qtype_calculated'), 2); if (isset($this->question->options) && isset($this->question->options->synchronize)) { $mform->setDefault('synchronize', $this->question->options->synchronize); } else { $mform->setDefault('synchronize', 0); } $this->add_action_buttons(false, get_string('nextpage', 'qtype_calculated')); $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; }