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 + -
显示快捷键?