function question_edit_multianswer_form(&$submiturl, &$question, &$category, &$contexts, $formeditable = true) { global $QTYPES, $SESSION, $CFG, $DB; $this->regenerate = true; if ("1" == optional_param('reload', '', PARAM_INT)) { $this->reload = true; } else { $this->reload = false; } // $this->question = $question; $this->used_in_quiz = false; // echo "<p> question <pre>";print_r($question);echo "</pre></p>"; if (isset($question->id) && $question->id != 0) { $this->savedquestiondisplay = fullclone($question); if ($list = $DB->get_records('quiz_question_instances', array('question' => $question->id))) { foreach ($list as $key => $li) { $this->nb_of_quiz++; if ($att = $DB->get_records('quiz_attempts', array('quiz' => $li->quiz, 'preview' => '0'))) { $this->nb_of_attempts += count($att); $this->used_in_quiz = true; } } } } parent::question_edit_form($submiturl, $question, $category, $contexts, $formeditable); }
function question_edit_calculatedmulti_form(&$submiturl, &$question, &$category, &$contexts, $formeditable = true) { global $QTYPES, $SESSION, $CFG, $DB; $this->question = $question; $this->qtypeobj =& $QTYPES[$this->question->qtype]; if ("1" == optional_param('reload', '', PARAM_INT)) { $this->reload = true; } else { $this->reload = false; } if (!$this->reload) { // use database data as this is first pass if (isset($this->question->id)) { // remove prefix #{..}# if exists $this->initialname = $question->name; $regs = array(); if (preg_match('~#\\{([^[:space:]]*)#~', $question->name, $regs)) { $question->name = str_replace($regs[0], '', $question->name); } } } else { } parent::question_edit_form($submiturl, $question, $category, $contexts, $formeditable); }
function question_edit_calculatedsimple_form(&$submiturl, &$question, &$category, &$contexts, $formeditable = true) { global $QTYPES, $SESSION, $CFG, $DB; $this->regenerate = true; $this->question = $question; $this->qtypeobj =& $QTYPES[$this->question->qtype]; //get the dataset definitions for this question //coming here everytime even when using a NoSubmitButton //so this will only set the values to the actual question database content which is not what we want //so this should be removed from here // get priority to paramdatasets if ("1" == optional_param('reload', '', PARAM_INT)) { $this->reload = true; } else { $this->reload = false; } if (!$this->reload) { // use database data as this is first pass // question->id == 0 so no stored datasets // else get datasets if (!empty($question->id)) { if (empty($question->options)) { $this->get_question_options($question); } $this->datasetdefs = $this->qtypeobj->get_dataset_definitions($question->id, array()); if (!empty($this->datasetdefs)) { foreach ($this->datasetdefs as $defid => $datasetdef) { // first get the items in case their number does not correspond to itemcount if (isset($datasetdef->id)) { $this->datasetdefs[$defid]->items = $this->qtypeobj->get_database_dataset_items($datasetdef->id); if ($this->datasetdefs[$defid]->items != '') { $datasetdef->itemcount = count($this->datasetdefs[$defid]->items); } else { $datasetdef->itemcount = 0; } } // Get maxnumber if ($this->maxnumber == -1 || $datasetdef->itemcount < $this->maxnumber) { $this->maxnumber = $datasetdef->itemcount; } } } $i = 0; foreach ($this->question->options->answers as $answer) { $this->answer[$i] = $answer; $i++; } $this->nonemptyanswer = $this->answer; } $datasettoremove = false; $newdatasetvalues = false; $newdataset = false; } else { // handle reload to get values from the form-elements // answers, datasetdefs and data_items // verify for the specific dataset values as the other parameters // unints, feeedback etc are handled elsewhere // handle request buttons : // 'analyzequestion' (Identify the wild cards {x..} present in answers) // 'addbutton' (create new set of datatitems) // 'updatedatasets' is handled automatically on each reload // The analyzequestion is done every time on reload // to detect any new wild cards so that the current display reflects // the mandatory (i.e. in answers) datasets // to implement : don't do any changes if the question is used in a quiz. // If new datadef, new properties should erase items. $dummyform = new stdClass(); $mandatorydatasets = array(); if ($dummyform->answer = optional_param('answer')) { // there is always at least one answer... $fraction = optional_param('fraction'); $feedback = optional_param('feedback'); $tolerance = optional_param('tolerance'); $tolerancetype = optional_param('tolerancetype'); $correctanswerlength = optional_param('correctanswerlength'); $correctanswerformat = optional_param('correctanswerformat'); foreach ($dummyform->answer as $key => $answer) { if (trim($answer) != '') { // just look for non-empty $this->answer[$key] = new stdClass(); $this->answer[$key]->answer = $answer; $this->answer[$key]->fraction = $fraction[$key]; $this->answer[$key]->feedback = $feedback[$key]; $this->answer[$key]->tolerance = $tolerance[$key]; $this->answer[$key]->tolerancetype = $tolerancetype[$key]; $this->answer[$key]->correctanswerlength = $correctanswerlength[$key]; $this->answer[$key]->correctanswerformat = $correctanswerformat[$key]; $this->nonemptyanswer[] = $this->answer[$key]; $mandatorydatasets += $this->qtypeobj->find_dataset_names($answer); } } } $this->datasetdefs = array(); // rebuild datasetdefs from old values $olddef = optional_param('datasetdef'); $oldoptions = optional_param('defoptions'); $calcmin = optional_param('calcmin'); $calclength = optional_param('calclength'); $calcmax = optional_param('calcmax'); $newdatasetvalues = false; for ($key = 1; $key <= sizeof($olddef); $key++) { $def = $olddef[$key]; $this->datasetdefs[$def] = new stdClass(); $this->datasetdefs[$def]->type = 1; $this->datasetdefs[$def]->category = 0; // $this->datasets[$key]->name = $datasetname; $this->datasetdefs[$def]->options = $oldoptions[$key]; $this->datasetdefs[$def]->calcmin = $calcmin[$key]; $this->datasetdefs[$def]->calcmax = $calcmax[$key]; $this->datasetdefs[$def]->calclength = $calclength[$key]; //then compare with new values if (preg_match('~^(uniform|loguniform):([^:]*):([^:]*):([0-9]*)$~', $this->datasetdefs[$def]->options, $regs)) { if ($this->datasetdefs[$def]->calcmin != $regs[2] || $this->datasetdefs[$def]->calcmax != $regs[3] || $this->datasetdefs[$def]->calclength != $regs[4]) { $newdatasetvalues = true; } } $this->datasetdefs[$def]->options = "uniform:" . $this->datasetdefs[$def]->calcmin . ":" . $this->datasetdefs[$def]->calcmax . ":" . $this->datasetdefs[$def]->calclength; } // detect new datasets $newdataset = false; foreach ($mandatorydatasets as $datasetname) { if (!isset($this->datasetdefs["1-0-{$datasetname}"])) { $key = "1-0-{$datasetname}"; $this->datasetdefs[$key] = new stdClass(); //"1-0-$datasetname"; $this->datasetdefs[$key]->type = 1; $this->datasetdefs[$key]->category = 0; $this->datasetdefs[$key]->name = $datasetname; $this->datasetdefs[$key]->options = "uniform:1.0:10.0:1"; $newdataset = true; } else { $this->datasetdefs["1-0-{$datasetname}"]->name = $datasetname; } } // remove obsolete datasets $datasettoremove = false; foreach ($this->datasetdefs as $defkey => $datasetdef) { if (!isset($datasetdef->name)) { $datasettoremove = true; unset($this->datasetdefs[$defkey]); } } } // handle reload // create items if $newdataset and noofitems > 0 and !$newdatasetvalues // eliminate any items if $newdatasetvalues // eliminate any items if $datasettoremove, $newdataset, $newdatasetvalues if ($datasettoremove || $newdataset || $newdatasetvalues) { foreach ($this->datasetdefs as $defkey => $datasetdef) { $datasetdef->itemcount = 0; unset($datasetdef->items); } } $maxnumber = -1; if ("" != optional_param('addbutton')) { $maxnumber = optional_param('selectadd'); foreach ($this->datasetdefs as $defid => $datasetdef) { $datasetdef->itemcount = $maxnumber; unset($datasetdef->items); for ($numberadded = 1; $numberadded <= $maxnumber; $numberadded++) { $datasetitem = new stdClass(); $datasetitem->itemnumber = $numberadded; $datasetitem->id = 0; $datasetitem->value = $this->qtypeobj->generate_dataset_item($datasetdef->options); $this->datasetdefs[$defid]->items[$numberadded] = $datasetitem; } //for number added } // datasetsdefs end $this->maxnumber = $maxnumber; } else { // Handle reload dataset items if ("" != optional_param('definition') && !($datasettoremove || $newdataset || $newdatasetvalues)) { $i = 1; $fromformdefinition = optional_param('definition'); $fromformnumber = optional_param('number'); $fromformitemid = optional_param('itemid'); ksort($fromformdefinition); foreach ($fromformdefinition as $key => $defid) { $addeditem = new stdClass(); $addeditem->id = $fromformitemid[$i]; $addeditem->value = $fromformnumber[$i]; $addeditem->itemnumber = ceil($i / count($this->datasetdefs)); $this->datasetdefs[$defid]->items[$addeditem->itemnumber] = $addeditem; $this->datasetdefs[$defid]->itemcount = $i; $i++; } } if (isset($addeditem->itemnumber) && $this->maxnumber < $addeditem->itemnumber) { $this->maxnumber = $addeditem->itemnumber; if (!empty($this->datasetdefs)) { foreach ($this->datasetdefs as $datasetdef) { $datasetdef->itemcount = $this->maxnumber; } } } } parent::question_edit_form($submiturl, $question, $category, $contexts, $formeditable); }