Search moodle.org's
Developer Documentation

See Release Notes
Long Term Support Release

  • Bug fixes for general core bugs in 4.1.x will end 13 November 2023 (12 months).
  • Bug fixes for security issues in 4.1.x will end 10 November 2025 (36 months).
  • PHP version: minimum PHP 7.4.0 Note: minimum PHP version has increased since Moodle 4.0. PHP 8.0.x is supported too.
/mod/quiz/ -> edit.php (source)

Differences Between: [Versions 310 and 401] [Versions 311 and 401] [Versions 39 and 401] [Versions 401 and 402] [Versions 401 and 403]

   1  <?php
   2  // This file is part of Moodle - http://moodle.org/
   3  //
   4  // Moodle is free software: you can redistribute it and/or modify
   5  // it under the terms of the GNU General Public License as published by
   6  // the Free Software Foundation, either version 3 of the License, or
   7  // (at your option) any later version.
   8  //
   9  // Moodle is distributed in the hope that it will be useful,
  10  // but WITHOUT ANY WARRANTY; without even the implied warranty of
  11  // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  12  // GNU General Public License for more details.
  13  //
  14  // You should have received a copy of the GNU General Public License
  15  // along with Moodle.  If not, see <http://www.gnu.org/licenses/>.
  16  
  17  
  18  /**
  19   * Page to edit quizzes
  20   *
  21   * This page generally has two columns:
  22   * The right column lists all available questions in a chosen category and
  23   * allows them to be edited or more to be added. This column is only there if
  24   * the quiz does not already have student attempts
  25   * The left column lists all questions that have been added to the current quiz.
  26   * The lecturer can add questions from the right hand list to the quiz or remove them
  27   *
  28   * The script also processes a number of actions:
  29   * Actions affecting a quiz:
  30   * up and down  Changes the order of questions and page breaks
  31   * addquestion  Adds a single question to the quiz
  32   * add          Adds several selected questions to the quiz
  33   * addrandom    Adds a certain number of random questions to the quiz
  34   * repaginate   Re-paginates the quiz
  35   * delete       Removes a question from the quiz
  36   * savechanges  Saves the order and grades for questions in the quiz
  37   *
  38   * @package    mod_quiz
  39   * @copyright  1999 onwards Martin Dougiamas and others {@link http://moodle.com}
  40   * @license    http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
  41   */
  42  
  43  
  44  require_once(__DIR__ . '/../../config.php');
  45  require_once($CFG->dirroot . '/mod/quiz/locallib.php');
  46  require_once($CFG->dirroot . '/mod/quiz/addrandomform.php');
  47  require_once($CFG->dirroot . '/question/editlib.php');
  48  
  49  // These params are only passed from page request to request while we stay on
  50  // this page otherwise they would go in question_edit_setup.
  51  $scrollpos = optional_param('scrollpos', '', PARAM_INT);
  52  
  53  list($thispageurl, $contexts, $cmid, $cm, $quiz, $pagevars) =
  54          question_edit_setup('editq', '/mod/quiz/edit.php', true);
  55  
  56  $defaultcategoryobj = question_make_default_categories($contexts->all());
  57  $defaultcategory = $defaultcategoryobj->id . ',' . $defaultcategoryobj->contextid;
  58  
  59  $quizhasattempts = quiz_has_attempts($quiz->id);
  60  
  61  $PAGE->set_url($thispageurl);
  62  $PAGE->set_secondary_active_tab("mod_quiz_edit");
  63  
  64  // Get the course object and related bits.
  65  $course = $DB->get_record('course', array('id' => $quiz->course), '*', MUST_EXIST);
  66  $quizobj = new quiz($quiz, $cm, $course);
  67  $structure = $quizobj->get_structure();
  68  
  69  // You need mod/quiz:manage in addition to question capabilities to access this page.
  70  require_capability('mod/quiz:manage', $contexts->lowest());
  71  
  72  // Process commands ============================================================.
  73  
  74  // Get the list of question ids had their check-boxes ticked.
  75  $selectedslots = array();
  76  $params = (array) data_submitted();
  77  foreach ($params as $key => $value) {
  78      if (preg_match('!^s([0-9]+)$!', $key, $matches)) {
  79          $selectedslots[] = $matches[1];
  80      }
  81  }
  82  
  83  $afteractionurl = new moodle_url($thispageurl);
  84  if ($scrollpos) {
  85      $afteractionurl->param('scrollpos', $scrollpos);
  86  }
  87  
  88  if (optional_param('repaginate', false, PARAM_BOOL) && confirm_sesskey()) {
  89      // Re-paginate the quiz.
  90      $structure->check_can_be_edited();
  91      $questionsperpage = optional_param('questionsperpage', $quiz->questionsperpage, PARAM_INT);
  92      quiz_repaginate_questions($quiz->id, $questionsperpage );
  93      quiz_delete_previews($quiz);
  94      redirect($afteractionurl);
  95  }
  96  
  97  if (($addquestion = optional_param('addquestion', 0, PARAM_INT)) && confirm_sesskey()) {
  98      // Add a single question to the current quiz.
  99      $structure->check_can_be_edited();
 100      quiz_require_question_use($addquestion);
 101      $addonpage = optional_param('addonpage', 0, PARAM_INT);
 102      quiz_add_quiz_question($addquestion, $quiz, $addonpage);
 103      quiz_delete_previews($quiz);
 104      quiz_update_sumgrades($quiz);
 105      $thispageurl->param('lastchanged', $addquestion);
 106      redirect($afteractionurl);
 107  }
 108  
 109  if (optional_param('add', false, PARAM_BOOL) && confirm_sesskey()) {
 110      $structure->check_can_be_edited();
 111      $addonpage = optional_param('addonpage', 0, PARAM_INT);
 112      // Add selected questions to the current quiz.
 113      $rawdata = (array) data_submitted();
 114      foreach ($rawdata as $key => $value) { // Parse input for question ids.
 115          if (preg_match('!^q([0-9]+)$!', $key, $matches)) {
 116              $key = $matches[1];
 117              quiz_require_question_use($key);
 118              quiz_add_quiz_question($key, $quiz, $addonpage);
 119          }
 120      }
 121      quiz_delete_previews($quiz);
 122      quiz_update_sumgrades($quiz);
 123      redirect($afteractionurl);
 124  }
 125  
 126  if ($addsectionatpage = optional_param('addsectionatpage', false, PARAM_INT)) {
 127      // Add a section to the quiz.
 128      $structure->check_can_be_edited();
 129      $structure->add_section_heading($addsectionatpage);
 130      quiz_delete_previews($quiz);
 131      redirect($afteractionurl);
 132  }
 133  
 134  if ((optional_param('addrandom', false, PARAM_BOOL)) && confirm_sesskey()) {
 135      // Add random questions to the quiz.
 136      $structure->check_can_be_edited();
 137      $recurse = optional_param('recurse', 0, PARAM_BOOL);
 138      $addonpage = optional_param('addonpage', 0, PARAM_INT);
 139      $categoryid = required_param('categoryid', PARAM_INT);
 140      $randomcount = required_param('randomcount', PARAM_INT);
 141      quiz_add_random_questions($quiz, $addonpage, $categoryid, $randomcount, $recurse);
 142  
 143      quiz_delete_previews($quiz);
 144      quiz_update_sumgrades($quiz);
 145      redirect($afteractionurl);
 146  }
 147  
 148  if (optional_param('savechanges', false, PARAM_BOOL) && confirm_sesskey()) {
 149  
 150      // If rescaling is required save the new maximum.
 151      $maxgrade = unformat_float(optional_param('maxgrade', '', PARAM_RAW_TRIMMED), true);
 152      if (is_float($maxgrade) && $maxgrade >= 0) {
 153          quiz_set_grade($maxgrade, $quiz);
 154          quiz_update_all_final_grades($quiz);
 155          quiz_update_grades($quiz, 0, true);
 156      }
 157  
 158      redirect($afteractionurl);
 159  }
 160  
 161  // Log this visit.
 162  $event = \mod_quiz\event\edit_page_viewed::create([
 163      'courseid' => $course->id,
 164      'context' => $contexts->lowest(),
 165      'other' => [
 166          'quizid' => $quiz->id
 167      ]
 168  ]);
 169  $event->trigger();
 170  
 171  // Get the question bank view.
 172  $questionbank = new mod_quiz\question\bank\custom_view($contexts, $thispageurl, $course, $cm, $quiz);
 173  $questionbank->set_quiz_has_attempts($quizhasattempts);
 174  
 175  // End of process commands =====================================================.
 176  
 177  $PAGE->set_pagelayout('incourse');
 178  $PAGE->set_pagetype('mod-quiz-edit');
 179  
 180  $output = $PAGE->get_renderer('mod_quiz', 'edit');
 181  
 182  $PAGE->set_title(get_string('editingquizx', 'quiz', format_string($quiz->name)));
 183  $PAGE->set_heading($course->fullname);
 184  $PAGE->activityheader->disable();
 185  $node = $PAGE->settingsnav->find('mod_quiz_edit', navigation_node::TYPE_SETTING);
 186  if ($node) {
 187      $node->make_active();
 188  }
 189  echo $OUTPUT->header();
 190  
 191  // Initialise the JavaScript.
 192  $quizeditconfig = new stdClass();
 193  $quizeditconfig->url = $thispageurl->out(true, array('qbanktool' => '0'));
 194  $quizeditconfig->dialoglisteners = array();
 195  $numberoflisteners = $DB->get_field_sql("
 196      SELECT COALESCE(MAX(page), 1)
 197        FROM {quiz_slots}
 198       WHERE quizid = ?", array($quiz->id));
 199  
 200  for ($pageiter = 1; $pageiter <= $numberoflisteners; $pageiter++) {
 201      $quizeditconfig->dialoglisteners[] = 'addrandomdialoglaunch_' . $pageiter;
 202  }
 203  
 204  $PAGE->requires->data_for_js('quiz_edit_config', $quizeditconfig);
 205  $PAGE->requires->js('/question/qengine.js');
 206  
 207  // Questions wrapper start.
 208  echo html_writer::start_tag('div', array('class' => 'mod-quiz-edit-content'));
 209  
 210  echo $output->edit_page($quizobj, $structure, $contexts, $thispageurl, $pagevars);
 211  
 212  // Questions wrapper end.
 213  echo html_writer::end_tag('div');
 214  
 215  echo $OUTPUT->footer();