abstractqtype.php
来自「很棒的在线教学系统」· PHP 代码 · 共 753 行 · 第 1/3 页
PHP
753 行
* @param object $form * @param int $course * @param PARAM_ALPHA $wizardnow should be added as we are coming from question2.php */ function save_question($question, $form, $course) { $wizardnow = optional_param('wizardnow', '', PARAM_ALPHA); $id = optional_param('id', 0, PARAM_INT); // question id // in case 'question' // for a new question $form->id is empty // when saving as new question // $question->id = 0, $form is $data from question2.php // and $data->makecopy is defined as $data->id is the initial question id // edit case. If it is a new question we don't necessarily need to // return a valid question object // See where we're coming from switch($wizardnow) { case '' : case 'question': // coming from the first page, creating the second if (empty($form->id)) { // for a new question $form->id is empty $question = parent::save_question($question, $form, $course); //prepare the datasets using default $questionfromid $this->preparedatasets($form); $form->id = $question->id; $this->save_dataset_definitions($form); } else if (!empty($form->makecopy)){ $questionfromid = $form->id ; $question = parent::save_question($question, $form, $course); //prepare the datasets $this->preparedatasets($form,$questionfromid); $form->id = $question->id; $this->save_as_new_dataset_definitions($form,$questionfromid ); } else {// editing a question $question = parent::save_question($question, $form, $course); //prepare the datasets $this->preparedatasets($form,$question->id); $form->id = $question->id; $this->save_dataset_definitions($form); } break; case 'datasetdefinitions': $this->save_dataset_definitions($form); break; case 'datasetitems': $this->save_dataset_items($question, $form); break; default: error('Incorrect or no wizard page specified!'); break; } return $question; } function save_dataset_items($question, $fromform){ //overridden in child classes } function get_dataset_definitions($questionid, $newdatasets) { //get the existing datasets for this question $datasetdefs = array(); if (!empty($questionid)) { global $CFG; $sql = "SELECT i.* FROM {$CFG->prefix}question_datasets d, {$CFG->prefix}question_dataset_definitions i WHERE d.question = '$questionid' AND d.datasetdefinition = i.id "; if ($records = get_records_sql($sql)) { foreach ($records as $r) { $datasetdefs["$r->type-$r->category-$r->name"] = $r; } } } foreach ($newdatasets as $dataset) { if (!$dataset) { continue; // The no dataset case... } if (!isset($datasetdefs[$dataset])) { //make new datasetdef list($type, $category, $name) = explode('-', $dataset, 3); $datasetdef = new stdClass; $datasetdef->type = $type; $datasetdef->name = $name; $datasetdef->category = $category; $datasetdef->itemcount = 0; $datasetdef->options = 'uniform:1.0:10.0:1'; $datasetdefs[$dataset] = clone($datasetdef); } } return $datasetdefs; } function save_dataset_definitions($form) { // Save datasets $datasetdefinitions = $this->get_dataset_definitions($form->id, $form->dataset); $tmpdatasets = array_flip($form->dataset); $defids = array_keys($datasetdefinitions); foreach ($defids as $defid) { $datasetdef = &$datasetdefinitions[$defid]; if (isset($datasetdef->id)) { if (!isset($tmpdatasets[$defid])) { // This dataset is not used any more, delete it delete_records('question_datasets', 'question', $form->id, 'datasetdefinition', $datasetdef->id); if ($datasetdef->category == 0) { // Question local dataset delete_records('question_dataset_definitions', 'id', $datasetdef->id); delete_records('question_dataset_items', 'definition', $datasetdef->id); } } // This has already been saved or just got deleted unset($datasetdefinitions[$defid]); continue; } if (!$datasetdef->id = insert_record( 'question_dataset_definitions', $datasetdef)) { error("Unable to create dataset $defid"); } if (0 != $datasetdef->category) { // We need to look for already existing // datasets in the category. // By first creating the datasetdefinition above we // can manage to automatically take care of // some possible realtime concurrence if ($olderdatasetdefs = get_records_select( 'question_dataset_definitions', "type = '$datasetdef->type' AND name = '$datasetdef->name' AND category = '$datasetdef->category' AND id < $datasetdef->id ORDER BY id DESC")) { while ($olderdatasetdef = array_shift($olderdatasetdefs)) { delete_records('question_dataset_definitions', 'id', $datasetdef->id); $datasetdef = $olderdatasetdef; } } } // Create relation to this dataset: $questiondataset = new stdClass; $questiondataset->question = $form->id; $questiondataset->datasetdefinition = $datasetdef->id; if (!insert_record('question_datasets', $questiondataset)) { error("Unable to create relation to dataset $name"); } unset($datasetdefinitions[$defid]); } // Remove local obsolete datasets as well as relations // to datasets in other categories: if (!empty($datasetdefinitions)) { foreach ($datasetdefinitions as $def) { delete_records('question_datasets', 'question', $form->id, 'datasetdefinition', $def->id); if ($def->category == 0) { // Question local dataset delete_records('question_dataset_definitions', 'id', $def->id); delete_records('question_dataset_items', 'definition', $def->id); } } } } /** This function create a copy of the datasets ( definition and dataitems) * from the preceding question if they remain in the new question * otherwise its create the datasets that have been added as in the * save_dataset_definitions() */ function save_as_new_dataset_definitions($form, $initialid) { global $CFG ; // Get the datasets from the intial question $datasetdefinitions = $this->get_dataset_definitions($initialid, $form->dataset); // $tmpdatasets contains those of the new question $tmpdatasets = array_flip($form->dataset); $defids = array_keys($datasetdefinitions);// new datasets foreach ($defids as $defid) { $datasetdef = &$datasetdefinitions[$defid]; if (isset($datasetdef->id)) { // This dataset exist in the initial question if (!isset($tmpdatasets[$defid])) { // do not exist in the new question so ignore unset($datasetdefinitions[$defid]); continue; } // create a copy but not for category one if (0 == $datasetdef->category) { $olddatasetid = $datasetdef->id ; $olditemcount = $datasetdef->itemcount ; $datasetdef->itemcount =0; if (!$datasetdef->id = insert_record( 'question_dataset_definitions', $datasetdef)) { error("Unable to create dataset $defid"); } //copy the dataitems $olditems = get_records_sql( // Use number as key!! " SELECT itemnumber, value FROM {$CFG->prefix}question_dataset_items WHERE definition = $olddatasetid "); if (count($olditems) > 0 ) { $itemcount = 0; foreach($olditems as $item ){ $item->definition = $datasetdef->id; if (!insert_record('question_dataset_items', $item)) { error("Unable to insert dataset item $item->itemnumber with $item->value for $datasetdef->name"); } $itemcount++; } //update item count $datasetdef->itemcount =$itemcount; update_record('question_dataset_definitions', $datasetdef); } // end of copy the dataitems }// end of copy the datasetdef // Create relation to the new question with this // copy as new datasetdef from the initial question $questiondataset = new stdClass; $questiondataset->question = $form->id; $questiondataset->datasetdefinition = $datasetdef->id; if (!insert_record('question_datasets', $questiondataset)) { error("Unable to create relation to dataset $name"); } unset($datasetdefinitions[$defid]); continue; }// end of datasetdefs from the initial question // really new one code similar to save_dataset_definitions() if (!$datasetdef->id = insert_record( 'question_dataset_definitions', $datasetdef)) { error("Unable to create dataset $defid"); } if (0 != $datasetdef->category) { // We need to look for already existing // datasets in the category. // By first creating the datasetdefinition above we // can manage to automatically take care of // some possible realtime concurrence if ($olderdatasetdefs = get_records_select( 'question_dataset_definitions', "type = '$datasetdef->type'
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?