function definition_inner(&$mform) { $question_type_names = question_type_menu(); $mform->addRule('questiontext', null, 'required', null, 'client'); // Remove meaningless defaultgrade field. $mform->removeElement('defaultgrade'); // display the questions from questiontext; if ("" != optional_param('questiontext', '', PARAM_RAW)) { $this->questiondisplay = fullclone(qtype_multianswer_extract_question(optional_param('questiontext', '', PARAM_RAW))); } else { $this->questiondisplay = ""; } if (isset($this->questiondisplay->options->questions) && is_array($this->questiondisplay->options->questions)) { $countsubquestions = 0; foreach ($this->questiondisplay->options->questions as $subquestion) { if (!empty($subquestion)) { $countsubquestions++; } } } else { $countsubquestions = 0; } $mform->addElement('submit', 'analyzequestion', get_string('decodeverifyquestiontext', 'qtype_multianswer')); $mform->registerNoSubmitButton('analyzequestion'); for ($sub = 1; $sub <= $countsubquestions; $sub++) { $this->editas[$sub] = 'unknown type'; if (isset($this->questiondisplay->options->questions[$sub]->qtype)) { $this->editas[$sub] = $this->questiondisplay->options->questions[$sub]->qtype; } else { if (optional_param('sub_' . $sub . "_" . 'qtype', '', PARAM_RAW) != '') { $this->editas[$sub] = optional_param('sub_' . $sub . "_" . 'qtype', '', PARAM_RAW); } } $mform->addElement('header', 'subhdr', get_string('questionno', 'quiz', '{#' . $sub . '}') . ' ' . $question_type_names[$this->questiondisplay->options->questions[$sub]->qtype]); $mform->addElement('static', 'sub_' . $sub . "_" . 'questiontext', get_string('questiondefinition', 'qtype_multianswer'), array('cols' => 60, 'rows' => 3)); if (isset($this->questiondisplay->options->questions[$sub]->questiontext)) { $mform->setDefault('sub_' . $sub . "_" . 'questiontext', $this->questiondisplay->options->questions[$sub]->questiontext); } $mform->addElement('static', 'sub_' . $sub . "_" . 'defaultgrade', get_string('defaultgrade', 'quiz')); $mform->setDefault('sub_' . $sub . "_" . 'defaultgrade', $this->questiondisplay->options->questions[$sub]->defaultgrade); if ($this->questiondisplay->options->questions[$sub]->qtype == 'shortanswer') { $mform->addElement('static', 'sub_' . $sub . "_" . 'usecase', get_string('casesensitive', 'quiz')); } if ($this->questiondisplay->options->questions[$sub]->qtype == 'multichoice') { $mform->addElement('static', 'sub_' . $sub . "_" . 'layout', get_string('layout', 'qtype_multianswer'), array('cols' => 60, 'rows' => 1)); //, $gradeoptions); } foreach ($this->questiondisplay->options->questions[$sub]->answer as $key => $ans) { $mform->addElement('static', 'sub_' . $sub . "_" . 'answer[' . $key . ']', get_string('answer', 'quiz'), array('cols' => 60, 'rows' => 1)); if ($this->questiondisplay->options->questions[$sub]->qtype == 'numerical' && $key == 0) { $mform->addElement('static', 'sub_' . $sub . "_" . 'tolerance[' . $key . ']', get_string('acceptederror', 'quiz')); //, $gradeoptions); } $mform->addElement('static', 'sub_' . $sub . "_" . 'fraction[' . $key . ']', get_string('grade')); //, $gradeoptions); $mform->addElement('static', 'sub_' . $sub . "_" . 'feedback[' . $key . ']', get_string('feedback', 'quiz')); } } }
/** * Prints the table of questions in a category with interactions * * @param object $course The course object * @param int $categoryid The id of the question category to be displayed * @param int $quizid The quiz id if we are in the context of a particular quiz, 0 otherwise * @param int $recurse This is 1 if subcategories should be included, 0 otherwise * @param int $page The number of the page to be displayed * @param int $perpage Number of questions to show per page * @param boolean $showhidden True if also hidden questions should be displayed * @param boolean $showquestiontext whether the text of each question should be shown in the list */ function question_list($course, $categoryid, $quizid = 0, $recurse = 1, $page = 0, $perpage = 100, $showhidden = false, $sortorder = 'qtype, name ASC', $showquestiontext = false) { global $USER, $CFG, $THEME; $qtypemenu = question_type_menu(); if ($rqp_types = get_records('question_rqp_types')) { foreach ($rqp_types as $type) { $qtypemenu['rqp_' . $type->id] = $type->name; } } $strcategory = get_string("category", "quiz"); $strquestion = get_string("question", "quiz"); $straddquestions = get_string("addquestions", "quiz"); $strimportquestions = get_string("importquestions", "quiz"); $strexportquestions = get_string("exportquestions", "quiz"); $strnoquestions = get_string("noquestions", "quiz"); $strselect = get_string("select", "quiz"); $strselectall = get_string("selectall", "quiz"); $strselectnone = get_string("selectnone", "quiz"); $strcreatenewquestion = get_string("createnewquestion", "quiz"); $strquestionname = get_string("questionname", "quiz"); $strdelete = get_string("delete"); $stredit = get_string("edit"); $straction = get_string("action"); $strrestore = get_string('restore'); $straddtoquiz = get_string("addtoquiz", "quiz"); $strtype = get_string("type", "quiz"); $strcreatemultiple = get_string("createmultiple", "quiz"); $strpreview = get_string("preview", "quiz"); if (!$categoryid) { echo "<p style=\"text-align:center;\"><b>"; print_string("selectcategoryabove", "quiz"); echo "</b></p>"; if ($quizid) { echo "<p>"; print_string("addingquestions", "quiz"); echo "</p>"; } 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)); $editingquiz = false; if ($quizid) { $cm = get_coursemodule_from_instance('quiz', $quizid); $editingquiz = has_capability('mod/quiz:manage', get_context_instance(CONTEXT_MODULE, $cm->id)); } echo '<div class="boxaligncenter">'; $formatoptions = new stdClass(); $formatoptions->noclean = true; echo format_text($category->info, FORMAT_MOODLE, $formatoptions, $course->id); echo '<table><tr>'; // check if editing questions in this category is allowed if ($canedit) { echo "<td valign=\"top\"><b>{$strcreatenewquestion}:</b></td>"; echo '<td valign="top" align="right">'; popup_form("{$CFG->wwwroot}/question/question.php?category={$category->id}&qtype=", $qtypemenu, "addquestion", "", "choose", "", "", false, "self"); echo '</td><td valign="top" align="right">'; helpbutton("questiontypes", $strcreatenewquestion, "quiz"); echo '</td>'; } else { echo '<td>'; print_string("publishedit", "quiz"); echo '</td>'; } echo '</tr></table>'; echo '</div>'; $categorylist = $recurse ? question_categorylist($category->id) : $category->id; // hide-feature $showhidden = $showhidden ? '' : " AND hidden = '0'"; if (!($totalnumber = count_records_select('question', "category IN ({$categorylist}) AND parent = '0' {$showhidden}"))) { echo "<p style=\"text-align:center;\">"; print_string("noquestions", "quiz"); echo "</p>"; return; } if (!($questions = get_records_select('question', "category IN ({$categorylist}) AND parent = '0' {$showhidden}", $sortorder, '*', $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}", $sortorder, '*', 0, $perpage))) { // There are no questions at all echo "<p style=\"text-align:center;\">"; print_string("noquestions", "quiz"); echo "</p>"; return; } } print_paging_bar($totalnumber, $page, $perpage, "edit.php?courseid={$course->id}&perpage={$perpage}&"); echo '<form method="post" action="edit.php?courseid=' . $course->id . '">'; echo '<fieldset class="invisiblefieldset" style="display: block;">'; echo '<input type="hidden" name="sesskey" value="' . $USER->sesskey . '" />'; echo '<table id="categoryquestions" style="width: 100%"><tr>'; echo "<th style=\"white-space:nowrap;\" class=\"header\" scope=\"col\">{$straction}</th>"; $sortoptions = array('name, qtype ASC' => get_string("sortalpha", "quiz"), 'qtype, name ASC' => get_string("sorttypealpha", "quiz"), 'id ASC' => get_string("sortage", "quiz")); $orderselect = choose_from_menu($sortoptions, 'sortorder', $sortorder, false, 'this.form.submit();', '0', true); $orderselect .= '<noscript><div><input type="submit" value="' . get_string("sortsubmit", "quiz") . '" /></div></noscript>'; echo "<th style=\"white-space:nowrap; text-align: left;\" class=\"header\" scope=\"col\">{$strquestionname} {$orderselect}</th>\n <th style=\"white-space:nowrap; text-align: right;\" class=\"header\" scope=\"col\">{$strtype}</th>"; echo "</tr>\n"; foreach ($questions as $question) { $nameclass = ''; $textclass = ''; if ($question->hidden) { $nameclass = 'dimmed_text'; $textclass = 'dimmed_text'; } if ($showquestiontext) { $nameclass .= ' header'; } if ($nameclass) { $nameclass = 'class="' . $nameclass . '"'; } if ($textclass) { $textclass = 'class="' . $textclass . '"'; } echo "<tr>\n<td style=\"white-space:nowrap;\" {$nameclass}>\n"; // add to quiz if ($editingquiz) { echo "<a title=\"{$straddtoquiz}\" href=\"edit.php?addquestion={$question->id}&quizid={$quizid}&sesskey={$USER->sesskey}\"><img\n src=\"{$CFG->pixpath}/t/moveleft.gif\" alt=\"{$straddtoquiz}\" /></a> "; } // preview link_to_popup_window('/question/preview.php?id=' . $question->id . '&quizid=' . $quizid, 'questionpreview', "<img src=\"{$CFG->pixpath}/t/preview.gif\" class=\"iconsmall\" alt=\"{$strpreview}\" />", 0, 0, $strpreview, QUESTION_PREVIEW_POPUP_OPTIONS); // edit, hide, delete question, using question capabilities, not quiz capabilieies if ($canedit) { echo "<a title=\"{$stredit}\" href=\"{$CFG->wwwroot}/question/question.php?id={$question->id}\"><img\n src=\"{$CFG->pixpath}/t/edit.gif\" alt=\"{$stredit}\" /></a> "; // hide-feature if ($question->hidden) { echo "<a title=\"{$strrestore}\" href=\"edit.php?courseid={$course->id}&unhide={$question->id}&sesskey={$USER->sesskey}\"><img\n src=\"{$CFG->pixpath}/t/restore.gif\" alt=\"{$strrestore}\" /></a>"; } else { echo "<a title=\"{$strdelete}\" href=\"edit.php?courseid={$course->id}&deleteselected={$question->id}&q{$question->id}=1\"><img\n src=\"{$CFG->pixpath}/t/delete.gif\" alt=\"{$strdelete}\" /></a>"; } } echo " <input title=\"{$strselect}\" type=\"checkbox\" name=\"q{$question->id}\" value=\"1\" />"; echo "</td>\n"; echo "<td {$nameclass}>" . format_string($question->name) . "</td>\n"; echo "<td {$nameclass} style='text-align: right'>\n"; print_question_icon($question); echo "</td>\n"; echo "</tr>\n"; if ($showquestiontext) { echo '<tr><td colspan="3" ' . $textclass . '>'; $formatoptions = new stdClass(); $formatoptions->noclean = true; $formatoptions->para = false; echo format_text($question->questiontext, $question->questiontextformat, $formatoptions, $course->id); echo "</td></tr>\n"; } } echo "</table>\n"; $paging = print_paging_bar($totalnumber, $page, $perpage, "edit.php?courseid={$course->id}&perpage={$perpage}&", 'page', false, true); if ($totalnumber > DEFAULT_QUESTIONS_PER_PAGE) { if ($perpage == DEFAULT_QUESTIONS_PER_PAGE) { $showall = '<a href="edit.php?courseid=' . $course->id . '&perpage=1000">' . get_string('showall', 'moodle', $totalnumber) . '</a>'; } else { $showall = '<a href="edit.php?courseid=' . $course->id . '&perpage=' . DEFAULT_QUESTIONS_PER_PAGE . '">' . get_string('showperpage', 'moodle', DEFAULT_QUESTIONS_PER_PAGE) . '</a>'; } if ($paging) { $paging = substr($paging, 0, strrpos($paging, '</div>')); $paging .= "<br />{$showall}</div>"; } else { $paging = "<div class='paging'>{$showall}</div>"; } } echo $paging; echo '<table class="quiz-edit-selected"><tr><td colspan="2">'; echo '<a href="javascript:select_all_in(\'TABLE\',null,\'categoryquestions\');">' . $strselectall . '</a> /' . ' <a href="javascript:deselect_all_in(\'TABLE\',null,\'categoryquestions\');">' . $strselectnone . '</a>' . '</td><td align="right"><b> ' . get_string('withselected', 'quiz') . ':</b></td></tr><tr><td>'; if ($editingquiz) { echo "<input type=\"submit\" name=\"add\" value=\"{$THEME->larrow} {$straddtoquiz}\" />\n"; echo '</td><td>'; } // print delete and move selected question if ($canedit) { echo '<input type="submit" name="deleteselected" value="' . $strdelete . "\" /></td><td>\n"; echo '<input type="submit" name="move" value="' . get_string('moveto', 'quiz') . "\" />\n"; question_category_select_menu($course->id, false, true, $category->id); } echo "</td></tr></table>"; // add random question if ($editingquiz) { for ($i = 1; $i <= min(10, $totalnumber); $i++) { $randomcount[$i] = $i; } for ($i = 20; $i <= min(100, $totalnumber); $i += 10) { $randomcount[$i] = $i; } echo '<br />'; print_string('addrandom', 'quiz', choose_from_menu($randomcount, 'randomcount', '1', '', '', '', true)); echo '<input type="hidden" name="recurse" value="' . $recurse . '" />'; echo "<input type=\"hidden\" name=\"categoryid\" value=\"{$category->id}\" />"; echo ' <input type="submit" name="addrandom" value="' . get_string('add') . '" />'; helpbutton('random', get_string('random', 'quiz'), 'quiz'); } echo '</fieldset>'; echo "</form>\n"; }
/** * Prints the table of questions in a category with interactions * * @param object $course The course object * @param int $categoryid The id of the question category to be displayed * @param int $cm The course module record if we are in the context of a particular module, 0 otherwise * @param int $recurse This is 1 if subcategories should be included, 0 otherwise * @param int $page The number of the page to be displayed * @param int $perpage Number of questions to show per page * @param boolean $showhidden True if also hidden questions should be displayed * @param boolean $showquestiontext whether the text of each question should be shown in the list */ function question_list($contexts, $pageurl, $categoryandcontext, $cm = null, $recurse = 1, $page = 0, $perpage = 100, $showhidden = false, $sortorder = 'typename', $sortorderdecoded = 'qtype, name ASC', $showquestiontext = false, $addcontexts = array()) { global $USER, $CFG, $THEME, $COURSE; $lastchangedid = optional_param('lastchanged', 0, PARAM_INT); list($categoryid, $contextid) = explode(',', $categoryandcontext); $qtypemenu = question_type_menu(); $strcategory = get_string("category", "quiz"); $strquestion = get_string("question", "quiz"); $straddquestions = get_string("addquestions", "quiz"); $strimportquestions = get_string("importquestions", "quiz"); $strexportquestions = get_string("exportquestions", "quiz"); $strnoquestions = get_string("noquestions", "quiz"); $strselect = get_string("select", "quiz"); $strselectall = get_string("selectall", "quiz"); $strselectnone = get_string("selectnone", "quiz"); $strcreatenewquestion = get_string("createnewquestion", "quiz"); $strquestionname = get_string("questionname", "quiz"); $strdelete = get_string("delete"); $stredit = get_string("edit"); $strmove = get_string('moveqtoanothercontext', 'question'); $strview = get_string("view"); $straction = get_string("action"); $strrestore = get_string('restore'); $strtype = get_string("type", "quiz"); $strcreatemultiple = get_string("createmultiple", "quiz"); $strpreview = get_string("preview", "quiz"); if (!$categoryid) { echo "<p style=\"text-align:center;\"><b>"; print_string("selectcategoryabove", "quiz"); echo "</b></p>"; return; } if (!($category = get_record('question_categories', 'id', $categoryid, 'contextid', $contextid))) { notify('Category not found!'); return; } $catcontext = get_context_instance_by_id($contextid); $canadd = has_capability('moodle/question:add', $catcontext); //check for capabilities on all questions in category, will also apply to sub cats. $caneditall = has_capability('moodle/question:editall', $catcontext); $canuseall = has_capability('moodle/question:useall', $catcontext); $canmoveall = has_capability('moodle/question:moveall', $catcontext); if ($cm and $cm->modname == 'quiz') { $quizid = $cm->instance; } else { $quizid = 0; } $returnurl = $pageurl->out(); $questionurl = new moodle_url("{$CFG->wwwroot}/question/question.php", array('returnurl' => $returnurl)); if ($cm !== null) { $questionurl->param('cmid', $cm->id); } else { $questionurl->param('courseid', $COURSE->id); } $questionmoveurl = new moodle_url("{$CFG->wwwroot}/question/contextmoveq.php", array('returnurl' => $returnurl)); if ($cm !== null) { $questionmoveurl->param('cmid', $cm->id); } else { $questionmoveurl->param('courseid', $COURSE->id); } echo '<div class="boxaligncenter">'; $formatoptions = new stdClass(); $formatoptions->noclean = true; echo format_text($category->info, FORMAT_MOODLE, $formatoptions, $COURSE->id); echo '<table><tr>'; if ($canadd) { echo '<td valign="top" align="right">'; popup_form($questionurl->out(false, array('category' => $category->id)) . '&qtype=', $qtypemenu, "addquestion", "", "choose", "", "", false, "self", "<strong>{$strcreatenewquestion}</strong>"); echo '</td><td valign="top" align="right">'; helpbutton("questiontypes", $strcreatenewquestion, "quiz"); echo '</td>'; } else { echo '<td>'; print_string('nopermissionadd', 'question'); echo '</td>'; } echo '</tr></table>'; echo '</div>'; $categorylist = $recurse ? question_categorylist($category->id) : $category->id; // hide-feature $showhidden = $showhidden ? '' : " AND hidden = '0'"; if (!($totalnumber = count_records_select('question', "category IN ({$categorylist}) AND parent = '0' {$showhidden}"))) { echo "<p style=\"text-align:center;\">"; print_string("noquestions", "quiz"); echo "</p>"; 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 "<p style=\"text-align:center;\">"; print_string("noquestions", "quiz"); echo "</p>"; return; } } print_paging_bar($totalnumber, $page, $perpage, $pageurl, 'qpage'); echo question_sort_options($pageurl, $sortorder); echo '<form method="post" action="edit.php">'; echo '<fieldset class="invisiblefieldset" style="display: block;">'; echo '<input type="hidden" name="sesskey" value="' . $USER->sesskey . '" />'; echo $pageurl->hidden_params_out(); echo '<table id="categoryquestions" style="width: 100%"><tr>'; echo "<th style=\"white-space:nowrap;\" class=\"header\" scope=\"col\">{$straction}</th>"; echo "<th style=\"white-space:nowrap; text-align: left;\" class=\"header\" scope=\"col\">{$strquestionname}</th>\n <th style=\"white-space:nowrap; text-align: right;\" class=\"header\" scope=\"col\">{$strtype}</th>"; echo "</tr>\n"; foreach ($questions as $question) { $nameclass = ''; $textclass = ''; if ($question->hidden) { $nameclass = 'dimmed_text'; $textclass = 'dimmed_text'; } if ($showquestiontext) { $nameclass .= ' header'; } if ($question->id == $lastchangedid) { $nameclass = 'highlight'; } if ($nameclass) { $nameclass = 'class="' . $nameclass . '"'; } if ($textclass) { $textclass = 'class="' . $textclass . '"'; } echo "<tr>\n<td style=\"white-space:nowrap;\" {$nameclass}>\n"; $canuseq = question_has_capability_on($question, 'use', $question->category); if (function_exists('module_specific_actions')) { echo module_specific_actions($pageurl, $question->id, $cm->id, $canuseq); } // preview if ($canuseq) { $quizorcourseid = $quizid ? '&quizid=' . $quizid : '&courseid=' . $COURSE->id; link_to_popup_window('/question/preview.php?id=' . $question->id . $quizorcourseid, 'questionpreview', "<img src=\"{$CFG->pixpath}/t/preview.gif\" class=\"iconsmall\" alt=\"{$strpreview}\" />", 0, 0, $strpreview, QUESTION_PREVIEW_POPUP_OPTIONS); } // edit, hide, delete question, using question capabilities, not quiz capabilieies if (question_has_capability_on($question, 'edit', $question->category) || question_has_capability_on($question, 'move', $question->category)) { echo "<a title=\"{$stredit}\" href=\"" . $questionurl->out(false, array('id' => $question->id)) . "\"><img\n src=\"{$CFG->pixpath}/t/edit.gif\" alt=\"{$stredit}\" /></a> "; } elseif (question_has_capability_on($question, 'view', $question->category)) { echo "<a title=\"{$strview}\" href=\"" . $questionurl->out(false, array('id' => $question->id)) . "\"><img\n src=\"{$CFG->pixpath}/i/info.gif\" alt=\"{$strview}\" /></a> "; } if (question_has_capability_on($question, 'move', $question->category) && question_has_capability_on($question, 'view', $question->category)) { echo "<a title=\"{$strmove}\" href=\"" . $questionurl->out(false, array('id' => $question->id, 'movecontext' => 1)) . "\"><img\n src=\"{$CFG->pixpath}/t/move.gif\" alt=\"{$strmove}\" /></a> "; } if (question_has_capability_on($question, 'edit', $question->category)) { // hide-feature if ($question->hidden) { echo "<a title=\"{$strrestore}\" href=\"edit.php?" . $pageurl->get_query_string() . "&unhide={$question->id}&sesskey={$USER->sesskey}\"><img\n src=\"{$CFG->pixpath}/t/restore.gif\" alt=\"{$strrestore}\" /></a>"; } else { echo "<a title=\"{$strdelete}\" href=\"edit.php?" . $pageurl->get_query_string() . "&deleteselected={$question->id}&q{$question->id}=1\"><img\n src=\"{$CFG->pixpath}/t/delete.gif\" alt=\"{$strdelete}\" /></a>"; } } if ($caneditall || $canmoveall || $canuseall) { echo " <input title=\"{$strselect}\" type=\"checkbox\" name=\"q{$question->id}\" value=\"1\" />"; } echo "</td>\n"; echo "<td {$nameclass}>" . format_string($question->name) . "</td>\n"; echo "<td {$nameclass} style='text-align: right'>\n"; print_question_icon($question); echo "</td>\n"; echo "</tr>\n"; if ($showquestiontext) { echo '<tr><td colspan="3" ' . $textclass . '>'; $formatoptions = new stdClass(); $formatoptions->noclean = true; $formatoptions->para = false; echo format_text($question->questiontext, $question->questiontextformat, $formatoptions, $COURSE->id); echo "</td></tr>\n"; } } echo "</table>\n"; $paging = print_paging_bar($totalnumber, $page, $perpage, $pageurl, 'qpage', false, true); if ($totalnumber > DEFAULT_QUESTIONS_PER_PAGE) { if ($perpage == DEFAULT_QUESTIONS_PER_PAGE) { $showall = '<a href="edit.php?' . $pageurl->get_query_string(array('qperpage' => 1000)) . '">' . get_string('showall', 'moodle', $totalnumber) . '</a>'; } else { $showall = '<a href="edit.php?' . $pageurl->get_query_string(array('qperpage' => DEFAULT_QUESTIONS_PER_PAGE)) . '">' . get_string('showperpage', 'moodle', DEFAULT_QUESTIONS_PER_PAGE) . '</a>'; } if ($paging) { $paging = substr($paging, 0, strrpos($paging, '</div>')); $paging .= "<br />{$showall}</div>"; } else { $paging = "<div class='paging'>{$showall}</div>"; } } echo $paging; if ($caneditall || $canmoveall || $canuseall) { echo '<a href="javascript:select_all_in(\'TABLE\',null,\'categoryquestions\');">' . $strselectall . '</a> /' . ' <a href="javascript:deselect_all_in(\'TABLE\',null,\'categoryquestions\');">' . $strselectnone . '</a>'; echo '<br />'; echo '<strong> ' . get_string('withselected', 'quiz') . ':</strong><br />'; if (function_exists('module_specific_buttons')) { echo module_specific_buttons($cm->id); } // print delete and move selected question if ($caneditall) { echo '<input type="submit" name="deleteselected" value="' . $strdelete . "\" />\n"; } if ($canmoveall && count($addcontexts)) { echo '<input type="submit" name="move" value="' . get_string('moveto', 'quiz') . "\" />\n"; question_category_select_menu($addcontexts, false, 0, "{$category->id},{$category->contextid}"); } if (function_exists('module_specific_controls') && $canuseall) { echo module_specific_controls($totalnumber, $recurse, $category, $cm->id); } } echo '</fieldset>'; echo "</form>\n"; }
public function generate_questions($courses, $modules) { global $DB, $CFG; if (!is_null($this->get('questions_per_course')) && count($courses) > 0 && is_array($courses)) { require_once $CFG->libdir . '/questionlib.php'; require_once $CFG->dirroot . '/mod/quiz/editlib.php'; $questions = array(); $questionsmenu = question_type_menu(); $questiontypes = array(); foreach ($questionsmenu as $qtype => $qname) { $questiontypes[] = $qtype; } // Add the questions foreach ($courses as $courseid) { $questions[$courseid] = array(); for ($i = 0; $i < $this->get('questions_per_course'); $i++) { $qtype = $questiontypes[array_rand($questiontypes)]; // Only the following types are supported right now. Hang around for more! $supported_types = array('match', 'essay', 'multianswer', 'multichoice', 'shortanswer', 'numerical', 'truefalse', 'calculated'); $qtype = $supported_types[array_rand($supported_types)]; if ($qtype == 'calculated') { continue; } $classname = "question_{$qtype}_qtype"; if ($qtype == 'multianswer') { $classname = "embedded_cloze_qtype"; } $question = new $classname(); $question->qtype = $qtype; $questions[$courseid][] = $question->generate_test("question{$qtype}-{$i}", $courseid); $this->verbose("Generated a question of type {$qtype} for course id {$courseid}."); } } // Assign questions to quizzes, if such exist if (!empty($modules['quiz']) && !empty($questions) && !is_null($this->get('questions_per_quiz'))) { $quizzes = $modules['quiz']; // Cannot assign more questions per quiz than are available, so determine which is the largest $questions_per_quiz = max(count($questions), $this->get('questions_per_quiz')); foreach ($quizzes as $quiz) { $questions_added = array(); for ($i = 0; $i < $questions_per_quiz; $i++) { // Add a random question to the quiz do { if (empty($quiz->course)) { print_object($quizzes); die; } $random = rand(0, count($questions[$quiz->course])); } while (in_array($random, $questions_added) || !array_key_exists($random, $questions[$quiz->course])); if (!quiz_add_quiz_question($questions[$quiz->course][$random]->id, $quiz)) { // Could not add question to quiz!! report error if (!$this->get('quiet')) { echo "WARNING: Could not add question id {$random} to quiz id {$quiz->id}{$this->eolchar}"; } } else { $this->verbose("Adding question id {$random} to quiz id {$quiz->id}."); $questions_added[] = $random; } } } } return $questions; } return null; }
function definition_inner(&$mform) { $mform->addElement('hidden', 'reload', 1); // $mform->addElement('hidden', 'generalfeedback',''); $mform->setType('reload', PARAM_INT); $question_type_names = question_type_menu(); // Remove meaningless defaultgrade field. $mform->removeElement('defaultgrade'); $this->confirm = optional_param('confirm', '0', PARAM_RAW); // Make questiontext a required field for this question type. $mform->addRule('questiontext', null, 'required', null, 'client'); // display the questions from questiontext; if ("" != optional_param('questiontext', '', PARAM_RAW)) { // echo "<p> optional_param('questiontext' <pre>";print_r(optional_param('questiontext','', PARAM_RAW));echo "</pre></p>"; $this->questiondisplay = fullclone(qtype_multianswer_extract_question(optional_param('questiontext', '', PARAM_RAW))); } else { if (!$this->reload && !empty($this->savedquestiondisplay->id)) { // use database data as this is first pass // question->id == 0 so no stored datasets $this->questiondisplay = fullclone($this->savedquestiondisplay); foreach ($this->questiondisplay->options->questions as $subquestion) { if (!empty($subquestion)) { $subquestion->answer = array(''); foreach ($subquestion->options->answers as $ans) { $subquestion->answer[] = $ans->answer; } // $subquestion->answer = fullclone($subquestion->options->answers); } } } else { $this->questiondisplay = ""; } } if (isset($this->savedquestiondisplay->options->questions) && is_array($this->savedquestiondisplay->options->questions)) { $countsavedsubquestions = 0; foreach ($this->savedquestiondisplay->options->questions as $subquestion) { if (!empty($subquestion)) { $countsavedsubquestions++; } } } else { $countsavedsubquestions = 0; } if ($this->reload) { if (isset($this->questiondisplay->options->questions) && is_array($this->questiondisplay->options->questions)) { $countsubquestions = 0; foreach ($this->questiondisplay->options->questions as $subquestion) { if (!empty($subquestion)) { $countsubquestions++; } } } else { $countsubquestions = 0; } } else { $countsubquestions = $countsavedsubquestions; } // echo "<p> count subquestion $countsubquestions <pre>";print_r($this->savedquestiondisplay);echo "</pre></p>"; // // echo "<p> saved question $countsubquestions <pre>";print_r($this->questiondisplay);echo "</pre></p>"; $mform->addElement('submit', 'analyzequestion', get_string('decodeverifyquestiontext', 'qtype_multianswer')); $mform->registerNoSubmitButton('analyzequestion'); if ($this->reload) { $mform->addElement('html', '<div class="ablock clearfix">'); $mform->addElement('html', '<div class=" clearfix">'); for ($sub = 1; $sub <= $countsubquestions; $sub++) { $this->editas[$sub] = 'unknown type'; if (isset($this->questiondisplay->options->questions[$sub]->qtype)) { $this->editas[$sub] = $this->questiondisplay->options->questions[$sub]->qtype; } else { if (optional_param('sub_' . $sub . "_" . 'qtype', '', PARAM_RAW) != '') { $this->editas[$sub] = optional_param('sub_' . $sub . "_" . 'qtype', '', PARAM_RAW); } } $storemess = ''; if (isset($this->savedquestiondisplay->options->questions[$sub]->qtype) && $this->savedquestiondisplay->options->questions[$sub]->qtype != $this->questiondisplay->options->questions[$sub]->qtype) { $this->qtype_change = true; $storemess = "<font class=\"error\"> STORED QTYPE " . $question_type_names[$this->savedquestiondisplay->options->questions[$sub]->qtype] . "</font >"; } $mform->addElement('header', 'subhdr' . $sub, get_string('questionno', 'quiz', '{#' . $sub . '}') . ' ' . $question_type_names[$this->questiondisplay->options->questions[$sub]->qtype] . $storemess); $mform->addElement('static', 'sub_' . $sub . "_" . 'questiontext', get_string('questiondefinition', 'qtype_multianswer'), array('cols' => 60, 'rows' => 3)); if (isset($this->questiondisplay->options->questions[$sub]->questiontext)) { $mform->setDefault('sub_' . $sub . "_" . 'questiontext', $this->questiondisplay->options->questions[$sub]->questiontext['text']); } $mform->addElement('static', 'sub_' . $sub . "_" . 'defaultgrade', get_string('defaultgrade', 'quiz')); $mform->setDefault('sub_' . $sub . "_" . 'defaultgrade', $this->questiondisplay->options->questions[$sub]->defaultgrade); if ($this->questiondisplay->options->questions[$sub]->qtype == 'shortanswer') { $mform->addElement('static', 'sub_' . $sub . "_" . 'usecase', get_string('casesensitive', 'quiz')); } if ($this->questiondisplay->options->questions[$sub]->qtype == 'multichoice') { $mform->addElement('static', 'sub_' . $sub . "_" . 'layout', get_string('layout', 'qtype_multianswer'), array('cols' => 60, 'rows' => 1)); //, $gradeoptions); } foreach ($this->questiondisplay->options->questions[$sub]->answer as $key => $ans) { $mform->addElement('static', 'sub_' . $sub . "_" . 'answer[' . $key . ']', get_string('answer', 'quiz'), array('cols' => 60, 'rows' => 1)); if ($this->questiondisplay->options->questions[$sub]->qtype == 'numerical' && $key == 0) { $mform->addElement('static', 'sub_' . $sub . "_" . 'tolerance[' . $key . ']', get_string('acceptederror', 'quiz')); //, $gradeoptions); } $mform->addElement('static', 'sub_' . $sub . "_" . 'fraction[' . $key . ']', get_string('grade')); //, $gradeoptions); $mform->addElement('static', 'sub_' . $sub . "_" . 'feedback[' . $key . ']', get_string('feedback', 'quiz')); } } $mform->addElement('html', '</div>'); $this->negative_diff = $countsavedsubquestions - $countsubquestions; if ($this->negative_diff > 0 || $this->qtype_change || $this->used_in_quiz && $this->negative_diff != 0) { $mform->addElement('header', 'additemhdr', get_string('warningquestionmodified', 'qtype_multianswer')); } if ($this->negative_diff > 0) { //$this->used_in_quiz $mform->addElement('static', 'alert1', "<strong>" . get_string('questiondeleted', 'qtype_multianswer') . "</strong>", get_string('questionsless', 'qtype_multianswer', $this->negative_diff)); } if ($this->qtype_change) { $mform->addElement('static', 'alert1', "<strong>" . get_string('questiontypechanged', 'qtype_multianswer') . "</strong>", get_string('questiontypechangedcomment', 'qtype_multianswer')); } $mform->addElement('html', '</div>'); } if ($this->used_in_quiz) { if ($this->negative_diff < 0) { $diff = $countsubquestions - $countsavedsubquestions; $mform->addElement('static', 'alert1', "<strong>" . get_string('questionsadded', 'qtype_multianswer') . "</strong>", "<strong>" . get_string('questionsmore', 'qtype_multianswer', $diff) . "</strong>"); } $a = new stdClass(); $a->nb_of_quiz = $this->nb_of_quiz; $a->nb_of_attempts = $this->nb_of_attempts; $mform->addElement('header', 'additemhdr2', get_string('questionusedinquiz', 'qtype_multianswer', $a)); $mform->addElement('static', 'alertas', get_string('youshouldnot', 'qtype_multianswer')); } if (($this->negative_diff > 0 || $this->used_in_quiz && ($this->negative_diff > 0 || $this->negative_diff < 0 || $this->qtype_change)) && $this->reload) { $mform->addElement('header', 'additemhdr', get_string('questionsaveasedited', 'qtype_multianswer')); $mform->addElement('checkbox', 'confirm', '', get_string('confirmquestionsaveasedited', 'qtype_multianswer')); $mform->setDefault('confirm', 0); } else { $mform->addElement('hidden', 'confirm', 0); } }
admin_externalpage_print_footer(); exit; } // End of process actions ================================================== /// Print the page heading. admin_externalpage_print_header(); print_heading(get_string('manageqtypes', 'admin')); /// Set up the table. $table = new flexible_table('qtypeadmintable'); $table->define_columns(array('questiontype', 'numquestions', 'version', 'requires', 'availableto', 'delete', 'settings')); $table->define_headers(array(get_string('questiontype', 'admin'), get_string('numquestions', 'admin'), get_string('version'), get_string('requires', 'admin'), get_string('availableq', 'question'), get_string('delete'), get_string('settings'))); $table->set_attribute('id', 'qtypes'); $table->set_attribute('class', 'generaltable generalbox boxaligncenter boxwidthwide'); $table->setup(); /// Add a row for each question type. $createabletypes = question_type_menu(); foreach ($sortedqtypes as $qtypename => $localname) { $qtype = $QTYPES[$qtypename]; $row = array(); // Question icon and name. $fakequestion = new stdClass(); $fakequestion->qtype = $qtypename; $icon = print_question_icon($fakequestion, true); $row[] = $icon . ' ' . $localname; // Number of questions of this type. if ($counts[$qtypename]->numquestions + $counts[$qtypename]->numhidden > 0) { if ($counts[$qtypename]->numhidden > 0) { $strcount = get_string('numquestionsandhidden', 'admin', $counts[$qtypename]); } else { $strcount = $counts[$qtypename]->numquestions; }
if (optional_param('addcancel', false, PARAM_BOOL)) { redirect($returnurl); } if ($id) { if (!($question = $DB->get_record('question', array('id' => $id)))) { print_error('questiondoesnotexist', 'question', $returnurl); } get_question_options($question, true); } else { if ($categoryid && $qtype) { // only for creating new questions $question = new stdClass(); $question->category = $categoryid; $question->qtype = $qtype; // Check that users are allowed to create this question type at the moment. $allowedtypes = question_type_menu(); if (!isset($allowedtypes[$qtype])) { print_error('cannotenable', 'question', $returnurl, $qtype); } } else { print_error('notenoughdatatoeditaquestion', 'question', $returnurl); } } // Validate the question category. if (!($category = $DB->get_record('question_categories', array('id' => $question->category)))) { print_error('categorydoesnotexist', 'question', $returnurl); } // Check permissions $question->formoptions = new stdClass(); $categorycontext = get_context_instance_by_id($category->contextid); $addpermission = has_capability('moodle/question:add', $categorycontext);
function definition_inner(&$mform) { $mform->addElement('hidden', 'reload', 1); $mform->setType('reload', PARAM_INT); $question_type_names = question_type_menu(); // Remove meaningless defaultgrade field. $mform->removeElement('defaultgrade'); $this->confirm = optional_param('confirm', '0', PARAM_RAW); // display the questions from questiontext; if ("" != optional_param('questiontext', '', PARAM_RAW)) { $this->questiondisplay = fullclone(qtype_multianswer_extract_question(optional_param('questiontext', '', PARAM_RAW))); } else { if (!$this->reload && !empty($this->savedquestiondisplay->id)) { // use database data as this is first pass // question->id == 0 so no stored datasets $this->questiondisplay = fullclone($this->savedquestiondisplay); foreach ($this->questiondisplay->options->questions as $subquestion) { if (!empty($subquestion)) { $subquestion->answer = array(''); foreach ($subquestion->options->answers as $ans) { $subquestion->answer[] = $ans->answer; } // $subquestion->answer = fullclone($subquestion->options->answers); } } } else { $this->questiondisplay = ""; } } if (isset($this->savedquestiondisplay->options->questions) && is_array($this->savedquestiondisplay->options->questions)) { $countsavedsubquestions = 0; foreach ($this->savedquestiondisplay->options->questions as $subquestion) { if (!empty($subquestion)) { $countsavedsubquestions++; } } } else { $countsavedsubquestions = 0; } if ($this->reload) { if (isset($this->questiondisplay->options->questions) && is_array($this->questiondisplay->options->questions)) { $countsubquestions = 0; foreach ($this->questiondisplay->options->questions as $subquestion) { if (!empty($subquestion)) { $countsubquestions++; } } } else { $countsubquestions = 0; } } else { $countsubquestions = $countsavedsubquestions; } // echo "<p> saved question $countsavedsubquestions <pre>";print_r($this->savedquestiondisplay);echo "</pre></p>"; // echo "<p> saved question $countsubquestions <pre>";print_r($this->questiondisplay);echo "</pre></p>"; $mform->insertElementBefore($mform->createElement('static', 'generator', 'Code Generator', "<a href=\"type/multianswer/cloze_generator.html\" onclick=\"this.target='questionpreview'; return openpopup('/question/type/multianswer/cloze_generator.html', 'questionpreview', 'scrollbars=yes,resizable=yes,width=800,height=540', 0);\" >Cloze code question generator</a>"), "questiontextformat"); $mform->addElement('submit', 'analyzequestion', get_string('decodeverifyquestiontext', 'qtype_multianswer')); $mform->registerNoSubmitButton('analyzequestion'); echo '<div class="ablock clearfix">'; echo '<div class=" clearfix">'; if ($this->reload) { for ($sub = 1; $sub <= $countsubquestions; $sub++) { $this->editas[$sub] = 'unknown type'; if (isset($this->questiondisplay->options->questions[$sub]->qtype)) { $this->editas[$sub] = $this->questiondisplay->options->questions[$sub]->qtype; } else { if (optional_param('sub_' . $sub . "_" . 'qtype', '', PARAM_RAW) != '') { $this->editas[$sub] = optional_param('sub_' . $sub . "_" . 'qtype', '', PARAM_RAW); } } $storemess = ''; if (isset($this->savedquestiondisplay->options->questions[$sub]->qtype) && $this->savedquestiondisplay->options->questions[$sub]->qtype != $this->questiondisplay->options->questions[$sub]->qtype) { $this->type_change = true; $storemess = "<font class=\"error\"> STORED QTYPE " . $question_type_names[$this->savedquestiondisplay->options->questions[$sub]->qtype] . "</font >"; } $mform->addElement('header', 'subhdr' . $sub, get_string('questionno', 'quiz', '{#' . $sub . '}') . ' ' . $question_type_names[$this->questiondisplay->options->questions[$sub]->qtype] . $storemess); $mform->addElement('static', 'sub_' . $sub . "_" . 'questiontext', get_string('questiondefinition', 'qtype_multianswer'), array('cols' => 60, 'rows' => 3)); if (isset($this->questiondisplay->options->questions[$sub]->questiontext)) { $mform->setDefault('sub_' . $sub . "_" . 'questiontext', $this->questiondisplay->options->questions[$sub]->questiontext); } $mform->addElement('static', 'sub_' . $sub . "_" . 'defaultgrade', get_string('defaultgrade', 'quiz')); $mform->setDefault('sub_' . $sub . "_" . 'defaultgrade', $this->questiondisplay->options->questions[$sub]->defaultgrade); if ($this->questiondisplay->options->questions[$sub]->qtype == 'shortanswer') { $mform->addElement('static', 'sub_' . $sub . "_" . 'usecase', get_string('casesensitive', 'quiz')); } if ($this->questiondisplay->options->questions[$sub]->qtype == 'multichoice') { $mform->addElement('static', 'sub_' . $sub . "_" . 'layout', get_string('layout', 'qtype_multianswer'), array('cols' => 60, 'rows' => 1)); //, $gradeoptions); } foreach ($this->questiondisplay->options->questions[$sub]->answer as $key => $ans) { $mform->addElement('static', 'sub_' . $sub . "_" . 'answer[' . $key . ']', get_string('answer', 'quiz'), array('cols' => 60, 'rows' => 1)); if ($this->questiondisplay->options->questions[$sub]->qtype == 'numerical' && $key == 0) { $mform->addElement('static', 'sub_' . $sub . "_" . 'tolerance[' . $key . ']', get_string('acceptederror', 'quiz')); //, $gradeoptions); } $mform->addElement('static', 'sub_' . $sub . "_" . 'fraction[' . $key . ']', get_string('grade')); //, $gradeoptions); $mform->addElement('static', 'sub_' . $sub . "_" . 'feedback[' . $key . ']', get_string('feedback', 'quiz')); } } echo '</div>'; $this->negative_diff = $countsavedsubquestions - $countsubquestions; if ($this->negative_diff > 0 || $this->type_change || $this->used_in_quiz && $this->negative_diff != 0) { $mform->addElement('header', 'additemhdr', "WARNING"); } if ($this->negative_diff > 0) { //$this->used_in_quiz $mform->addElement('static', 'alert1', "<strong>" . "Question deleted" . "</strong>", "<strong>" . $this->negative_diff . get_string(' questions less than in the multtianswer question stored in the database', 'qtype_multianswer') . "</strong>"); //$countsubquestions."-".$countsavedsubquestions } if ($this->type_change) { $mform->addElement('static', 'alert1', "<strong>" . "Question type change " . "</strong>", "<strong>" . get_string(' at least one question type has been changed. Did you add,delete or move a question ? Look ahead ', 'qtype_multianswer') . "</strong>"); //$countsubquestions."-".$countsavedsubquestions } echo '</div>'; } if ($this->used_in_quiz) { if ($this->negative_diff < 0) { $diff = $countsubquestions - $countsavedsubquestions; $mform->addElement('static', 'alert1', "<strong>" . "Question added " . "</strong>", "<strong>" . $diff . get_string(' questions more than in the multtianswer question stored in the database', 'qtype_multianswer') . "</strong>"); //$countsubquestions."-".$countsavedsubquestions } $mform->addElement('header', 'additemhdr2', "This question is used in {$this->nb_of_quiz} quiz(s), total attempt(s) : {$this->nb_of_attempts} "); $mform->addElement('static', 'alertas', "<strong>" . "YOU SHOULD NOT " . "</strong>"); //$countsubquestions."-".$countsavedsubquestions } if (($this->negative_diff > 0 || $this->used_in_quiz && ($this->negative_diff > 0 || $this->negative_diff < 0 || $this->type_change)) && $this->reload) { $mform->addElement('header', 'additemhdr', get_string('The question will be saved as edited', 'qtype_calculatedsimple')); $mform->addElement('checkbox', 'confirm', '', get_string('I confirm that I want the question be saved as edited', 'qtype_calculatedsimple')); $mform->setDefault('confirm', 0); } else { $mform->addElement('hidden', 'confirm', 0); } }
function include_help_for_each_qtype() { global $CFG; require_once $CFG->libdir . '/questionlib.php'; global $QTYPES; $types = question_type_menu(); $fakeqtypes = array(); foreach ($types as $qtype => $localizedname) { if ($QTYPES[$qtype]->is_real_question_type()) { include_help_for_qtype($qtype, $localizedname); } else { $fakeqtypes[$qtype] = $localizedname; } } foreach ($fakeqtypes as $qtype => $localizedname) { include_help_for_qtype($qtype, $localizedname); } }
function validation($data) { $errors = array(); if (!isset($data['allowed'])) { $errors['allowed'] = get_string('needtoallowatleastoneqtype', 'qcreate'); } $qtypemenu = question_type_menu(); $totalrequired = 0; if (isset($data['qtype'])) { foreach ($data['qtype'] as $key => $qtype) { if ($qtype != '') { $chkqtypes[$key] = $qtype; $keysforthisqtype = array_keys($chkqtypes); if (count(array_keys($data['qtype'], $qtype)) > 1) { $errors["qtype[{$key}]"] = get_string('morethanonemin', 'qcreate', $qtypemenu[$qtype]); } elseif (!isset($data['allowed'][$qtype]) && !isset($data['allowed']['ALL'])) { $errors['allowed'] = get_string('needtoallowqtype', 'qcreate', $qtypemenu[$qtype]); $errors["qtype[{$key}]"] = get_string('needtoallowqtype', 'qcreate', $qtypemenu[$qtype]); } $totalrequired += $data['minimumquestions'][$key]; } } } if ($totalrequired > $data['totalrequired']) { $errors['totalrequired'] = get_string('totalrequiredislessthansumoftotalsforeachqtype', 'qcreate'); } if (isset($data['allowed']['ALL']) && count($data['allowed']) > 1) { $errors['allowed'] = get_string('allandother', 'qcreate'); } if ($data['timeclose'] != 0 && $data['timeopen'] != 0 && $data['timeclose'] <= $data['timeopen']) { $errors['timeopen'] = get_string('openmustbemorethanclose', 'qcreate'); } return $errors; }
function qcreate_proper_grammar($arrayitems) { $qtypemenu = question_type_menu(); $grammarised = array(); foreach ($arrayitems as $key => $arrayitem) { if ($arrayitem->no > 1) { $arrayitem->qtypestring = $qtypemenu[$arrayitem->qtype]; $grammarised[$key] = get_string('requiredplural', 'qcreate', $arrayitem); } else { $arrayitem->qtypestring = $qtypemenu[$arrayitem->qtype]; $grammarised[$key] = get_string('requiredsingular', 'qcreate', $arrayitem); } } return $grammarised; }
echo '<label for="id_showneedsregrade">' . get_string('showneedsregrade', 'qcreate') . '</label>'; $checked = $showungraded ? ' checked="checked"' : ''; echo '<input onchange="getElementById(\'showoptions\').submit(); return true;" type="checkbox" value="1" name="showungraded" id="id_showungraded"' . $checked . '/>'; echo '<label for="id_showungraded">' . get_string('showungraded', 'qcreate') . '</label>'; echo '<noscript>'; echo '<input type="submit" name="go" value="' . get_string('go') . '" />'; echo '</noscript>'; echo '</div></form>'; } $table->pagesize($perpage, $answercount); if ($answercount && false !== ($answers = get_records_sql($select . $sql . $sort, $table->get_page_start(), $table->get_page_size()))) { $strupdate = get_string('update'); $strgrade = get_string('grade'); $grademenu = make_grades_menu($qcreate->grade); $grading_info = grade_get_grades($COURSE->id, 'mod', 'qcreate', $qcreate->id, $users); $qtypemenu = question_type_menu(); foreach ($answers as $answer) { $final_grade = $grading_info->items[0]->grades[$answer->id]; /// Calculate user status $answer->needsregrading = $answer->timemarked <= $answer->timemodified; $picture = print_user_picture($answer->id, $COURSE->id, $answer->picture, false, true); if (empty($answer->gradeid)) { $answer->grade = -1; //no grade yet } if ($grading_interface && !$answer->needsregrading && $answer->timemarked != 0) { $highlight = true; } else { $highlight = false; } $colquestion = $answer->qname;
/** * Print a form to let the user choose which question type to add. * When the form is submitted, it goes to the question.php script. * @param $hiddenparams hidden parameters to add to the form, in addition to * the qtype radio buttons. */ function print_choose_qtype_to_add_form($hiddenparams) { global $CFG, $QTYPES, $PAGE, $OUTPUT; $PAGE->requires->js('/question/qbank.js'); echo '<div id="chooseqtypehead" class="hd">' . "\n"; echo $OUTPUT->heading(get_string('chooseqtypetoadd', 'question'), 3); echo "</div>\n"; echo '<div id="chooseqtype">' . "\n"; echo '<form action="' . $CFG->wwwroot . '/question/question.php" method="get"><div id="qtypeformdiv">' . "\n"; foreach ($hiddenparams as $name => $value) { echo '<input type="hidden" name="' . s($name) . '" value="' . s($value) . '" />' . "\n"; } echo "</div>\n"; echo '<div class="qtypes">' . "\n"; echo '<div class="instruction">' . get_string('selectaqtypefordescription', 'question') . "</div>\n"; echo '<div class="realqtypes">' . "\n"; $types = question_type_menu(); $fakeqtypes = array(); foreach ($types as $qtype => $localizedname) { if ($QTYPES[$qtype]->is_real_question_type()) { print_qtype_to_add_option($qtype, $localizedname); } else { $fakeqtypes[$qtype] = $localizedname; } } echo "</div>\n"; echo '<div class="fakeqtypes">' . "\n"; foreach ($fakeqtypes as $qtype => $localizedname) { print_qtype_to_add_option($qtype, $localizedname); } echo "</div>\n"; echo "</div>\n"; echo '<div class="submitbuttons">' . "\n"; echo '<input type="submit" value="' . get_string('next') . '" id="chooseqtype_submit" />' . "\n"; echo '<input type="submit" id="chooseqtypecancel" name="addcancel" value="' . get_string('cancel') . '" />' . "\n"; echo "</div></form>\n"; echo "</div>\n"; $PAGE->requires->js_function_call('qtype_chooser.init', array('chooseqtype')); }
} } } } if (!$settings['quiet']) { echo "Successfully generated " . $settings['number-of-modules'] * $settings['number-of-sections'] . " modules in each course!{$settings['eolchar']}"; } } /** * QUESTIONS GENERATION */ if (!empty($settings['questions-per-course'])) { require_once $CFG->libdir . '/questionlib.php'; require_once $CFG->dirroot . '/mod/quiz/editlib.php'; $questions = array(); $questionsmenu = question_type_menu(); $questiontypes = array(); foreach ($questionsmenu as $qtype => $qname) { $questiontypes[] = $qtype; } // Add the questions foreach ($courses as $courseid) { $questions[$courseid] = array(); for ($i = 0; $i < $settings['questions-per-course']; $i++) { $qtype = $questiontypes[array_rand($questiontypes)]; // Only the following types are supported right now. Hang around for more! $supported_types = array('match', 'essay', 'multianswer', 'multichoice', 'shortanswer', 'numerical', 'truefalse', 'calculated'); $qtype = $supported_types[array_rand($supported_types)]; if ($qtype == 'calculated') { continue; }