/** * Randomly add a number of multichoice questions to an offlinequiz group. * * @param unknown_type $offlinequiz * @param unknown_type $addonpage * @param unknown_type $categoryid * @param unknown_type $number * @param unknown_type $includesubcategories */ function offlinequiz_add_random_questions($offlinequiz, $offlinegroup, $categoryid, $number, $recurse) { global $DB; $category = $DB->get_record('question_categories', array('id' => $categoryid)); if (!$category) { print_error('invalidcategoryid', 'error'); } $catcontext = context::instance_by_id($category->contextid); require_capability('moodle/question:useall', $catcontext); if ($recurse) { $categoryids = question_categorylist($category->id); } else { $categoryids = array($category->id); } list($qcsql, $qcparams) = $DB->get_in_or_equal($categoryids, SQL_PARAMS_NAMED, 'qc'); // Find all questions in the selected categories that are not in the offline group yet. $sql = "SELECT id\n FROM {question} q\n WHERE q.category {$qcsql}\n AND q.parent = 0\n AND q.hidden = 0\n AND q.qtype IN ('multichoice', 'multichoiceset')\n AND NOT EXISTS (SELECT 1 \n FROM {offlinequiz_group_questions} ogq\n WHERE ogq.questionid = q.id\n AND ogq.offlinequizid = :offlinequizid\n AND ogq.offlinegroupid = :offlinegroupid)"; $qcparams['offlinequizid'] = $offlinequiz->id; $qcparams['offlinegroupid'] = $offlinegroup->id; $questionids = $DB->get_fieldset_sql($sql, $qcparams); srand(microtime() * 1000000); shuffle($questionids); $chosenids = array(); while (($questionid = array_shift($questionids)) && $number > 0) { $chosenids[] = $questionid; $number -= 1; } $maxmarks = array(); if ($chosenids) { // Get the old maxmarks in case questions are already in other offlinequiz groups. list($qsql, $params) = $DB->get_in_or_equal($chosenids, SQL_PARAMS_NAMED); $sql = "SELECT id, questionid, maxmark\n FROM {offlinequiz_group_questions}\n WHERE offlinequizid = :offlinequizid\n AND questionid {$qsql}"; $params['offlinequizid'] = $offlinequiz->id; if ($slots = $DB->get_records_sql($sql, $params)) { foreach ($slots as $slot) { if (!array_key_exists($slot->questionid, $maxmarks)) { $maxmarks[$slot->questionid] = $slot->maxmark; } } } } offlinequiz_add_questionlist_to_group($chosenids, $offlinequiz, $offlinegroup, null, $maxmarks); }
$recurse = optional_param('recurse', 0, PARAM_BOOL); $addonpage = optional_param('addonpage', 0, PARAM_INT); $categoryid = required_param('categoryid', PARAM_INT); $randomcount = required_param('randomcount', PARAM_INT); offlinequiz_add_random_questions($offlinequiz, $addonpage, $categoryid, $randomcount, $recurse); offlinequiz_delete_template_usages($offlinequiz); offlinequiz_update_sumgrades($offlinequiz); redirect($afteractionurl); } if (optional_param('savechanges', false, PARAM_BOOL) && confirm_sesskey()) { // Parameter to copy selected questions to another group. $copyselectedtogroup = optional_param('copyselectedtogrouptop', 0, PARAM_INT); if ($copyselectedtogroup) { if ($selectedquestionids && ($newgroup = offlinequiz_get_group($offlinequiz, $copyselectedtogroup))) { $fromofflinegroup = optional_param('fromofflinegroup', 0, PARAM_INT); offlinequiz_add_questionlist_to_group($selectedquestionids, $offlinequiz, $newgroup, $fromofflinegroup); offlinequiz_update_sumgrades($offlinequiz, $newgroup->id); // Delete the templates, just to be sure. offlinequiz_delete_template_usages($offlinequiz); } redirect($afteractionurl); } // If rescaling is required save the new maximum. $maxgrade = str_replace(',', '.', optional_param('maxgrade', -1, PARAM_RAW)); if (!is_numeric($maxgrade)) { $afteractionurl->param('warning', urlencode(get_string('maxgradewarning', 'offlinequiz'))); } else { $maxgrade = unformat_float($maxgrade); if ($maxgrade >= 0) { offlinequiz_set_grade($maxgrade, $offlinequiz); // offlinequiz_update_all_final_grades($offlinequiz);