libdir.'/questionlib.php'); define('DEFAULT_QUESTIONS_PER_PAGE', 20); function get_module_from_cmid($cmid){ global $CFG; if (!$cmrec = get_record_sql("SELECT cm.*, md.name as modname FROM {$CFG->prefix}course_modules cm, {$CFG->prefix}modules md WHERE cm.id = '$cmid' AND md.id = cm.module")){ error('cmunknown'); } elseif (!$modrec =get_record($cmrec->modname, 'id', $cmrec->instance)) { error('cmunknown'); } $modrec->instance = $modrec->id; $modrec->cmid = $cmrec->id; return array($modrec, $cmrec); } /** * Function to read all questions for category into big array * * @param int $category category number * @param bool $noparent if true only questions with NO parent will be selected * @param bool $recurse include subdirectories * @param bool $export set true if this is called by questionbank export * @author added by Howard Miller June 2004 */ function get_questions_category( $category, $noparent=false, $recurse=true, $export=true ) { global $QTYPES; // questions will be added to an array $qresults = array(); // build sql bit for $noparent $npsql = ''; if ($noparent) { $npsql = " and parent='0' "; } // get (list) of categories if ($recurse) { $categorylist = question_categorylist( $category->id ); } else { $categorylist = $category->id; } // get the list of questions for the category if ($questions = get_records_select("question","category IN ($categorylist) $npsql", "qtype, name ASC")) { // iterate through questions, getting stuff we need foreach($questions as $question) { $questiontype = $QTYPES[$question->qtype]; $question->export_process = $export; $questiontype->get_question_options( $question ); $qresults[] = $question; } } return $qresults; } /** * Gets the default category in a course * * It returns the first category with no parent category. If no categories * exist yet then one is created. * @return object The default category * @param integer $courseid The id of the course whose default category is wanted */ function get_default_question_category($courseid) { // If it already exists, just return it. if ($category = get_records_select("question_categories", "course = '$courseid' AND parent = '0'", 'id', '*', '', 1)) { return reset($category); } // Otherwise, we need to make one $category = new stdClass; $category->name = get_string("default", "quiz"); $category->info = get_string("defaultinfo", "quiz"); $category->course = $courseid; $category->parent = 0; $category->sortorder = 999; // By default, all categories get this number, and are sorted alphabetically. $category->publish = 0; $category->stamp = make_unique_id_code(); if (!$category->id = insert_record("question_categories", $category)) { notify("Error creating a default category!"); return false; } return $category; } /** * prints a form to choose categories */ function question_category_form($course, $pageurl, $current, $recurse=1, $showhidden=false, $showquestiontext=false) { global $CFG; /// Make sure the default category exists for this course get_default_question_category($course->id); /// Get all the existing categories now $catmenu = question_category_options($course->id, true); $strcategory = get_string("category", "quiz"); $strshow = get_string("show", "quiz"); $streditcats = get_string("editcategories", "quiz"); popup_form ("edit.php?".$pageurl->get_query_string()."&category=", $catmenu, "catmenu", $current, "", "", "", false, "self", "$strcategory"); echo '
'; } /** * Private funciton to help the preceeding function. */ function question_category_form_checkbox($name, $checked) { echo '"; print_string("selectcategoryabove", "quiz"); echo "
"; return; } if (!$category = get_record('question_categories', 'id', $categoryid)) { notify('Category not found!'); return; } $canedit = has_capability('moodle/question:manage', get_context_instance(CONTEXT_COURSE, $category->course)); if ($cm AND $cm->modname == 'quiz') { $quizid = $cm->instance; } else { $quizid = 0; } echo ''; $returnurl = urlencode($pageurl->out()); $questionurl = new moodle_url("$CFG->wwwroot/question/question.php", array('returnurl' => $returnurl, 'category' => $category->id)); if ($cm!==null){ $questionurl->param('cmid', $cm->id); } popup_form ($questionurl->out().'&qtype=', $QTYPE_MENU, "addquestion", "", "choose", "", "", false, "self", "$strcreatenewquestion"); echo ' | '; helpbutton("questiontypes", $strcreatenewquestion, "quiz"); echo ' | '; } else { echo ''; print_string("publishedit","quiz"); echo ' | '; } echo '
"; print_string("noquestions", "quiz"); echo "
"; return; } if (!$questions = get_records_select('question', "category IN ($categorylist) AND parent = '0' $showhidden", $sortorderdecoded, '*', $page*$perpage, $perpage)) { // There are no questions on the requested page. $page = 0; if (!$questions = get_records_select('question', "category IN ($categorylist) AND parent = '0' $showhidden", $sortorderdecoded, '*', 0, $perpage)) { // There are no questions at all echo ""; print_string("noquestions", "quiz"); echo "
"; return; } } print_paging_bar($totalnumber, $page, $perpage, $pageurl, 'qpage'); echo '\n"; } /** * Shows the question bank editing interface. * * The function also processes a number of actions: * * Actions affecting the question pool: * move Moves a question to a different category * deleteselected Deletes the selected questions from the category * Other actions: * category Chooses the category * displayoptions Sets display options * * @author Martin Dougiamas and many others. This has recently been extensively * rewritten by Gustav Delius and other members of the Serving Mathematics project * {@link http://maths.york.ac.uk/serving_maths} * @param moodle_url $pageurl object representing this pages url. */ function question_showbank($pageurl, $cm, $page, $perpage, $sortorder, $sortorderdecoded, $cat, $recurse, $showhidden, $showquestiontext){ global $COURSE, $USER; /// Now, check for commands on this page and modify variables as necessary if (isset($_REQUEST['move']) and confirm_sesskey()) { /// Move selected questions to new category $tocategoryid = required_param('category', PARAM_INT); if (!$tocategory = get_record('question_categories', 'id', $tocategoryid)) { error('Invalid category'); } if (!has_capability('moodle/question:managecategory', get_context_instance(CONTEXT_COURSE, $tocategory->course))){ error(get_string('categorynoedit', 'quiz', $tocategory->name), $pageurl->out()); } foreach ($_POST as $key => $value) { // Parse input for question ids if (preg_match('!^q([0-9]+)$!', $key, $matches)) { $key = $matches[1]; if (!set_field('question', 'category', $tocategory->id, 'id', $key)) { error('Could not update category field'); } } } } if (isset($_REQUEST['deleteselected'])) { // delete selected questions from the category if (isset($_REQUEST['confirm']) and confirm_sesskey()) { // teacher has already confirmed the action $deleteselected = required_param('deleteselected'); if ($_REQUEST['confirm'] == md5($deleteselected)) { if ($questionlist = explode(',', $deleteselected)) { // for each question either hide it if it is in use or delete it foreach ($questionlist as $questionid) { if (record_exists('quiz_question_instances', 'question', $questionid) or record_exists('question_states', 'originalquestion', $questionid)) { if (!set_field('question', 'hidden', 1, 'id', $questionid)) { error('Was not able to hide question'); } } else { delete_question($questionid); } } } echo ''; echo ''; echo ''; redirect($pageurl->out()); } else { error("Confirmation string was incorrect"); } } else { // teacher still has to confirm // make a list of all the questions that are selected $rawquestions = $_REQUEST; $questionlist = ''; // comma separated list of ids of questions to be deleted $questionnames = ''; // string with names of questions separated by