quiz editing / question bank: MDL-18355 Convert the add question drop-down to be a button that pops up a YUI dialogue.

That allows us to have a few sentences explanation of each question type, and is also easier to fit into a tight layout.

This commit should also fix MDL-18214 Layout screwed in Safari with long category names.
This commit is contained in:
tjhunt
2009-02-25 07:14:03 +00:00
parent b59da3a22a
commit cd120b2344
23 changed files with 489 additions and 138 deletions
+4
View File
@@ -1,10 +1,14 @@
<?php
$string['addingcalculated'] = 'Adding a Calculated question';
$string['addmoreanswerblanks'] = 'Add another answer blank.';
$string['addmoreunitblanks'] = 'Blanks for $a More Units';
$string['answerhdr'] = 'Answer';
$string['atleastoneanswer'] = 'You need to provide at least one answer.';
$string['calculated'] = 'Calculated';
$string['calculatedsummary'] = 'Calculated questions are like numerical questions but with the numbers used selected randomly from a set when the quiz is taken.';
$string['correctanswershows'] = 'Correct answer shows';
$string['correctanswershowsformat'] = 'Format';
$string['editingcalculated'] = 'Editing a Calculated question';
$string['existingcategory1'] = 'will use an already existing shared dataset';
$string['keptcategory1'] = 'will use the same existing shared dataset as before';
$string['keptlocal1'] = 'will use the same existing private dataset as before';
+6
View File
@@ -0,0 +1,6 @@
<?php
$string['addingdescription'] = 'Adding a Description';
$string['editingdescription'] = 'Editing a Description';
$string['description'] = 'Description';
$string['descriptionsummary'] = 'This is not actually a question. Instead it is a way to add some instructions, rubric or other content to the quiz. This is similar to the way that Labels can be used to add content to the course page.';
?>
+6
View File
@@ -0,0 +1,6 @@
<?php
$string['addingessay'] = 'Adding an Essay question';
$string['editingessay'] = 'Editing a Essay question';
$string['essay'] = 'Essay';
$string['essaysummary'] = 'Allows a response of a few sentences or paragraphs. This must then be graded manually.';
?>
+4
View File
@@ -1,6 +1,10 @@
<?php
$string['addingmatch'] = 'Adding a Matching question';
$string['addmoreqblanks'] = '{no} More Sets of Blanks';
$string['editingmatch'] = 'Editing a Matching question';
$string['filloutthreeqsandtwoas'] = 'You must provide at least two questions and three answers. You can provide extra wrong answers by giving an answer with a blank question. Entries where both the question and the answer are blank will be ignored.';
$string['match'] = 'Matching';
$string['matchsummary'] = 'The answer to each of a number of sub-question must be selected from a list of possibilities.';
$string['nomatchinganswerforq'] = 'You must specify an answer for this question.';
$string['notenoughquestions'] = 'You must supply at least $a question and answer pairs.';
$string['notenoughqsandas'] = 'You must supply at least $a->q questions and $a->a answers.';
+2 -1
View File
@@ -1,5 +1,6 @@
<?php // $Id: qtype_missingtype.php,v 1.1 2008-09-09 08:43:39 tjhunt Exp $
<?php // $Id$
$string['missingtype'] = 'Missing type';
$string['editingmissingtype'] = 'Editing a question of an unknown type';
$string['warningmissingtype'] = '<b>This question is of a type that has not been installed on your Moodle yet.<br />Please alert your Moodle administrator.</b>';
?>
+3 -2
View File
@@ -1,15 +1,16 @@
<?php
$string['addingmultianswer'] = 'Adding an Embedded answers (Cloze)';
$string['addingmultianswer'] = 'Adding an Embedded answers (Cloze) question';
$string['correctanswer'] = 'Correct Answer';
$string['correctanswerandfeedback'] = 'Correct Answer and Feedback';
$string['decodeverifyquestiontext'] = 'Decode and Verify the Question Text';
$string['editingmultianswer'] = 'Editing an Embedded answers (Cloze)';
$string['editingmultianswer'] = 'Editing an Embedded answers (Cloze) question';
$string['layout'] = 'Layout';
$string['layoutselectinline'] = 'Dropdown menu in-line in the text';
$string['layouthorizontal'] = 'Horizontal row of radio-buttons';
$string['layoutundefined'] = 'Undefined layout';
$string['layoutvertical'] = 'Vertical column of radio buttons';
$string['multianswer'] = 'Embedded answers (Cloze)';
$string['multianswersummary'] = 'Questions of this type are very flexible, but can only be created by entering text containing special codes that create embedded multiple choice, short answers and numerical questions.';
$string['nooptionsforsubquestion'] = 'Unable to get options for question part # $a->sub (question->id={$a->id})';
$string['noquestions'] = 'The Cloze(multianswer) question \"<strong>$a</strong>\" does not contain any question ';
$string['qtypenotrecognized'] = 'questiontype $a not recognized';
+1
View File
@@ -24,6 +24,7 @@ $string['fractionsaddwrong'] = 'The positive grades you have chosen do not add u
$string['fractionsnomax'] = 'One of the choices should be 100%%, so that it is<br />possible to get a full grade for this question.<br />Do you want to go back and fix this question?';
$string['incorrectfeedback'] = 'For any incorrect response';
$string['multichoice'] = 'Multiple choice';
$string['multichoicesummary'] = 'Allows the selection of a single or multiple responses from a pre-defined list.';
$string['notenoughanswers'] = 'This type of question requires at least $a choices';
$string['overallfeedback'] = 'Overall Feedback';
$string['overallcorrectfeedback'] = 'Feedback for any correct response';
+4
View File
@@ -1,10 +1,14 @@
<?php
$string['addingnumerical'] = 'Adding a Numerical question';
$string['addmoreanswerblanks'] = 'Blanks for {no} More Answers';
$string['addmoreunitblanks'] = 'Blanks for {no} More Units';
$string['answerno'] = 'Answer $a';
$string['answermustbenumberorstar'] = 'The answer must be a number, or \'*\'.';
$string['editingnumerical'] = 'Editing a Numerical question';
$string['errorrepeatedunit'] = 'You cannot have two units with the same name.';
$string['errornomultiplier'] = 'You must specify a multiplier for this unit.';
$string['notenoughanswers'] = 'You must enter at least one answer.';
$string['numerical'] = 'Numerical';
$string['numericalsummary'] = 'Allows a numerical response, possibly with units, that is graded by comparing against various model answers, possibly with tolerances.';
$string['unithdr'] = 'Unit $a';
?>
+2
View File
@@ -1,5 +1,7 @@
<?php
$string['configselectmanualquestions'] = 'Can the random question type select a manually graded question when it is making its random choice of a question from a category?';
$string['editingrandom'] = 'Editing a Random question';
$string['random'] = 'Random';
$string['randomqname'] = 'Random ($a)';
$string['randomqplusname'] = 'Random ($a and sub-categories)';
$string['selectmanualquestions'] = 'Random questions can use manually graded questions';
+1
View File
@@ -4,4 +4,5 @@ $string['editingrandomsamatch'] = 'Editing a Random short-answer matching questi
$string['nosaincategory'] = 'There are no short answer questions in the category that you chose \'$a->catname\'. Choose a different category, make some questions in this category.';
$string['notenoughsaincategory'] = 'There is/are only $a->nosaquestions short answer questions in the category that you chose \'$a->catname\'. Choose a different category, make some more questions in this category or reduce the amount of questions you\'ve selected.';
$string['randomsamatch'] = 'Random short-answer matching';
$string['randomsamatchsummary'] = 'Like a Matching question, but created randomly from the shortanswer questions in a particular category.';
?>
+1
View File
@@ -6,4 +6,5 @@ $string['answerno'] = 'Answer $a';
$string['editingshortanswer'] = 'Editing a Short answer question';
$string['filloutoneanswer'] = 'You must provide at least one possible answer. Answers left blank will not be used. \'*\' can be used as a wildcard to match any characters. The first matching answer will be used to determine the score and feedback.';
$string['shortanswer'] = 'Short answer';
$string['shortanswersummary'] = 'Allows a response of one or a few words that is graded by comparing against various model answers, which may contain wildcards.';
?>
+1
View File
@@ -9,5 +9,6 @@ $string['feedbackfalse'] = 'Feedback for the response \'False\'.';
$string['feedbacktrue'] = 'Feedback for the response \'True\'.';
$string['true'] = 'True';
$string['truefalse'] = 'True/False';
$string['truefalsesummary'] = 'A simple form of multiple choice question with just the two choices \'True\' and \'False\'.';
?>
+3
View File
@@ -49,6 +49,7 @@ $string['changepublishstatuscat'] = '<a href=\"$a->caturl\">Category \"$a->name\
$string['chooseqtypetoadd'] = 'Choose a question type to add';
$string['clicktoflag'] = 'Click to flag this question';
$string['clicktounflag'] = 'Click to un-flag this question';
$string['createnewquestion'] = 'Create a new question ...';
$string['cwrqpfs'] = 'Random questions selecting questions from sub categories.';
$string['cwrqpfsinfo'] = '<p>During the upgrade to Moodle 1.9 we will separate question categories into
different contexts. Some question categories and questions on your site will have to have their sharing
@@ -161,6 +162,8 @@ $string['questionsrescuedfrominfo'] = 'These questions (some of which may be hid
$string['questiontype'] = 'Question type';
$string['questionuse'] = 'Use question in this activity';
$string['saveflags'] = 'Save the state of the flags';
$string['selectacategory'] = 'Select a category:';
$string['selectaqtypefordescription'] = 'Select a question type to see its description.';
$string['selectquestionsforbulk'] = 'Select questions for bulk actions';
$string['shareincontext'] = 'Share in context for $a';
$string['tofilecategory'] = 'Write category to file';
+3
View File
@@ -9,6 +9,7 @@ $string['acceptederror'] = 'Accepted error';
$string['accessnoticesheader'] = 'You can preview this quiz, but if this were a real attempt, you would be blocked because:';
$string['action'] = 'Action';
$string['adaptive'] = 'Adaptive mode';
$string['addaquestion'] = 'Add a question ...';
$string['addcategory'] = 'Add category';
$string['adddescriptionlabel'] = 'Add description/label';
$string['addingcalculated'] = 'Adding a Calculated question';
@@ -36,6 +37,7 @@ $string['addrandom1'] = '<< Add';
$string['addrandom2'] = 'random questions';
$string['addrandomfromcategory'] = 'Add random questions from category:';
$string['addrandomquestion'] = 'Add random question';
$string['addarandomquestion'] = 'Add a random question ...';
$string['addrandomquestiontoquiz'] = 'Add random question to quiz $a';
$string['addselectedtoquiz'] = 'Add selected to quiz';
$string['addtoquiz'] = 'Add to quiz';
@@ -186,6 +188,7 @@ $string['createcategoryfornewrandomquestion'] = 'Create a question category for
$string['createfirst'] = 'You must create some short-answer questions first.';
$string['createmultiple'] = 'Add several random questions to quiz';
$string['createnewquestion'] = 'Create new question';
$string['createquestionandadd'] = 'Create a new question and add it to the quiz.';
$string['custom'] = 'Custom format';
$string['dataitemneed'] = 'You need to add at least one set of data items to get a valid question';
$string['datasetdefinitions'] = 'Reusable dataset definitions for category $a';
+18 -47
View File
@@ -555,57 +555,30 @@ function quiz_print_question_list($quiz, $pageurl, $allowdelete=true,
*/
function quiz_print_pagecontrols($quiz,$pageurl,$page, $hasattempts){
global $CFG;
$strcreatenewquestion=get_string("createnewquestion",'quiz');
$strselectquestiontype=get_string("selectquestiontype",'quiz');
echo '<div class="pagecontrols">';
// get the current context
// Get the current context
$thiscontext = get_context_instance(CONTEXT_COURSE, $quiz->course);
$contexts = new question_edit_contexts($thiscontext);
// get default category and turn its infor into a string that works in an url
// Get the default category.
$defaultcategory = question_make_default_categories($contexts->all());
$categorystring = "$defaultcategory->id,$defaultcategory->contextid";
//create the url the question page will return to
$returnurl_addtoquiz=new moodle_url($pageurl->out(true),
array("addonpage"=>$page));
//create the url of the new question page to forward to. return url is given
//as a parameter and automatically urlencoded.
// Create the url the question page will return to
$returnurl_addtoquiz = new moodle_url($pageurl->out(true), array("addonpage" => $page));
// Print a button linking to the choose question type page.
$newquestionparams = array('returnurl' => $returnurl_addtoquiz->out(false),
'cmid'=>$quiz->cmid, "appendqnumstring"=>"addquestion", "category"=>$categorystring);
$newquestionurl_object = new moodle_url("$CFG->wwwroot/question/question.php",
$newquestionparams);
$newquestionurl=$newquestionurl_object->out(false);
echo get_string("addquestion","quiz").": ";
'cmid' => $quiz->cmid, 'appendqnumstring' => 'addquestion');
create_new_question_button($defaultcategory->id, $newquestionparams, get_string('addaquestion', 'quiz'),
get_string('createquestionandadd', 'quiz'), $hasattempts);
if ($hasattempts) {
$disabled = 'disabled="disabled"';
} else {
$disabled = '';
}
popup_form ($newquestionurl.'&amp;qtype=',
question_type_menu(),
"addquestion_$page",
"",
$strselectquestiontype,
"",
"",
false,
"self",
"",
null,
$strcreatenewquestion, $hasattempts);
helpbutton("questiontypes", $strcreatenewquestion, "quiz");
echo '<div class="adddescription">';
print_single_button($CFG->wwwroot."/question/question.php",
array("cmid"=>$quiz->cmid,
"courseid"=>$quiz->course,
"returnurl"=>$returnurl_addtoquiz->out(false),
"appendqnumstring"=>"addquestion",
"category"=>$categorystring,
"qtype"=>"description"),
get_string("adddescriptionlabel","quiz"),'get', '_self', false, '',
$hasattempts);
echo "\n</div>";
?>
<div class="addrandomquestion">
<div class="singlebutton">
<form class="randomquestionform" action="<?php echo $CFG->wwwroot; ?>/mod/quiz/addrandom.php" method="get">
<div>
@@ -613,14 +586,12 @@ function quiz_print_pagecontrols($quiz,$pageurl,$page, $hasattempts){
<input type="hidden" name="cmid" value="<?php echo $quiz->cmid; ?>" />
<input type="hidden" name="courseid" value="<?php echo $quiz->course; ?>" />
<input type="hidden" name="returnurl" value="<?php echo urlencode($pageurl->out(true)); ?>" />
<input type="submit" id="addrandomdialoglaunch_<?php echo $page; ?>" value="<?php echo get_string("addrandomquestion","quiz"); ?>" <?php echo " $disabled"; ?> />
<!--<a href="#" id="addrandomdialoglaunch_<?php echo $page; ?>">laa</a>-->
<?php helpbutton('random', get_string('random', 'quiz'), 'quiz', true, false, '');
?>
<input type="submit" id="addrandomdialoglaunch_<?php echo $page; ?>" value="<?php echo get_string('addarandomquestion','quiz'); ?>" <?php echo " $disabled"; ?> />
<!--<a href="#" id="addrandomdialoglaunch_<?php echo $page; ?>">laa</a>-->
</div>
</form>
</div>
</div>
<?php helpbutton('random', get_string('random', 'quiz'), 'quiz', true, false, ''); ?>
<?php
echo "\n</div>";
}
@@ -976,8 +947,8 @@ class question_bank_question_name_text_column extends question_bank_question_nam
class quiz_question_bank_view extends question_bank_view {
protected $quizhasattempts = false;
protected function know_field_types() {
$types = parent::know_field_types();
protected function known_field_types() {
$types = parent::known_field_types();
$types[] = new question_bank_add_to_quiz_action_column($this);
$types[] = new question_bank_question_name_text_column($this);
return $types;
+106
View File
@@ -0,0 +1,106 @@
<?php // $Id$
///////////////////////////////////////////////////////////////////////////
// //
// NOTICE OF COPYRIGHT //
// //
// Moodle - Modular Object-Oriented Dynamic Learning Environment //
// http://moodle.org //
// //
// Copyright (C) 1999 onwards Martin Dougiamas http://dougiamas.com //
// //
// This program is free software; you can redistribute it and/or modify //
// it under the terms of the GNU General Public License as published by //
// the Free Software Foundation; either version 2 of the License, or //
// (at your option) any later version. //
// //
// This program is distributed in the hope that it will be useful, //
// but WITHOUT ANY WARRANTY; without even the implied warranty of //
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the //
// GNU General Public License for more details: //
// //
// http://www.gnu.org/copyleft/gpl.html //
// //
///////////////////////////////////////////////////////////////////////////
/**
* Shows a screen where the user can choose a question type, before being
* redirected to question.php
*
* @license http://www.gnu.org/copyleft/gpl.html GNU Public License
* @package questionbank
*//** */
require_once(dirname(__FILE__) . '/../config.php');
require_once(dirname(__FILE__) . '/editlib.php');
// Read URL parameters.
$categoryid = required_param('category', PARAM_INT);
$cmid = optional_param('cmid', 0, PARAM_INT);
$courseid = optional_param('courseid', 0, PARAM_INT);
$returnurl = optional_param('returnurl', 0, PARAM_LOCALURL);
$appendqnumstring = optional_param('appendqnumstring', '', PARAM_ALPHA);
// Place to accumulate hidden params for the form we will print.
$hiddenparams = array('category' => $categoryid);
// Validate params.
if (!$category = $DB->get_record('question_categories', array('id' => $categoryid))) {
print_error('categorydoesnotexist', 'question', $returnurl);
}
if ($cmid){
list($module, $cm) = get_module_from_cmid($cmid);
require_login($cm->course, false, $cm);
$thiscontext = get_context_instance(CONTEXT_MODULE, $cmid);
$hiddenparams['cmid'] = $cmid;
} else if ($courseid) {
require_login($courseid, false);
$thiscontext = get_context_instance(CONTEXT_COURSE, $courseid);
$module = null;
$cm = null;
$hiddenparams['courseid'] = $courseid;
} else {
print_error('missingcourseorcmid', 'question');
}
// Check permissions.
$categorycontext = get_context_instance_by_id($category->contextid);
require_capability('moodle/question:add', $categorycontext);
// Ensure other optional params get passed on to question.php.
if (!empty($returnurl)) {
$hiddenparams['returnurl'] = $returnurl;
}
if (!empty($appendqnumstring)) {
$hiddenparams['appendqnumstring'] = $appendqnumstring;
}
$chooseqtype = get_string('chooseqtypetoadd', 'question');
if ($cm !== null) {
$navlinks = array();
if (stripos($returnurl, "$CFG->wwwroot/mod/{$cm->modname}/view.php")!== 0){
//don't need this link if returnurl returns to view.php
$navlinks[] = array('name' => get_string('editinga', 'moodle', get_string('modulename', $cm->modname)), 'link' => $returnurl, 'type' => 'title');
}
$navlinks[] = array('name' => $chooseqtype, 'link' => '', 'type' => 'title');
$navigation = build_navigation($navlinks, $cm);
print_header_simple($chooseqtype, '', $navigation, '', '', true, update_module_button($cm->id, $cm->course, get_string('modulename', $cm->modname)));
} else {
$navlinks = array();
$navlinks[] = array('name' => get_string('editquestions', 'question'), 'link' => $returnurl, 'type' => 'title');
$navlinks[] = array('name' => $chooseqtype, 'link' => '', 'type' => 'title');
$navigation = build_navigation($navlinks);
print_header_simple($chooseqtype, '', $navigation);
}
// Display a form to choose the question type.
print_box_start('generalbox boxwidthnormal boxaligncenter', 'chooseqtypebox');
print_choose_qtype_to_add_form($hiddenparams);
print_box_end();
print_footer($COURSE);
?>
+6 -8
View File
@@ -39,6 +39,8 @@
// TODO log this page view.
$localcss = '<link rel="stylesheet" type="text/css" href="'.$CFG->wwwroot.
'/lib/yui/container/assets/container.css" />';
$context = $contexts->lowest();
$streditingquestions = get_string('editquestions', "quiz");
if ($cm!==null) {
@@ -50,7 +52,7 @@
$navlinks[] = array('name' => format_string($module->name), 'link' => "$CFG->wwwroot/mod/{$cm->modname}/view.php?id={$cm->id}", 'type' => 'title');
$navlinks[] = array('name' => $streditingquestions, 'link' => '', 'type' => 'title');
$navigation = build_navigation($navlinks);
print_header_simple($streditingquestions, '', $navigation, "", "", true, $strupdatemodule);
print_header_simple($streditingquestions, '', $navigation, '', $localcss, true, $strupdatemodule);
$currenttab = 'edit';
$mode = 'questions';
@@ -62,22 +64,18 @@
$navlinks[] = array('name' => $streditingquestions, 'link' => '', 'type' => 'title');
$navigation = build_navigation($navlinks);
print_header_simple($streditingquestions, '', $navigation);
print_header_simple($streditingquestions, '', $navigation, '', $localcss);
// print tabs
$currenttab = 'questions';
include('tabs.php');
}
echo '<table class="boxaligncenter" border="0" cellpadding="2" cellspacing="0">';
echo '<tr><td valign="top">';
echo '<div class="questionbankwindow boxwidthwide boxaligncenter">';
$questionbank->display('questions', $pagevars['qpage'],
$pagevars['qperpage'], $pagevars['qsortorder'], $pagevars['qsortorderdecoded'],
$pagevars['cat'], $pagevars['recurse'], $pagevars['showhidden'], $pagevars['showquestiontext']);
echo '</td></tr>';
echo '</table>';
echo "</div>\n";
print_footer($COURSE);
?>
+97 -20
View File
@@ -651,7 +651,7 @@ class question_bank_move_action_column extends question_bank_action_column_base
protected function display_content($question, $rowclasses) {
if (question_has_capability_on($question, 'move')) {
$this->print_icon('move', $this->strmove, $this->qbank->move_question_url($question->id));
$this->print_icon('t/move.gif', $this->strmove, $this->qbank->move_question_url($question->id));
}
}
}
@@ -676,9 +676,9 @@ class question_bank_delete_action_column extends question_bank_action_column_bas
protected function display_content($question, $rowclasses) {
if (question_has_capability_on($question, 'edit')) {
if ($question->hidden) {
$this->print_icon('restore', $this->strrestore, $this->qbank->base_url()->out(false, array('unhide' => $question->id)));
$this->print_icon('t/restore.gif', $this->strrestore, $this->qbank->base_url()->out(false, array('unhide' => $question->id)));
} else {
$this->print_icon('delete', $this->strdelete,
$this->print_icon('t/delete.gif', $this->strdelete,
$this->qbank->base_url()->out(false, array('deleteselected' => $question->id, 'q' . $question->id => 1)));
}
}
@@ -817,7 +817,7 @@ class question_bank_view {
return $columns;
}
protected function know_field_types() {
protected function known_field_types() {
return array(
new question_bank_checkbox_column($this),
new question_bank_question_type_column($this),
@@ -834,7 +834,7 @@ class question_bank_view {
protected function init_column_types() {
$this->knowncolumntypes = array();
foreach ($this->know_field_types() as $col) {
foreach ($this->known_field_types() as $col) {
$this->knowncolumntypes[$col->get_name()] = $col;
}
}
@@ -1156,15 +1156,12 @@ class question_bank_view {
global $CFG;
/// Get all the existing categories now
echo '<div class="choosecategory">';
$catmenu = question_category_options($contexts, false, 0, true);
$strcategory = get_string('selectcategory', 'quiz');
$strshow = get_string('show', 'quiz');
$streditcats = get_string('editcategories', 'quiz');
popup_form('edit.php?'.$pageurl->get_query_string().'&amp;category=',
$catmenu, 'catmenu', $current, '', '', '', false, 'self',
$strcategory);
get_string('selectacategory', 'question'));
echo "</div>\n";
}
protected function display_options($recurse = 1, $showhidden = false, $showquestiontext = false) {
@@ -1193,13 +1190,11 @@ class question_bank_view {
}
protected function create_new_question_form($category, $canadd) {
$qtypemenu = question_type_menu();
$straddquestions = get_string('addquestions', 'quiz');
global $CFG;
echo '<div class="createnewquestion">';
if ($canadd) {
popup_form($this->editquestionurl->out(false, array('category' => $category->id)) . '&amp;qtype=',
$qtypemenu, 'addquestion', '', 'choose', '', '', false, 'self', $straddquestions);
helpbutton('questiontypes', $straddquestions, 'quiz');
create_new_question_button($category->id, $this->editquestionurl->params(),
get_string('createnewquestion', 'question'));
} else {
print_string('nopermissionadd', 'question');
}
@@ -1259,8 +1254,8 @@ class question_bank_view {
echo '<fieldset class="invisiblefieldset" style="display: block;">';
echo '<input type="hidden" name="sesskey" value="'.sesskey().'" />';
echo $pageurl->hidden_params_out();
echo '<div class="categoryquestionscontainer">';
echo '<div class="categoryquestionscontainer">';
$this->start_table();
$rowcount = 0;
foreach ($questions as $question) {
@@ -1268,6 +1263,7 @@ class question_bank_view {
$rowcount += 1;
}
$this->end_table();
echo "</div>\n";
echo '<div class="categorypagingbarcontainer pagingbottom">';
$paging = print_paging_bar($totalnumber, $page, $perpage, $pageurl, 'qpage', false, true);
@@ -1400,7 +1396,7 @@ class question_bank_view {
$checkforfiles = true;
}
}
$returnurl = $pageurl->out(false, array('category'=>"$tocategoryid,$contextid"));
$returnurl = $this->baseurl->out(false, array('category'=>"$tocategoryid,$contextid"));
if (!$checkforfiles){
if (!question_move_questions_to_category(implode(',', $questionids), $tocategory->id)) {
print_error('errormovingquestions', 'question', $returnurl, $questionids);
@@ -1439,7 +1435,7 @@ class question_bank_view {
}
}
}
redirect($pageurl->out());
redirect($this->baseurl->out());
} else {
print_error('invalidconfirm', 'question');
}
@@ -1452,7 +1448,7 @@ class question_bank_view {
if(!$DB->set_field('question', 'hidden', 0, array('id', $unhide))) {
print_error('cannotunhidequestion', 'question');
}
redirect($pageurl->out());
redirect($this->baseurl->out());
}
}
@@ -1821,4 +1817,85 @@ function require_login_in_context($contextorid = null){
require_login();
}
}
/**
* 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;
require_js(array('yui_yahoo','yui_dom','yui_event'));
require_js('question/qbank.js');
echo '<div id="chooseqtypehead" class="hd">' . "\n";
print_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";
$types = question_type_menu();
echo '<div class="qtypes">' . "\n";
echo '<div class="instruction">' . get_string('selectaqtypefordescription', 'question') . "</div>\n";
foreach ($types as $qtype => $localizedname) {
print_qtype_to_add_option($qtype, $localizedname);
}
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";
print_js_call('qtype_chooser.init', array('chooseqtype'));
}
/**
* Private function used by the preceding one.
* @param $qtype the question type.
* @param $localizedname the localized name of this question type.
*/
function print_qtype_to_add_option($qtype, $localizedname) {
global $QTYPES;
echo '<div class="qtypeoption">' . "\n";
echo '<input type="radio" name="qtype" id="qtype_' . $qtype . '" value="' . $qtype . '" />';
echo '<label for="qtype_' . $qtype . '"><span class="qtypename">';
$fakequestion = new stdClass;
$fakequestion->qtype = $qtype;
print_question_icon($fakequestion);
echo $localizedname . '</span><span class="qtypesummary">' . get_string($qtype . 'summary', 'qtype_' . $qtype);
echo "</span></label>\n";
echo "</div>\n";
}
/**
* Print a button for creating a new question. This will open question/addquestion.php,
* which in turn goes to question/question.php before getting back to $params['returnurl']
* (by default the question bank screen).
*
* @param integer $categoryid The id of the category that the new question should be added to.
* @param array $params Other paramters to add to the URL. You need either $params['cmid'] or
* $params['courseid'], and you should probably set $params['returnurl']
* @param string $caption the text to display on the button.
* @param string $tooltip a tooltip to add to the button (optional).
* @param boolean $disabled if true, the button will be disabled.
*/
function create_new_question_button($categoryid, $params, $caption, $tooltip = '', $disabled = false) {
global $CFG;
static $choiceformprinted = false;
$params['category'] = $categoryid;
print_single_button($CFG->wwwroot . '/question/addquestion.php', $params,
$caption,'get', '', false, $tooltip, $disabled);
helpbutton('questiontypes', get_string('createnewquestion', 'question'), 'question');
require_js(array('yui_yahoo','yui_dom','yui_event', 'yui_dragdrop', 'yui_container'));
if (!$choiceformprinted) {
echo '<div id="qtypechoicecontainer">';
print_choose_qtype_to_add_form(array());
echo "</div>\n";
$choiceformprinted = true;
}
}
?>
+99 -1
View File
@@ -1,5 +1,6 @@
// This script is included by question_bank_view in question/editlib.php.
// This script is included by question_bank_view and other parts of question/editlib.php.
// JavaScript belonging to question_bank_view.
question_bank = {
strselectall: '',
strdeselectall: '',
@@ -33,3 +34,100 @@ question_bank = {
question_bank.headercheckbox.checked = false;
}
};
// JavaScript to make the list of question types pop-up when you click an add
// add question button.
qtype_chooser = {
radiobuttons: [],
labels: [],
container: null,
submitbutton: null,
init: function(boxid) {
// Find the radio buttons.
qtype_chooser.radiobuttons = YAHOO.util.Dom.getElementsBy(
function(el) { return el.type == 'radio'; }, 'input' , boxid);
qtype_chooser.labels = YAHOO.util.Dom.getElementsByClassName('qtypeoption', 'div', boxid);
// Find the submit button.
qtype_chooser.submitbutton = document.getElementById(boxid + '_submit');
qtype_chooser.enable_disable_submit();
// Add the event handlers.
YAHOO.util.Event.addListener(boxid, 'click', qtype_chooser.enable_disable_submit);
YAHOO.util.Event.addListener(boxid, 'key_down', qtype_chooser.enable_disable_submit);
YAHOO.util.Event.addListener(boxid, 'key_up', qtype_chooser.enable_disable_submit);
YAHOO.util.Event.addListener(boxid, 'dblclick', qtype_chooser.double_click);
YAHOO.util.Event.onDOMReady(qtype_chooser.init_container);
},
enable_disable_submit: function() {
var ok = false;
for (var i = 0; i < qtype_chooser.radiobuttons.length; i++) {
if (qtype_chooser.radiobuttons[i].checked) {
ok = true;
YAHOO.util.Dom.addClass(qtype_chooser.labels[i], 'selected');
} else {
YAHOO.util.Dom.removeClass(qtype_chooser.labels[i], 'selected');
}
}
qtype_chooser.submitbutton.disabled = !ok;
},
double_click: function() {
if (!qtype_chooser.submitbutton.disabled) {
qtype_chooser.submitbutton.form.submit();
}
},
init_container: function() {
if (!document.getElementById('qtypechoicecontainer')) {
return;
}
qtype_chooser.container = new YAHOO.widget.Dialog('qtypechoicecontainer', {
constraintoviewport: true,
visible: false,
modal: true,
fixedcenter: true,
close: true,
draggable: true,
dragOnly: true,
postmethod: 'form',
zIndex: 1000
});
qtype_chooser.container.render();
YAHOO.util.Event.addListener('chooseqtypecancel', 'click', qtype_chooser.cancel_popup);
var addforms = YAHOO.util.Dom.getElementsBy(function(el) {
return /question\/addquestion\.php/.test(el.action); }, 'form', document.body);
for (var i = 0; i < addforms.length; i++) {
YAHOO.util.Event.addListener(addforms[i], 'submit', qtype_chooser.add_button_click);
}
},
add_button_click: function(e) {
var form = document.getElementById('qtypeformdiv');
var oldhidden = YAHOO.util.Dom.getElementsBy(
function(el) { return el.type == 'hidden'; }, 'input', form);
for (var i = 0; i < oldhidden.length; i++) {
oldhidden[i].parentNode.removeChild(oldhidden[i]);
}
var wantedhidden = YAHOO.util.Dom.getElementsBy(
function(el) { return el.type == 'hidden'; }, 'input', this);
for (i = 0; i < wantedhidden.length; i++) {
form.appendChild(wantedhidden[i].cloneNode(true));
}
qtype_chooser.container.show();
YAHOO.util.Event.preventDefault(e);
},
cancel_popup: function(e) {
qtype_chooser.container.hide();
YAHOO.util.Event.preventDefault(e);
}
};
+5 -1
View File
@@ -48,6 +48,10 @@ if (!$returnurl) {
$returnurl = "{$CFG->wwwroot}/question/edit.php?courseid={$COURSE->id}";
}
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);
@@ -228,7 +232,7 @@ if ($mform->is_cancelled()){
}
} else {
list($streditingquestion,) = $QTYPES[$question->qtype]->get_heading();
$streditingquestion = $QTYPES[$question->qtype]->get_heading();
if ($cm !== null) {
$strmodule = get_string('modulename', $cm->modname);
$strupdatemodule = has_capability('moodle/course:manageactivities', get_context_instance(CONTEXT_COURSE, $COURSE->id))
+12
View File
@@ -809,6 +809,18 @@ table.message_search_results td {
*** Question
***/
#qtypechoicecontainer #chooseqtype .qtypes {
border-bottom-color: grey;
}
#qtypechoicecontainer #chooseqtype .selected {
background: #dddddd;
}
#qtypechoicecontainer #chooseqtype .instruction,
#qtypechoicecontainer #chooseqtype .qtypesummary {
border-left-color: grey;
background-color: white;
}
.que {
border-color: #DDD;
}
+11
View File
@@ -725,6 +725,17 @@ body#grade-index .grades .header {
*** Question
***/
#chooseqtype .instruction,
#chooseqtype .qtypesummary {
font-size: 0.8em;
}
#chooseqtype .qtypename {
font-weight: bold;
}
#qtypechoicecontainer #chooseqtype .qtypename {
font-weight: normal;
}
.que .info h2 {
font-size: 1.25em;
font-weight: bold;
+94 -58
View File
@@ -2897,6 +2897,67 @@ body.notes .notesgroup {
margin-top: 0;
}
#chooseqtypebox {
margin-top: 1em;
}
#chooseqtype h3 {
margin: 0 0 0.3em;
}
#chooseqtype .instruction {
display: none;
}
#chooseqtype .qtypeoption {
margin-bottom: 0.5em;
}
#chooseqtype .qtypename img {
padding: 0 0.3em;
}
#chooseqtype .qtypesummary {
display: block;
margin: 0 2em;
}
#chooseqtype .submitbuttons {
margin: 0.7em 0;
text-align: center;
}
#qtypechoicecontainer {
display: none;
}
body.jsenabled #qtypechoicecontainer {
display: block;
}
#qtypechoicecontainer #chooseqtype {
width: 30em;
}
#qtypechoicecontainer #chooseqtypehead h3 {
margin: 0;
}
#qtypechoicecontainer #chooseqtype .qtypes {
position: relative;
border-bottom: 1px solid grey;
padding: 0.24em 0;
}
#qtypechoicecontainer #chooseqtype .qtypeoption {
margin-bottom: 0;
}
#qtypechoicecontainer #chooseqtype .instruction,
#qtypechoicecontainer #chooseqtype .qtypesummary {
display: none;
position: absolute;
top: 0px;
right: 0px;
bottom: 0px;
left: 60%;
margin: 0;
border-left: 1px solid grey;
padding: 0.3em 0.5em;
}
#qtypechoicecontainer #chooseqtype .instruction,
#qtypechoicecontainer #chooseqtype .selected .qtypesummary {
display: block;
}
.que {
text-align: left;
margin: 0 auto 1.8em auto;
@@ -4831,50 +4892,34 @@ table.quizreviewsummary td.cell {
z-index:999;
}
#mod-quiz-edit .quizpagedelete img{
#mod-quiz-edit .quizpagedelete img {
background-color:#d6d6d6;
padding:0.5em;
}
#mod-quiz-edit .pagecontrols{
#mod-quiz-edit .pagecontrols {
clear:both;
margin-left:0.5em;
padding-top:0.5em;
}
#mod-quiz-edit .pagecontrols .singlebutton{
float:left;
#mod-quiz-edit .pagecontrols .singlebutton {
float:left;
margin-left: 1em;
}
#mod-quiz-edit div.quizpage .pagecontent form#addquestion{
margin-right:1em;
-webkit-border-radius:0.2em;
border-radius:0.2em;
padding:0.3em;
}
#mod-quiz-edit div.quizpage .pagecontent form.randomquestionform{
padding-left:1em;
#mod-quiz-edit .pagecontrols .helplink {
float:left;
}
#mod-quiz-edit div.quizpage .pagecontent form.randomquestionform div{
/* it is a mystery why this has to be inline-table but
otherwise the layout gets screwed, even if
it is "inline" */
display:inline-table;
display: inline-table;
}
#mod-quiz-edit div.quizpage .pagecontent form.randomquestionform div input{
display:inline;
}
#mod-quiz-edit div.quizpage .pagecontent .adddescription{
clear:left;
margin-top:0.3em;
}
#mod-quiz-edit div.quizpage .pagecontent .addrandomquestion{
margin-top:0.3em;
display: inline;
}
/* a CSS class YUI container creates on the fly: */
@@ -5013,24 +5058,28 @@ table.quizreviewsummary td.cell {
}
/*start question bank*/
/*TODO: below applies to also question bank, so when
question bank is adapted to the new UI, add the appropriate
css id's of question bank*/
.questionbankwindow .choosecategory,
.questionbankwindow .createnewquestion {
padding: 0.3em;
}
.questionbankwindow .createnewquestion .singlebutton {
display: inline;
}
.questionbankwindow #catmenu_jump {
display: block;
}
#mod-quiz-edit .questionbankwindow .createnewquestion select,
#mod-quiz-edit .questionbankwindow #catmenu select{
width:80%;
#mod-quiz-edit .questionbankwindow #catmenu select,
#mod-quiz-edit .questionbankwindow #menucategory {
width: 100%;
}
#mod-quiz-addrandom select {
width:100%;
}
#mod-quiz-edit table#categoryquestions{
table#categoryquestions {
width: 100%;
overflow: hidden;
table-layout: fixed;
}
#mod-quiz-edit table#categoryquestions td,#mod-quiz-edit table#categoryquestions th{
table#categoryquestions td,#mod-quiz-edit table#categoryquestions th{
overflow:hidden;
white-space:nowrap;
}
@@ -5051,7 +5100,7 @@ css id's of question bank*/
text-align: center;
}
#mod-quiz-edit #categoryquestions .qtype {
#categoryquestions .qtype {
width: 24px;
padding: 0;
}
@@ -5059,8 +5108,8 @@ css id's of question bank*/
#categoryquestions .questiontext p {
margin: 0;
}
#mod-quiz-edit .categoryinfo{
padding:0.3em;
.categoryinfo {
padding: 0.3em;
}
#mod-quiz-edit .paging{
@@ -5069,10 +5118,6 @@ css id's of question bank*/
display:block;
}
#mod-quiz-edit .questionsortoptions{
margin-top:0.3em;
}
#mod-quiz-edit .pagingbottom{
padding-bottom:0.3em;
}
@@ -5081,11 +5126,6 @@ css id's of question bank*/
clear:both;
}
#mod-quiz-edit div.createnewquestion{
padding-top:0.3em;
clear:left;
}
#mod-quiz-edit .sideblock .content{
padding:0;
}
@@ -5095,25 +5135,21 @@ css id's of question bank*/
margin-top:0.3em;
}
#mod-quiz-edit .questionbank .categoryselectallcontainer{
padding-bottom:0.5em;
}
#mod-quiz-edit .questionbank div.categoryquestionscontainer,
#mod-quiz-edit .questionbank .categorysortopotionscontainer,
#mod-quiz-edit .questionbank .categorypagingbarcontainer,
#mod-quiz-edit .questionbank .categoryselectallcontainer{
.questionbank div.categoryquestionscontainer,
.questionbank .categorysortopotionscontainer,
.questionbank .categorypagingbarcontainer,
.questionbank .categoryselectallcontainer{
padding-left:0.3em;
padding-right:0.3em;
}
#mod-quiz-edit .noquestionsincategory{
.noquestionsincategory{
clear:both;
padding-top:1em;
padding-bottom:1em;
}
#mod-quiz-edit .modulespecificbuttonscontainer{
.modulespecificbuttonscontainer{
padding-left:0.3em;
padding-right:0.3em;
}