. /** * Defines the question behaviour type base class * * @package core * @subpackage questionbehaviours * @copyright 2012 The Open University * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later */ defined('MOODLE_INTERNAL') || die(); /** * This class represents the type of behaviour, rather than the instance of the * behaviour which control a particular question attempt. * * @copyright 2012 The Open University * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later */ abstract class question_behaviour_type { /** * Certain behaviours are definitive of a way that questions can behave when * attempted. For example deferredfeedback model, interactive model, etc. * These are the options that should be listed in the user-interface, and * for these behaviours this method should return true. Other behaviours are * more implementation details, for example the informationitem behaviours, * or a special subclass like interactive_adapted_for_my_qtype. These * behaviours should return false. * @return bool whether this is an archetypal behaviour. */ public function is_archetypal() { return false; } /** * Override this method if there are some display options that do not make * sense 'during the attempt'. * @return array of {@link question_display_options} field names, that are * not relevant to this behaviour before a 'finish' action. */ public function get_unused_display_options() { return array(); } /** * With this behaviour, is it possible that a question might finish as the student * interacts with it, without a call to the {@link question_attempt::finish()} method? * @return bool whether with this behaviour, questions may finish naturally. */ public function can_questions_finish_during_the_attempt() { return false; } /** * Adjust a random guess score for a question using this model. You have to * do this without knowing details of the specific question, or which usage * it is in. * @param number $fraction the random guess score from the question type. * @return number the adjusted fraction. */ public function adjust_random_guess_score($fraction) { return $fraction; } /** * Get summary information about a queston usage. * * Behaviours are not obliged to do anything here, but this is an opportunity * to provide additional information that can be displayed in places like * at the top of the quiz review page. * * In the return value, the array keys should be identifiers of the form * qbehaviour_behaviourname_meaningfullkey. For qbehaviour_deferredcbm_highsummary. * The values should be arrays with two items, title and content. Each of these * should be either a string, or a renderable. * * To understand how to implement this method, look at the CBM behaviours, * and their unit tests. * * @param question_usage_by_activity $quba the usage to provide summary data for. * @return array as described above. */ public function summarise_usage(question_usage_by_activity $quba, question_display_options $options) { return array(); } /** * Does this question behaviour accept multiple submissions of responses within one attempt eg. multiple tries for the * interactive or adaptive question behaviours. * * @return bool */ public function allows_multiple_submitted_responses() { return false; } } /** * This class exists to allow behaviours that worked in Moodle 2.3 to continue * to work. It implements the question_behaviour_type API for the other behaviour * as much as possible in a backwards-compatible way. * * @copyright 2012 The Open University * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later */ class question_behaviour_type_fallback extends question_behaviour_type { /** @var string the behaviour class name. */ protected $behaviourclass; /** * @param string $behaviourtype the type of behaviour we are providing a fallback for. */ public function __construct($behaviour) { question_engine::load_behaviour_class($behaviour); $this->behaviourclass = 'qbehaviour_' . $behaviour; } public function is_archetypal() { return constant($this->behaviourclass . '::IS_ARCHETYPAL'); } /** * Override this method if there are some display options that do not make * sense 'during the attempt'. * @return array of {@link question_display_options} field names, that are * not relevant to this behaviour before a 'finish' action. */ public function get_unused_display_options() { return call_user_func(array($this->behaviourclass, 'get_unused_display_options')); } /** * Adjust a random guess score for a question using this model. You have to * do this without knowing details of the specific question, or which usage * it is in. * @param number $fraction the random guess score from the question type. * @return number the adjusted fraction. */ public function adjust_random_guess_score($fraction) { return call_user_func(array($this->behaviourclass, 'adjust_random_guess_score'), $fraction); } }