Data Item Functions: Difference between revisions
No edit summary |
No edit summary |
||
Line 7: | Line 7: | ||
In '''question/type/datasetdependent/datasetitems.php''' | In '''question/type/datasetdependent/datasetitems.php''' | ||
// Handle adding | |||
// Handle adding of dataset items | |||
A data item have been either generated or reused and is presented in the form so it can be edited. When the '''add button''' is clicked | |||
// This twisted condition should effectively stop resubmits caused by reloads | // This twisted condition should effectively stop resubmits caused by reloads | ||
if (isset($form->addbutton) && $maxnumber + 1 == $form->numbertoadd) { | if (isset($form->addbutton) && $maxnumber + 1 == $form->numbertoadd) { | ||
Line 37: | Line 39: | ||
// else Success: | // else Success: | ||
$maxnumber = $addeditem->number; | $maxnumber = $addeditem->number; | ||
// removing of dataset items | |||
When the remove button is clicked | |||
} else if (isset($form->deletebutton) | } else if (isset($form->deletebutton) | ||
Line 55: | Line 61: | ||
$grosscoursefiles = get_directory_list("$CFG->dataroot/$course->id", | $grosscoursefiles = get_directory_list("$CFG->dataroot/$course->id", | ||
"$CFG->moddata"); | "$CFG->moddata"); | ||
The next form is prepared with a new or the last removed item is presented | |||
// Generate a new dataset item (or reuse an old one) | // Generate a new dataset item (or reuse an old one) | ||
Line 93: | Line 100: | ||
} | } | ||
} | } | ||
When you remove a data item, you don't delete it , you just decrease a counter in the dataset. | |||
By doing it this way, this removed data item can be reused if you want it. |
Revision as of 04:16, 2 September 2006
This page discussed the actual (sept 2006, moodle 1.7) functions used to create, modify or delete data items.
Calculated parameters i.e {x1} are generated using the dataset parameters ( min, max, distribution) or edited directly by the teacher in the 3rd step of calculated questions creation or modifications.
The code for doing this,is mostly in question/type/datasetdependent/datasetitems.php and in
question/type/questiontype/generate_dataset_item($options)
question/type/questiontype/comment_on_datasetitems($question, $data, $number)
and backup and restore functions
In question/type/datasetdependent/datasetitems.php
// Handle adding of dataset items A data item have been either generated or reused and is presented in the form so it can be edited. When the add button is clicked
// This twisted condition should effectively stop resubmits caused by reloads if (isset($form->addbutton) && $maxnumber + 1 == $form->numbertoadd) { $addeditem->number = $form->numbertoadd; foreach ($form->definition as $key => $defid) { $addeditem->definition = $datasetdefs[$defid]->id; $addeditem->value = $form->value[$key]; if ($form->itemid[$key]) { // Reuse an previously used record $addeditem->id = $form->itemid[$key]; if (!update_record('question_dataset_items', $addeditem)) { error("Error: Unable to update dataset item"); } } else { unset($addeditem->id); if (!insert_record('question_dataset_items', $addeditem)) { error("Error: Unable to insert dataset item"); } }
foreach ($datasetdefs as $key => $newdef) { if (isset($newdef->id) && $newdef->itemcount <= $maxnumber) { $newdef->itemcount = $maxnumber+1; // Save the new value for options update_record('question_dataset_definitions', $newdef); } } } // else Success: $maxnumber = $addeditem->number;
// removing of dataset items
When the remove button is clicked
} else if (isset($form->deletebutton) && $maxnumber == $form->numbertodelete) { // Simply decrease itemcount where == $maxnumber foreach ($datasetdefs as $datasetdef) { if ($datasetdef->itemcount == $maxnumber) { $datasetdef->itemcount--; if (!update_record('question_dataset_definitions', $datasetdef)) { error("Error: Unable to update itemcount"); } } } --$maxnumber; } make_upload_directory("$course->id"); // Just in case $grosscoursefiles = get_directory_list("$CFG->dataroot/$course->id", "$CFG->moddata");
The next form is prepared with a new or the last removed item is presented
// Generate a new dataset item (or reuse an old one)
foreach ($datasetdefs as $defid => $datasetdef) { if (isset($datasetdef->id)) { $datasetdefs[$defid]->items = get_records_sql( // Use number as key!! " SELECT number, definition, id, value FROM {$CFG->prefix}question_dataset_items WHERE definition = $datasetdef->id "); }
if (isset($datasetdefs[$defid]->items[$maxnumber + 1]) && ( empty($form->forceregeneration) && isset($form->regenerateddefid) && $form->regenerateddefid != $defid || isset($form->deletebutton))) { // Reuse existing datasets } else { $datasetitem = new stdClass; $datasetitem->id = isset($datasetdefs[$defid]->items[$maxnumber + 1]->id) ? $datasetdefs[$defid]->items[$maxnumber + 1]->id : ; $datasetitem->number = $maxnumber + 1; if ($this->supports_dataset_item_generation()) { if (!empty($form->addbutton) || // If we added an item !isset($form->value) || // If we don't have a value $form->regenerateddefid == $defid) { // If we explicitly ask for regeneration $datasetitem->value = $this->generate_dataset_item($datasetdef->options); } else { $definition = array_flip($form->definition); $datasetitem->value = $form->value[$definition[$defid]]; } } else { $datasetitem->value = ; } $datasetdefs[$defid]->items[$maxnumber + 1] = clone($datasetitem); } }
When you remove a data item, you don't delete it , you just decrease a counter in the dataset.
By doing it this way, this removed data item can be reused if you want it.