[ Index ]

PHP Cross Reference of Moodle 1.9.3 [Build 15-Oct-2008]

title

Body

[close]

/question/ -> question.php (source)

   1  <?php // $Id: question.php,v 1.49.2.1 2007/11/02 16:20:23 tjhunt Exp $
   2  /**
   3   * Page for editing questions using the new form library.
   4   *
   5   * @author T.J.Hunt@open.ac.uk
   6   * @license http://www.gnu.org/copyleft/gpl.html GNU Public License
   7   * @package questionbank
   8   *//** */
   9  
  10  // Includes.
  11  require_once(dirname(__FILE__) . '/../config.php');
  12  require_once(dirname(__FILE__) . '/editlib.php');
  13  require_once($CFG->libdir . '/filelib.php');
  14  require_once($CFG->libdir . '/formslib.php');
  15  
  16  // Read URL parameters telling us which question to edit.
  17  $id = optional_param('id', 0, PARAM_INT); // question id
  18  $qtype = optional_param('qtype', '', PARAM_FILE);
  19  $categoryid = optional_param('category', 0, PARAM_INT);
  20  
  21  $cmid = optional_param('cmid', 0, PARAM_INT);
  22  $courseid = optional_param('courseid', 0, PARAM_INT);
  23  $wizardnow =  optional_param('wizardnow', '', PARAM_ALPHA);
  24  $movecontext =  optional_param('movecontext', 0, PARAM_BOOL);//switch to make question
  25                      //uneditable - form is displayed to edit category only
  26  $returnurl = optional_param('returnurl', 0, PARAM_LOCALURL);
  27  
  28  $inpopup = optional_param('inpopup', 0, PARAM_BOOL);
  29  
  30  if ($movecontext && !$id){
  31      print_error('questiondoesnotexist', 'question', $returnurl);
  32  }
  33  
  34  if ($cmid){
  35      list($module, $cm) = get_module_from_cmid($cmid);
  36      require_login($cm->course, false, $cm);
  37      $thiscontext = get_context_instance(CONTEXT_MODULE, $cmid);
  38  } elseif ($courseid) {
  39      require_login($courseid, false);
  40      $thiscontext = get_context_instance(CONTEXT_COURSE, $courseid);
  41      $module = null;
  42      $cm = null;
  43  } else {
  44      error('Need to pass courseid or cmid to this script.');
  45  }
  46  $contexts = new question_edit_contexts($thiscontext);
  47  
  48  
  49  if (!$returnurl) {
  50      $returnurl = "{$CFG->wwwroot}/question/edit.php?courseid={$COURSE->id}";
  51  }
  52  
  53  
  54  
  55  if ($id) {
  56      if (!$question = get_record('question', 'id', $id)) {
  57          print_error('questiondoesnotexist', 'question', $returnurl);
  58      }
  59      get_question_options($question);
  60  } else if ($categoryid && $qtype) { // only for creating new questions
  61      $question = new stdClass;
  62      $question->category = $categoryid;
  63      $question->qtype = $qtype;
  64  } else {
  65      print_error('notenoughdatatoeditaquestion', 'question', $returnurl);
  66  }
  67  
  68  // Validate the question category.
  69  if (!$category = get_record('question_categories', 'id', $question->category)) {
  70      print_error('categorydoesnotexist', 'question', $returnurl);
  71  }
  72  
  73  //permissions
  74  $question->formoptions = new object();
  75  
  76  $categorycontext = get_context_instance_by_id($category->contextid);
  77  $addpermission = has_capability('moodle/question:add', $categorycontext);
  78  
  79  if ($id) {
  80      $canview = question_has_capability_on($question, 'view');
  81      if ($movecontext){
  82          $question->formoptions->canedit = false;
  83          $question->formoptions->canmove = (question_has_capability_on($question, 'move') && $contexts->have_cap('moodle/question:add'));
  84          $question->formoptions->cansaveasnew = false;
  85          $question->formoptions->repeatelements = false;
  86          $question->formoptions->movecontext = true;
  87          $formeditable = true;
  88          question_require_capability_on($question, 'view');
  89      } else {
  90          $question->formoptions->canedit = question_has_capability_on($question, 'edit');
  91          $question->formoptions->canmove = (question_has_capability_on($question, 'move') && $addpermission);
  92          $question->formoptions->cansaveasnew = (($canview ||question_has_capability_on($question, 'edit')) && $addpermission);
  93          $question->formoptions->repeatelements = ($question->formoptions->canedit || $question->formoptions->cansaveasnew);
  94          $formeditable =  $question->formoptions->canedit || $question->formoptions->cansaveasnew || $question->formoptions->canmove;
  95          $question->formoptions->movecontext = false;
  96          if (!$formeditable){
  97              question_require_capability_on($question, 'view');
  98          }
  99      }
 100  
 101  
 102  } else  { // creating a new question
 103      require_capability('moodle/question:add', $categorycontext);
 104      $formeditable = true;
 105      $question->formoptions->repeatelements = true;
 106      $question->formoptions->movecontext = false;
 107  }
 108  
 109  
 110  // Validate the question type.
 111  if (!isset($QTYPES[$question->qtype])) {
 112      print_error('unknownquestiontype', 'question', $returnurl, $question->qtype);
 113  }
 114  $CFG->pagepath = 'question/type/' . $question->qtype;
 115  
 116  
 117  // Create the question editing form.
 118  if ($wizardnow!=='' && !$movecontext){
 119      if (!method_exists($QTYPES[$question->qtype], 'next_wizard_form')){
 120          print_error('missingimportantcode', 'question', $returnurl, 'wizard form definition');
 121      } else {
 122          $mform = $QTYPES[$question->qtype]->next_wizard_form('question.php', $question, $wizardnow, $formeditable);
 123      }
 124  } else {
 125      $mform = $QTYPES[$question->qtype]->create_editing_form('question.php', $question, $category, $contexts, $formeditable);
 126  }
 127  if ($mform === null) {
 128      print_error('missingimportantcode', 'question', $returnurl, 'question editing form definition for "'.$question->qtype.'"');
 129  }
 130  $toform = fullclone($question); // send the question object and a few more parameters to the form
 131  $toform->category = "$category->id,$category->contextid";
 132  if ($formeditable && $id){
 133      $toform->categorymoveto = $toform->category;
 134  }
 135  $toform->returnurl = $returnurl;
 136  $toform->movecontext = $movecontext;
 137  if ($cm !== null){
 138      $toform->cmid = $cm->id;
 139      $toform->courseid = $cm->course;
 140  } else {
 141      $toform->courseid = $COURSE->id;
 142  }
 143  $toform->inpopup = $inpopup;
 144  $mform->set_data($toform);
 145  
 146  if ($mform->is_cancelled()){
 147      if ($inpopup) {
 148          close_window();
 149      } else {
 150          redirect($returnurl);
 151      }
 152  } elseif ($fromform = $mform->get_data()){
 153      $returnurl = new moodle_url($returnurl);
 154      //select category that question has been saved in / moved to when we return to question bank
 155      if (!empty($fromform->categorymoveto)){
 156          $returnurl->param('category', $fromform->categorymoveto);
 157      } else if (!empty($fromform->category)){
 158          $returnurl->param('category', $fromform->category);
 159      }
 160      $returnurl = $returnurl->out();
 161      if (!empty($fromform->makecopy)) {
 162          $question->id = 0;  // causes a new question to be created.
 163          $question->hidden = 0; // Copies should not be hidden
 164      }
 165      if ($movecontext){
 166          list($tocatid, $tocontextid) = explode(',', $fromform->categorymoveto);
 167          $tocontext = get_context_instance_by_id($tocontextid);
 168          require_capability('moodle/question:add', $tocontext);
 169          if (get_filesdir_from_context($categorycontext) != get_filesdir_from_context($tocontext)){
 170              $movecontexturl  = new moodle_url($CFG->wwwroot.'/question/contextmoveq.php',
 171                                              array('returnurl' => $returnurl,
 172                                                      'ids'=>$question->id,
 173                                                      'tocatid'=> $tocatid));
 174              if ($cmid){
 175                  $movecontexturl->param('cmid', $cmid);
 176              } else {
 177                  $movecontexturl->param('courseid', $COURSE->id);
 178              }
 179              redirect($movecontexturl->out());
 180          }
 181      }
 182  
 183      $question = $QTYPES[$question->qtype]->save_question($question, $fromform, $COURSE, $wizardnow);
 184      if (($QTYPES[$question->qtype]->finished_edit_wizard($fromform)) || $movecontext){
 185          if ($inpopup) {
 186              notify(get_string('changessaved'), '');
 187              close_window(3);
 188          } else {
 189              redirect($returnurl);
 190          }
 191      } else {
 192          $nexturlparams = array('returnurl'=>$returnurl);
 193          if (isset($fromform->nextpageparam) && is_array($fromform->nextpageparam)){
 194              $nexturlparams += $fromform->nextpageparam;//useful for passing data to the next page which is not saved in the database
 195          }
 196          $nexturlparams['id'] = $question->id;
 197          $nexturlparams['wizardnow'] = $fromform->wizard;
 198          $nexturl = new moodle_url('question.php', $nexturlparams);
 199          if ($cmid){
 200              $nexturl->param('cmid', $cmid);
 201          } else {
 202              $nexturl->param('courseid', $COURSE->id);
 203          }
 204          redirect($nexturl->out());
 205      }
 206  } else {
 207  
 208      list($streditingquestion,) = $QTYPES[$question->qtype]->get_heading();
 209      if ($cm !== null) {
 210          $strmodule = get_string('modulename', $cm->modname);
 211          $strupdatemodule = has_capability('moodle/course:manageactivities', get_context_instance(CONTEXT_COURSE, $COURSE->id))
 212              ? update_module_button($cm->id, $cm->course, $strmodule)
 213              : "";
 214  
 215          $streditingmodule = get_string('editinga', 'moodle', $strmodule);
 216  
 217          $navlinks = array();
 218          $navlinks[] = array('name' => get_string('modulenameplural', $cm->modname), 'link' => "$CFG->wwwroot/mod/{$cm->modname}/index.php?id=$cm->course", 'type' => 'activity');
 219          $navlinks[] = array('name' => format_string($module->name), 'link' => "$CFG->wwwroot/mod/{$cm->modname}/view.php?id={$cm->id}", 'type' => 'title');
 220          if (stripos($returnurl, "$CFG->wwwroot/mod/{$cm->modname}/view.php")!== 0){
 221              //don't need this link if returnurl returns to view.php
 222              $navlinks[] = array('name' => $streditingmodule, 'link' => $returnurl, 'type' => 'title');
 223          }
 224          $navlinks[] = array('name' => $streditingquestion, 'link' => '', 'type' => 'title');
 225          $navigation = build_navigation($navlinks);
 226          print_header_simple($streditingquestion, '', $navigation, "", "", true, $strupdatemodule);
 227  
 228      } else {
 229          $navlinks = array();
 230          $navlinks[] = array('name' => get_string('editquestions', "quiz"), 'link' => $returnurl, 'type' => 'title');
 231          $navlinks[] = array('name' => $streditingquestion, 'link' => '', 'type' => 'title');
 232          $strediting = '<a href="edit.php?courseid='.$COURSE->id.'">'.
 233                  get_string("editquestions", "quiz").'</a> -> '.$streditingquestion;
 234          $navigation = build_navigation($navlinks);
 235          print_header_simple($streditingquestion, '', $navigation);
 236      }
 237  
 238  
 239      // Display a heading, question editing form and possibly some extra content needed for
 240      // for this question type.
 241      $QTYPES[$question->qtype]->display_question_editing_page($mform, $question, $wizardnow);
 242      print_footer($COURSE);
 243  }
 244  ?>


Generated: Wed Jan 14 11:33:29 2009 Cross-referenced by PHPXref 0.7