Search moodle.org's
Developer Documentation

See Release Notes

  • Bug fixes for general core bugs in 4.2.x will end 22 April 2024 (12 months).
  • Bug fixes for security issues in 4.2.x will end 7 October 2024 (18 months).
  • PHP version: minimum PHP 8.0.0 Note: minimum PHP version has increased since Moodle 4.1. PHP 8.1.x is supported too.
   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   * Defines the question behaviour type base class
  19   *
  20   * @package    core
  21   * @subpackage questionbehaviours
  22   * @copyright  2012 The Open University
  23   * @license    http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
  24   */
  25  
  26  
  27  defined('MOODLE_INTERNAL') || die();
  28  
  29  
  30  /**
  31   * This class represents the type of behaviour, rather than the instance of the
  32   * behaviour which control a particular question attempt.
  33   *
  34   * @copyright  2012 The Open University
  35   * @license    http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
  36   */
  37  abstract class question_behaviour_type {
  38      /**
  39       * Certain behaviours are definitive of a way that questions can behave when
  40       * attempted. For example deferredfeedback model, interactive model, etc.
  41       * These are the options that should be listed in the user-interface, and
  42       * for these behaviours this method should return true. Other behaviours are
  43       * more implementation details, for example the informationitem behaviours,
  44       * or a special subclass like interactive_adapted_for_my_qtype. These
  45       * behaviours should return false.
  46       * @return bool whether this is an archetypal behaviour.
  47       */
  48      public function is_archetypal() {
  49          return false;
  50      }
  51  
  52      /**
  53       * Override this method if there are some display options that do not make
  54       * sense 'during the attempt'.
  55       * @return array of {@link question_display_options} field names, that are
  56       * not relevant to this behaviour before a 'finish' action.
  57       */
  58      public function get_unused_display_options() {
  59          return array();
  60      }
  61  
  62      /**
  63       * With this behaviour, is it possible that a question might finish as the student
  64       * interacts with it, without a call to the {@link question_attempt::finish()} method?
  65       * @return bool whether with this behaviour, questions may finish naturally.
  66       */
  67      public function can_questions_finish_during_the_attempt() {
  68          return false;
  69      }
  70  
  71      /**
  72       * Adjust a random guess score for a question using this model. You have to
  73       * do this without knowing details of the specific question, or which usage
  74       * it is in.
  75       * @param number $fraction the random guess score from the question type.
  76       * @return number the adjusted fraction.
  77       */
  78      public function adjust_random_guess_score($fraction) {
  79          return $fraction;
  80      }
  81  
  82      /**
  83       * Get summary information about a queston usage.
  84       *
  85       * Behaviours are not obliged to do anything here, but this is an opportunity
  86       * to provide additional information that can be displayed in places like
  87       * at the top of the quiz review page.
  88       *
  89       * In the return value, the array keys should be identifiers of the form
  90       * qbehaviour_behaviourname_meaningfullkey. For qbehaviour_deferredcbm_highsummary.
  91       * The values should be arrays with two items, title and content. Each of these
  92       * should be either a string, or a renderable.
  93       *
  94       * To understand how to implement this method, look at the CBM behaviours,
  95       * and their unit tests.
  96       *
  97       * @param question_usage_by_activity $quba the usage to provide summary data for.
  98       * @return array as described above.
  99       */
 100      public function summarise_usage(question_usage_by_activity $quba,
 101              question_display_options $options) {
 102          return array();
 103      }
 104  
 105      /**
 106       * Does this question behaviour accept multiple submissions of responses within one attempt eg. multiple tries for the
 107       * interactive or adaptive question behaviours.
 108       *
 109       * @return bool
 110       */
 111      public function allows_multiple_submitted_responses() {
 112          return false;
 113      }
 114  }
 115  
 116  
 117  /**
 118   * This class exists to allow behaviours that worked in Moodle 2.3 to continue
 119   * to work. It implements the question_behaviour_type API for the other behaviour
 120   * as much as possible in a backwards-compatible way.
 121   *
 122   * @copyright  2012 The Open University
 123   * @license    http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
 124   */
 125  class question_behaviour_type_fallback extends question_behaviour_type {
 126  
 127      /** @var string the behaviour class name. */
 128      protected $behaviourclass;
 129  
 130      /**
 131       * @param string $behaviourtype the type of behaviour we are providing a fallback for.
 132       */
 133      public function __construct($behaviour) {
 134          question_engine::load_behaviour_class($behaviour);
 135          $this->behaviourclass = 'qbehaviour_' . $behaviour;
 136      }
 137  
 138      public function is_archetypal() {
 139          return constant($this->behaviourclass . '::IS_ARCHETYPAL');
 140      }
 141  
 142      /**
 143       * Override this method if there are some display options that do not make
 144       * sense 'during the attempt'.
 145       * @return array of {@link question_display_options} field names, that are
 146       * not relevant to this behaviour before a 'finish' action.
 147       */
 148      public function get_unused_display_options() {
 149          return call_user_func(array($this->behaviourclass, 'get_unused_display_options'));
 150      }
 151  
 152      /**
 153       * Adjust a random guess score for a question using this model. You have to
 154       * do this without knowing details of the specific question, or which usage
 155       * it is in.
 156       * @param number $fraction the random guess score from the question type.
 157       * @return number the adjusted fraction.
 158       */
 159      public function adjust_random_guess_score($fraction) {
 160          return call_user_func(array($this->behaviourclass, 'adjust_random_guess_score'),
 161                  $fraction);
 162      }
 163  }