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 '
\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 ''; + } + + protected function display_options($recurse, $showhidden, $showquestiontext) { + debugging('display_options() is deprecated, see display_options_form() instead.', DEBUG_DEVELOPER); + 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 '"; - 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 ''; - } - - protected function display_options($recurse, $showhidden, $showquestiontext) { - debugging('display_options() is deprecated, see display_options_form() instead.', DEBUG_DEVELOPER); - 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