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);
 }
Esempio n. 3
0
 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;
 }
Esempio n. 5
0
    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);
    }
Esempio n. 6
0
 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;
 }