diff --git a/mod/quiz/classes/output/edit_renderer.php b/mod/quiz/classes/output/edit_renderer.php index 1d5ec6255dd..a1c2606f667 100644 --- a/mod/quiz/classes/output/edit_renderer.php +++ b/mod/quiz/classes/output/edit_renderer.php @@ -911,11 +911,11 @@ class edit_renderer extends \plugin_renderer_base { /** * Return the contents of the question bank, to be displayed in the question-bank pop-up. * - * @param \quiz_question_bank_view $questionbank the question bank view object. + * @param \mod_quiz\question\bank\custom_view $questionbank the question bank view object. * @param array $pagevars the variables from {@link \question_edit_setup()}. * @return string HTML to output / send back in response to an AJAX request. */ - public function question_bank_contents(\quiz_question_bank_view $questionbank, array $pagevars) { + public function question_bank_contents(\mod_quiz\question\bank\custom_view $questionbank, array $pagevars) { $qbank = $questionbank->render('editq', $pagevars['qpage'], $pagevars['qperpage'], $pagevars['cat'], $pagevars['recurse'], $pagevars['showhidden'], $pagevars['qbshowtext']); diff --git a/mod/quiz/classes/question/bank/add_action_column.php b/mod/quiz/classes/question/bank/add_action_column.php new file mode 100644 index 00000000000..0e1d17cdf20 --- /dev/null +++ b/mod/quiz/classes/question/bank/add_action_column.php @@ -0,0 +1,59 @@ +. + +/** + * A column type for the add this question to the quiz action. + * + * @package mod_quiz + * @category question + * @copyright 2009 Tim Hunt + * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later + */ + +namespace mod_quiz\question\bank; +defined('MOODLE_INTERNAL') || die(); + + +/** + * A column type for the add this question to the quiz action. + * + * @copyright 2009 Tim Hunt + * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later + */ +class add_action_column extends \core_question\bank\action_column_base { + /** @var string caches a lang string used repeatedly. */ + protected $stradd; + + public function init() { + parent::init(); + $this->stradd = get_string('addtoquiz', 'quiz'); + } + + public function get_name() { + return 'addtoquizaction'; + } + + protected function display_content($question, $rowclasses) { + if (!question_has_capability_on($question, 'use')) { + return; + } + $this->print_icon('t/add', $this->stradd, $this->qbank->add_to_quiz_url($question->id)); + } + + public function get_required_fields() { + return array('q.id'); + } +} diff --git a/mod/quiz/classes/question/bank/custom_view.php b/mod/quiz/classes/question/bank/custom_view.php new file mode 100644 index 00000000000..f3db9293fcd --- /dev/null +++ b/mod/quiz/classes/question/bank/custom_view.php @@ -0,0 +1,239 @@ +. + +/** + * Defines the custom question bank view used on the Edit quiz page. + * + * @package mod_quiz + * @category question + * @copyright 1999 onwards Martin Dougiamas and others {@link http://moodle.com} + * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later + */ + +namespace mod_quiz\question\bank; +defined('MOODLE_INTERNAL') || die(); + + +/** + * Subclass to customise the view of the question bank for the quiz editing screen. + * + * @copyright 2009 Tim Hunt + * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later + */ +class custom_view extends \core_question\bank\view { + /** @var bool whether the quiz this is used by has been attemptd. */ + protected $quizhasattempts = false; + /** @var \stdClass the quiz settings. */ + protected $quiz = false; + /** @var int The maximum displayed length of the category info. */ + const MAX_TEXT_LENGTH = 200; + + /** + * Constructor + * @param \question_edit_contexts $contexts + * @param \moodle_url $pageurl + * @param \stdClass $course course settings + * @param \stdClass $cm activity settings. + * @param \stdClass $quiz quiz settings. + */ + public function __construct($contexts, $pageurl, $course, $cm, $quiz) { + parent::__construct($contexts, $pageurl, $course, $cm); + $this->quiz = $quiz; + } + + protected function wanted_columns() { + global $CFG; + + if (empty($CFG->quizquestionbankcolumns)) { + $quizquestionbankcolumns = array( + 'add_action_column', + 'checkbox_column', + 'question_type_column', + 'question_name_text_column', + 'preview_action_column', + ); + } else { + $quizquestionbankcolumns = explode(',', $CFG->quizquestionbankcolumns); + } + + foreach ($quizquestionbankcolumns as $fullname) { + if (!class_exists($fullname)) { + if (class_exists('mod_quiz\\question\\bank\\' . $fullname)) { + $fullname = 'mod_quiz\\question\\bank\\' . $fullname; + } else if (class_exists('core_question\\bank\\' . $fullname)) { + $fullname = 'core_question\\bank\\' . $fullname; + } else if (class_exists('question_bank_' . $fullname)) { + debugging('Legacy question bank column class question_bank_' . + $fullname . ' should be renamed to mod_quiz\\question\\bank\\' . + $fullname, DEBUG_DEVELOPER); + $fullname = 'question_bank_' . $fullname; + } else { + throw new coding_exception("No such class exists: $fullname"); + } + } + $this->requiredcolumns[$fullname] = new $fullname($this); + } + return $this->requiredcolumns; + } + + /** + * Specify the column heading + * + * @return string Column name for the heading + */ + protected function heading_column() { + return 'mod_quiz\\question\\bank\\question_name_text_column'; + } + + protected function default_sort() { + return array( + 'core_question\\bank\\question_type_column' => 1, + 'mod_quiz\\question\\bank\\question_name_text_column' => 1, + ); + } + + /** + * Let the question bank display know whether the quiz has been attempted, + * hence whether some bits of UI, like the add this question to the quiz icon, + * should be displayed. + * @param bool $quizhasattempts whether the quiz has attempts. + */ + public function set_quiz_has_attempts($quizhasattempts) { + $this->quizhasattempts = $quizhasattempts; + if ($quizhasattempts && isset($this->visiblecolumns['addtoquizaction'])) { + unset($this->visiblecolumns['addtoquizaction']); + } + } + + public function preview_question_url($question) { + return quiz_question_preview_url($this->quiz, $question); + } + + public function add_to_quiz_url($questionid) { + global $CFG; + $params = $this->baseurl->params(); + $params['addquestion'] = $questionid; + $params['sesskey'] = sesskey(); + return new \moodle_url('/mod/quiz/edit.php', $params); + } + + /** + * Renders the html question bank (same as display, but returns the result). + * + * Note that you can only output this rendered result once per page, as + * it contains IDs which must be unique. + * + * @return string HTML code for the form + */ + public function render($tabname, $page, $perpage, $cat, $recurse, $showhidden, $showquestiontext) { + ob_start(); + $this->display($tabname, $page, $perpage, $cat, $recurse, $showhidden, $showquestiontext); + $out = ob_get_contents(); + ob_end_clean(); + return $out; + } + + /** + * Display the controls at the bottom of the list of questions. + * @param int $totalnumber Total number of questions that might be shown (if it was not for paging). + * @param bool $recurse Whether to include subcategories. + * @param \stdClass $category The question_category row from the database. + * @param \context $catcontext The context of the category being displayed. + * @param array $addcontexts contexts where the user is allowed to add new questions. + */ + protected function display_bottom_controls($totalnumber, $recurse, $category, \context $catcontext, array $addcontexts) { + $cmoptions = new \stdClass(); + $cmoptions->hasattempts = !empty($this->quizhasattempts); + + $canuseall = has_capability('moodle/question:useall', $catcontext); + + echo '
'; + if ($canuseall) { + + // Add selected questions to the quiz. + $params = array( + 'type' => 'submit', + 'name' => 'add', + 'value' => get_string('addselectedquestionstoquiz', 'quiz'), + ); + if ($cmoptions->hasattempts) { + $params['disabled'] = 'disabled'; + } + echo \html_writer::empty_tag('input', $params); + } + echo "
\n"; + } + + /** + * Prints a form to choose categories. + * @param string $categoryandcontext 'categoryID,contextID'. + * @deprecated since Moodle 2.6 MDL-40313. + * @see \core_question\bank\search\category_condition + * @todo MDL-41978 This will be deleted in Moodle 2.8 + */ + protected function print_choose_category_message($categoryandcontext) { + global $OUTPUT; + debugging('print_choose_category_message() is deprecated, ' . + 'please use \core_question\bank\search\category_condition instead.', DEBUG_DEVELOPER); + echo $OUTPUT->box_start('generalbox questionbank'); + $this->display_category_form($this->contexts->having_one_edit_tab_cap('edit'), + $this->baseurl, $categoryandcontext); + echo "

"; + print_string('selectcategoryabove', 'question'); + echo "

"; + echo $OUTPUT->box_end(); + } + + protected function display_options_form($showquestiontext, $scriptpath = '/mod/quiz/edit.php', + $showtextoption = false) { + // Overridden just to change the default values of the arguments. + parent::display_options_form($showquestiontext, $scriptpath, $showtextoption); + } + + protected function print_category_info($category) { + $formatoptions = new stdClass(); + $formatoptions->noclean = true; + $strcategory = get_string('category', 'quiz'); + echo '
' . + $strcategory; + echo ': '; + echo shorten_text(strip_tags(format_string($category->name)), 60); + echo '
' . + ''; + echo shorten_text(strip_tags(format_text($category->info, $category->infoformat, + $formatoptions, $this->course->id)), 200); + echo '
'; + } + + protected function display_options($recurse, $showhidden, $showquestiontext) { + debugging('display_options() is deprecated, see display_options_form() instead.', DEBUG_DEVELOPER); + echo '
'; + echo "
"; + echo \html_writer::input_hidden_params($this->baseurl, + array('recurse', 'showhidden', 'qbshowtext')); + $this->display_category_form_checkbox('recurse', $recurse, + get_string('includesubcategories', 'question')); + $this->display_category_form_checkbox('showhidden', $showhidden, + get_string('showhidden', 'question')); + echo '
'; + } + + protected function create_new_question_form($category, $canadd) { + // Don't display this. + } +} diff --git a/mod/quiz/classes/question/bank/question_name_text_column.php b/mod/quiz/classes/question/bank/question_name_text_column.php new file mode 100644 index 00000000000..fa15f54097d --- /dev/null +++ b/mod/quiz/classes/question/bank/question_name_text_column.php @@ -0,0 +1,60 @@ +. + +/** + * A column type for the name followed by the start of the question text. + * + * @package mod_quiz + * @category question + * @copyright 1999 onwards Martin Dougiamas and others {@link http://moodle.com} + * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later + */ + +namespace mod_quiz\question\bank; +defined('MOODLE_INTERNAL') || die(); + + +/** + * A column type for the name followed by the start of the question text. + * + * @copyright 2009 Tim Hunt + * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later + */ +class question_name_text_column extends \core_question\bank\question_name_column { + public function get_name() { + return 'questionnametext'; + } + + protected function display_content($question, $rowclasses) { + echo '
'; + $labelfor = $this->label_for($question); + if ($labelfor) { + echo ''; + } + echo '
'; + } + + public function get_required_fields() { + $fields = parent::get_required_fields(); + $fields[] = 'q.questiontext'; + $fields[] = 'q.questiontextformat'; + return $fields; + } +} diff --git a/mod/quiz/db/renamedclasses.php b/mod/quiz/db/renamedclasses.php new file mode 100644 index 00000000000..3cc07a1c1ff --- /dev/null +++ b/mod/quiz/db/renamedclasses.php @@ -0,0 +1,34 @@ +. + +/** + * Lists renamed classes so that the autoloader can make the old names still work. + * + * @package mod_quiz + * @copyright 2014 Tim Hunt + * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later + */ + +defined('MOODLE_INTERNAL') || die(); + +// Array 'old_class_name' => 'new\class_name'. +$renamedclasses = array( + + // Changed in Moodle 2.8. + 'quiz_question_bank_view' => 'mod_quiz\question\bank\custom_view', + 'question_bank_add_to_quiz_action_column' => 'mod_quiz\question\bank\add_action_column', + 'question_bank_question_name_text_column' => 'mod_quiz\question\bank\question_name_text_column', +); diff --git a/mod/quiz/edit.php b/mod/quiz/edit.php index 8b5726850ce..1c0e763ca45 100644 --- a/mod/quiz/edit.php +++ b/mod/quiz/edit.php @@ -281,7 +281,7 @@ if (optional_param('savechanges', false, PARAM_BOOL) && confirm_sesskey()) { } // Get the question bank view. -$questionbank = new quiz_question_bank_view($contexts, $thispageurl, $course, $cm, $quiz); +$questionbank = new mod_quiz\question\bank\custom_view($contexts, $thispageurl, $course, $cm, $quiz); $questionbank->set_quiz_has_attempts($quizhasattempts); $questionbank->process_actions($thispageurl, $cm); diff --git a/mod/quiz/editlib.php b/mod/quiz/editlib.php index 871dc174d24..0652481778d 100644 --- a/mod/quiz/editlib.php +++ b/mod/quiz/editlib.php @@ -200,261 +200,3 @@ function quiz_add_random_questions($quiz, $addonpage, $categoryid, $number, quiz_add_quiz_question($question->id, $quiz, $addonpage); } } - - -/** - * A column type for the add this question to the quiz. - * - * @copyright 2009 Tim Hunt - * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later - */ -class question_bank_add_to_quiz_action_column extends question_bank_action_column_base { - protected $stradd; - - public function init() { - parent::init(); - $this->stradd = get_string('addtoquiz', 'quiz'); - } - - public function get_name() { - return 'addtoquizaction'; - } - - protected function display_content($question, $rowclasses) { - if (!question_has_capability_on($question, 'use')) { - return; - } - $this->print_icon('t/add', $this->stradd, $this->qbank->add_to_quiz_url($question->id)); - } - - public function get_required_fields() { - return array('q.id'); - } -} - -/** - * A column type for the name followed by the start of the question text. - * - * @copyright 2009 Tim Hunt - * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later - */ -class question_bank_question_name_text_column extends question_bank_question_name_column { - public function get_name() { - return 'questionnametext'; - } - - protected function display_content($question, $rowclasses) { - echo '
'; - $labelfor = $this->label_for($question); - if ($labelfor) { - echo ''; - } - echo '
'; - } - - public function get_required_fields() { - $fields = parent::get_required_fields(); - $fields[] = 'q.questiontext'; - $fields[] = 'q.questiontextformat'; - return $fields; - } -} - -/** - * Subclass to customise the view of the question bank for the quiz editing screen. - * - * @copyright 2009 Tim Hunt - * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later - */ -class quiz_question_bank_view extends core_question\bank\view { - protected $quizhasattempts = false; - /** @var object the quiz settings. */ - protected $quiz = false; - /** @var int The maximum displayed length of the category info. */ - const MAX_TEXT_LENGTH = 200; - - /** - * Constructor - * @param question_edit_contexts $contexts - * @param moodle_url $pageurl - * @param object $course course settings - * @param object $cm activity settings. - * @param object $quiz quiz settings. - */ - public function __construct($contexts, $pageurl, $course, $cm, $quiz) { - parent::__construct($contexts, $pageurl, $course, $cm); - $this->quiz = $quiz; - } - - protected function wanted_columns() { - global $CFG; - - if (empty($CFG->quizquestionbankcolumns)) { - $quizquestionbankcolumns = array('add_to_quiz_action_column', 'checkbox_column', 'question_type_column', - 'question_name_column', 'preview_action_column'); - } else { - $quizquestionbankcolumns = explode(',', $CFG->quizquestionbankcolumns); - } - - foreach ($quizquestionbankcolumns as $fullname) { - if (! class_exists($fullname)) { - if (class_exists('question_bank_' . $fullname)) { - $fullname = 'question_bank_' . $fullname; - } else { - throw new coding_exception("No such class exists: $fullname"); - } - } - $this->requiredcolumns[$fullname] = new $fullname($this); - } - return $this->requiredcolumns; - } - - /** - * Specify the column heading - * - * @return string Column name for the heading - */ - protected function heading_column() { - return 'questionnametext'; - } - - protected function default_sort() { - return array('question_bank_question_type_column' => 1, 'question_bank_question_name_column' => 1); - } - - /** - * Let the question bank display know whether the quiz has been attempted, - * hence whether some bits of UI, like the add this question to the quiz icon, - * should be displayed. - * @param bool $quizhasattempts whether the quiz has attempts. - */ - public function set_quiz_has_attempts($quizhasattempts) { - $this->quizhasattempts = $quizhasattempts; - if ($quizhasattempts && isset($this->visiblecolumns['addtoquizaction'])) { - unset($this->visiblecolumns['addtoquizaction']); - } - } - - public function preview_question_url($question) { - return quiz_question_preview_url($this->quiz, $question); - } - - public function add_to_quiz_url($questionid) { - global $CFG; - $params = $this->baseurl->params(); - $params['addquestion'] = $questionid; - $params['sesskey'] = sesskey(); - return new moodle_url('/mod/quiz/edit.php', $params); - } - - /** - * Renders the html question bank (same as display, but returns the result). - * - * Note that you can only output this rendered result once per page, as - * it contains IDs which must be unique. - * - * @return string HTML code for the form - */ - public function render($tabname, $page, $perpage, $cat, $recurse, $showhidden, $showquestiontext) { - ob_start(); - $this->display($tabname, $page, $perpage, $cat, $recurse, $showhidden, $showquestiontext); - $out = ob_get_contents(); - ob_end_clean(); - return $out; - } - - /** - * Display the controls at the bottom of the list of questions. - * @param int $totalnumber Total number of questions that might be shown (if it was not for paging). - * @param bool $recurse Whether to include subcategories. - * @param stdClass $category The question_category row from the database. - * @param context $catcontext The context of the category being displayed. - * @param array $addcontexts contexts where the user is allowed to add new questions. - */ - protected function display_bottom_controls($totalnumber, $recurse, $category, \context $catcontext, array $addcontexts) { - $cmoptions = new \stdClass(); - $cmoptions->hasattempts = !empty($this->quizhasattempts); - - $canuseall = has_capability('moodle/question:useall', $catcontext); - - echo '
'; - if ($canuseall) { - - // Add selected questions to the quiz. - $params = array( - 'type' => 'submit', - 'name' => 'add', - 'value' => get_string('addselectedquestionstoquiz', 'quiz'), - ); - if ($cmoptions->hasattempts) { - $params['disabled'] = 'disabled'; - } - echo html_writer::empty_tag('input', $params); - } - echo "
\n"; - } - - /** - * prints a form to choose categories - * @param string $categoryandcontext 'categoryID,contextID'. - * @deprecated since Moodle 2.6 MDL-40313. - * @see \core_question\bank\search\category_condition - * @todo MDL-41978 This will be deleted in Moodle 2.8 - */ - protected function print_choose_category_message($categoryandcontext) { - global $OUTPUT; - debugging('print_choose_category_message() is deprecated, ' . - 'please use \core_question\bank\search\category_condition instead.', DEBUG_DEVELOPER); - echo $OUTPUT->box_start('generalbox questionbank'); - $this->display_category_form($this->contexts->having_one_edit_tab_cap('edit'), - $this->baseurl, $categoryandcontext); - echo "

"; - print_string('selectcategoryabove', 'question'); - echo "

"; - echo $OUTPUT->box_end(); - } - - protected function display_options_form($showquestiontext, $scriptpath = '/mod/quiz/edit.php', - $showtextoption = false) { - // Overridden just to change the default values of the arguments. - parent::display_options_form($showquestiontext, $scriptpath, $showtextoption); - } - - protected function print_category_info($category) { - $formatoptions = new stdClass(); - $formatoptions->noclean = true; - $strcategory = get_string('category', 'quiz'); - echo '
' . - $strcategory; - echo ': '; - echo shorten_text(strip_tags(format_string($category->name)), 60); - echo '
' . - ''; - echo shorten_text(strip_tags(format_text($category->info, $category->infoformat, - $formatoptions, $this->course->id)), 200); - echo '
'; - } - - protected function display_options($recurse, $showhidden, $showquestiontext) { - debugging('display_options() is deprecated, see display_options_form() instead.', DEBUG_DEVELOPER); - echo '
'; - echo "
"; - echo html_writer::input_hidden_params($this->baseurl, - array('recurse', 'showhidden', 'qbshowtext')); - $this->display_category_form_checkbox('recurse', $recurse, - get_string('includesubcategories', 'question')); - $this->display_category_form_checkbox('showhidden', $showhidden, - get_string('showhidden', 'question')); - echo '
'; - } - - protected function create_new_question_form($category, $canadd) { - // Don't display this. - } -} diff --git a/mod/quiz/questionbank.ajax.php b/mod/quiz/questionbank.ajax.php index 405593816c1..747ca0541df 100644 --- a/mod/quiz/questionbank.ajax.php +++ b/mod/quiz/questionbank.ajax.php @@ -37,7 +37,7 @@ $course = $DB->get_record('course', array('id' => $quiz->course), '*', MUST_EXIS require_capability('mod/quiz:manage', $contexts->lowest()); // Create quiz question bank view. -$questionbank = new quiz_question_bank_view($contexts, $thispageurl, $course, $cm, $quiz); +$questionbank = new mod_quiz\question\bank\custom_view($contexts, $thispageurl, $course, $cm, $quiz); $questionbank->set_quiz_has_attempts(quiz_has_attempts($quiz->id)); // Output. diff --git a/mod/quiz/styles.css b/mod/quiz/styles.css index 92e752fb2ce..d8af1d262ba 100644 --- a/mod/quiz/styles.css +++ b/mod/quiz/styles.css @@ -705,8 +705,9 @@ table.quizreviewsummary td.cell { #page-mod-quiz-edit ul.slots .activityinstance span.instancename img { margin-right: .2em; } +#page-mod-quiz-edit #categoryquestions .questionname, #page-mod-quiz-edit ul.slots li.activity div.activityinstance .questionname { - font-weight: bold; + font-weight: bold; color: #555; } #page-mod-quiz-edit ul.slots li.activity div.activityinstance .questiontext { diff --git a/mod/quiz/upgrade.txt b/mod/quiz/upgrade.txt index 911e92ca610..797cd4aaafe 100644 --- a/mod/quiz/upgrade.txt +++ b/mod/quiz/upgrade.txt @@ -2,6 +2,11 @@ This files describes API changes in the quiz code. === 2.8 === +* Classes that where defined in various lib files have been moved to the classes + folder to take advantage of auto-loading. This has involved renaming them. + see the list in mod/quiz/db/renamedclasses.php. + + * Major changes to the Edit quiz page. The goal of this work was to increase usability, and also clean up the page