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>&nbsp;&nbsp;");
         }
         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;
 }
Esempio n. 3
0
    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>&nbsp;&nbsp;");
            }
            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);
    }