Search moodle.org's
Developer Documentation

See Release Notes
Long Term Support Release

  • Bug fixes for general core bugs in 3.9.x will end* 10 May 2021 (12 months).
  • Bug fixes for security issues in 3.9.x will end* 8 May 2023 (36 months).
  • PHP version: minimum PHP 7.2.0 Note: minimum PHP version has increased since Moodle 3.8. PHP 7.3.x and 7.4.x are supported too.

Differences Between: [Versions 39 and 310] [Versions 39 and 311] [Versions 39 and 400] [Versions 39 and 401] [Versions 39 and 402] [Versions 39 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   * Question type class for the essay question type.
  19   *
  20   * @package    qtype
  21   * @subpackage essay
  22   * @copyright  2005 Mark Nielsen
  23   * @license    http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
  24   */
  25  
  26  
  27  defined('MOODLE_INTERNAL') || die();
  28  
  29  require_once($CFG->libdir . '/questionlib.php');
  30  
  31  
  32  /**
  33   * The essay question type.
  34   *
  35   * @copyright  2005 Mark Nielsen
  36   * @license    http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
  37   */
  38  class qtype_essay extends question_type {
  39      public function is_manual_graded() {
  40          return true;
  41      }
  42  
  43      public function response_file_areas() {
  44          return array('attachments', 'answer');
  45      }
  46  
  47      public function get_question_options($question) {
  48          global $DB;
  49          $question->options = $DB->get_record('qtype_essay_options',
  50                  array('questionid' => $question->id), '*', MUST_EXIST);
  51          parent::get_question_options($question);
  52      }
  53  
  54      public function save_question_options($formdata) {
  55          global $DB;
  56          $context = $formdata->context;
  57  
  58          $options = $DB->get_record('qtype_essay_options', array('questionid' => $formdata->id));
  59          if (!$options) {
  60              $options = new stdClass();
  61              $options->questionid = $formdata->id;
  62              $options->id = $DB->insert_record('qtype_essay_options', $options);
  63          }
  64  
  65          $options->responseformat = $formdata->responseformat;
  66          $options->responserequired = $formdata->responserequired;
  67          $options->responsefieldlines = $formdata->responsefieldlines;
  68          $options->attachments = $formdata->attachments;
  69          $options->attachmentsrequired = $formdata->attachmentsrequired;
  70          if (!isset($formdata->filetypeslist)) {
  71              $options->filetypeslist = null;
  72          } else {
  73              $options->filetypeslist = $formdata->filetypeslist;
  74          }
  75          $options->graderinfo = $this->import_or_save_files($formdata->graderinfo,
  76                  $context, 'qtype_essay', 'graderinfo', $formdata->id);
  77          $options->graderinfoformat = $formdata->graderinfo['format'];
  78          $options->responsetemplate = $formdata->responsetemplate['text'];
  79          $options->responsetemplateformat = $formdata->responsetemplate['format'];
  80          $DB->update_record('qtype_essay_options', $options);
  81      }
  82  
  83      protected function initialise_question_instance(question_definition $question, $questiondata) {
  84          parent::initialise_question_instance($question, $questiondata);
  85          $question->responseformat = $questiondata->options->responseformat;
  86          $question->responserequired = $questiondata->options->responserequired;
  87          $question->responsefieldlines = $questiondata->options->responsefieldlines;
  88          $question->attachments = $questiondata->options->attachments;
  89          $question->attachmentsrequired = $questiondata->options->attachmentsrequired;
  90          $question->graderinfo = $questiondata->options->graderinfo;
  91          $question->graderinfoformat = $questiondata->options->graderinfoformat;
  92          $question->responsetemplate = $questiondata->options->responsetemplate;
  93          $question->responsetemplateformat = $questiondata->options->responsetemplateformat;
  94          $filetypesutil = new \core_form\filetypes_util();
  95          $question->filetypeslist = $filetypesutil->normalize_file_types($questiondata->options->filetypeslist);
  96      }
  97  
  98      public function delete_question($questionid, $contextid) {
  99          global $DB;
 100  
 101          $DB->delete_records('qtype_essay_options', array('questionid' => $questionid));
 102          parent::delete_question($questionid, $contextid);
 103      }
 104  
 105      /**
 106       * @return array the different response formats that the question type supports.
 107       * internal name => human-readable name.
 108       */
 109      public function response_formats() {
 110          return array(
 111              'editor' => get_string('formateditor', 'qtype_essay'),
 112              'editorfilepicker' => get_string('formateditorfilepicker', 'qtype_essay'),
 113              'plain' => get_string('formatplain', 'qtype_essay'),
 114              'monospaced' => get_string('formatmonospaced', 'qtype_essay'),
 115              'noinline' => get_string('formatnoinline', 'qtype_essay'),
 116          );
 117      }
 118  
 119      /**
 120       * @return array the choices that should be offerd when asking if a response is required
 121       */
 122      public function response_required_options() {
 123          return array(
 124              1 => get_string('responseisrequired', 'qtype_essay'),
 125              0 => get_string('responsenotrequired', 'qtype_essay'),
 126          );
 127      }
 128  
 129      /**
 130       * @return array the choices that should be offered for the input box size.
 131       */
 132      public function response_sizes() {
 133          $choices = array();
 134          for ($lines = 5; $lines <= 40; $lines += 5) {
 135              $choices[$lines] = get_string('nlines', 'qtype_essay', $lines);
 136          }
 137          return $choices;
 138      }
 139  
 140      /**
 141       * @return array the choices that should be offered for the number of attachments.
 142       */
 143      public function attachment_options() {
 144          return array(
 145              0 => get_string('no'),
 146              1 => '1',
 147              2 => '2',
 148              3 => '3',
 149              -1 => get_string('unlimited'),
 150          );
 151      }
 152  
 153      /**
 154       * @return array the choices that should be offered for the number of required attachments.
 155       */
 156      public function attachments_required_options() {
 157          return array(
 158              0 => get_string('attachmentsoptional', 'qtype_essay'),
 159              1 => '1',
 160              2 => '2',
 161              3 => '3'
 162          );
 163      }
 164  
 165      public function move_files($questionid, $oldcontextid, $newcontextid) {
 166          parent::move_files($questionid, $oldcontextid, $newcontextid);
 167          $fs = get_file_storage();
 168          $fs->move_area_files_to_new_context($oldcontextid,
 169                  $newcontextid, 'qtype_essay', 'graderinfo', $questionid);
 170      }
 171  
 172      protected function delete_files($questionid, $contextid) {
 173          parent::delete_files($questionid, $contextid);
 174          $fs = get_file_storage();
 175          $fs->delete_area_files($contextid, 'qtype_essay', 'graderinfo', $questionid);
 176      }
 177  }