Search moodle.org's
Developer Documentation

See Release Notes

  • Bug fixes for general core bugs in 3.11.x will end 14 Nov 2022 (12 months plus 6 months extension).
  • Bug fixes for security issues in 3.11.x will end 13 Nov 2023 (18 months plus 12 months extension).
  • PHP version: minimum PHP 7.3.0 Note: minimum PHP version has increased since Moodle 3.10. PHP 7.4.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   * Contains class mod_h5pactivity\output\result\choice
  19   *
  20   * @package   mod_h5pactivity
  21   * @copyright 2020 Ferran Recio
  22   * @license   http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
  23   */
  24  
  25  namespace mod_h5pactivity\output\result;
  26  
  27  defined('MOODLE_INTERNAL') || die();
  28  
  29  use mod_h5pactivity\output\result;
  30  use renderer_base;
  31  
  32  /**
  33   * Class to display H5P choice result.
  34   *
  35   * @copyright 2020 Ferran Recio
  36   * @license   http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
  37   */
  38  class choice extends result {
  39  
  40      /**
  41       * Return the options data structure.
  42       *
  43       * @return array of options
  44       */
  45      protected function export_options(): ?array {
  46  
  47          // Suppose H5P choices have only a single list of valid answers.
  48          $correctpattern = reset($this->correctpattern);
  49          if (empty($correctpattern)) {
  50              $correctpattern = [];
  51          }
  52  
  53          $additionals = $this->additionals;
  54  
  55          // H5P has a special extension for long choices.
  56          $extensions = (array) $additionals->extensions ?? [];
  57          $filter = isset($extensions['https://h5p.org/x-api/line-breaks']) ? true : false;
  58  
  59          if (isset($additionals->choices)) {
  60              $options = $this->get_descriptions($additionals->choices);
  61          } else {
  62              $options = [];
  63          }
  64  
  65          // Some H5P activities like Find the Words don't user the standard CMI format delimiter
  66          // and don't use propper choice additionals. In those cases the report needs to fix this
  67          // using the correct pattern as choices and using a non standard delimiter.
  68          if (empty($options)) {
  69              if (count($correctpattern) == 1) {
  70                  $correctpattern = explode(',', reset($correctpattern));
  71              }
  72              foreach ($correctpattern as $value) {
  73                  $option = (object)[
  74                      'id' => $value,
  75                      'description' => $value,
  76                  ];
  77                  $options[$value] = $option;
  78              }
  79          }
  80  
  81          foreach ($options as $key => $value) {
  82              $correctstate = (in_array($key, $correctpattern)) ? parent::CHECKED : parent::UNCHECKED;
  83              if (in_array($key, $this->response)) {
  84                  $answerstate = ($correctstate == parent::CHECKED) ? parent::PASS : parent::FAIL;
  85                  // In some cases, like Branching scenario H5P activity, no correct Pattern is provided
  86                  // so any answer is just a check.
  87                  if (empty($correctpattern)) {
  88                      $answerstate = parent::CHECKED;
  89                  }
  90                  $value->useranswer = $this->get_answer($answerstate);
  91              }
  92              $value->correctanswer = $this->get_answer($correctstate);
  93  
  94              if ($filter && $correctstate == parent::UNCHECKED && !isset($value->useranswer)) {
  95                  unset($options[$key]);
  96              }
  97          }
  98  
  99          return $options;
 100      }
 101  }