Search moodle.org's
Developer Documentation

See Release Notes

  • Bug fixes for general core bugs in 4.0.x will end 8 May 2023 (12 months).
  • Bug fixes for security issues in 4.0.x will end 13 November 2023 (18 months).
  • PHP version: minimum PHP 7.3.0 Note: the minimum PHP version has increased since Moodle 3.10. PHP 7.4.x is also supported.
   1  <?php
   2  
   3  // This file is part of Moodle - http://moodle.org/
   4  //
   5  // Moodle is free software: you can redistribute it and/or modify
   6  // it under the terms of the GNU General Public License as published by
   7  // the Free Software Foundation, either version 3 of the License, or
   8  // (at your option) any later version.
   9  //
  10  // Moodle is distributed in the hope that it will be useful,
  11  // but WITHOUT ANY WARRANTY; without even the implied warranty of
  12  // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  13  // GNU General Public License for more details.
  14  //
  15  // You should have received a copy of the GNU General Public License
  16  // along with Moodle.  If not, see <http://www.gnu.org/licenses/>.
  17  
  18  /**
  19   * Provides support for the conversion of moodle1 backup to the moodle2 format
  20   *
  21   * @package    workshopform_rubric
  22   * @copyright  2011 David Mudrak <david@moodle.com>
  23   * @license    http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
  24   */
  25  
  26  defined('MOODLE_INTERNAL') || die();
  27  
  28  /**
  29   * Conversion handler for the rubric grading strategy data
  30   */
  31  class moodle1_workshopform_rubric_handler extends moodle1_workshopform_handler {
  32  
  33      /** @var array legacy elements to process */
  34      protected $elements = array();
  35  
  36      /** @var array legacy rubrics records to process */
  37      protected $rubrics = array();
  38  
  39      /**
  40       * Prepare to gather legacy elements info for a new workshop instance
  41       */
  42      public function on_elements_start() {
  43          $this->elements = array();
  44          $this->rubrics = array();
  45      }
  46  
  47      /**
  48       * Processes one <ELEMENT>
  49       *
  50       * @param array $data legacy element data
  51       * @param array $raw raw element data
  52       */
  53      public function process_legacy_element(array $data, array $raw) {
  54          $this->elements[] = $data;
  55          $this->rubrics[$data['id']] = array();
  56      }
  57  
  58      /**
  59       * Processes one <RUBRIC>
  60       */
  61      public function process_legacy_rubric($data, $raw) {
  62          $this->rubrics[$data['elementid']][] = $data;
  63      }
  64  
  65      /**
  66       * Processes gathered elements and rubrics
  67       */
  68      public function on_elements_end() {
  69  
  70          $numofrubrics = 0;
  71          foreach ($this->rubrics as $itemid => $levels) {
  72              $numofrubrics += count($levels);
  73          }
  74  
  75          if ($numofrubrics == 0) {
  76              $this->convert_legacy_criterion_elements();
  77  
  78          } else {
  79              $this->convert_legacy_rubric_elements();
  80          }
  81      }
  82  
  83      /**
  84       * Processes gathered elements coming from the legacy criterion strategy
  85       *
  86       * Legacy criterion strategy is converted to a rubric with single rubric item
  87       * and the layout set to 'list'.
  88       */
  89      protected function convert_legacy_criterion_elements() {
  90  
  91          $this->write_xml('workshopform_rubric_config', array('layout' => 'list'));
  92  
  93          $firstelement = reset($this->elements);
  94          if ($firstelement === false) {
  95              // no elements defined in moodle.xml
  96              return;
  97          }
  98  
  99          // write the xml describing the artificial single rubric item
 100          $this->xmlwriter->begin_tag('workshopform_rubric_dimension', array('id' => $firstelement['id']));
 101          $this->xmlwriter->full_tag('sort', 1);
 102          $this->xmlwriter->full_tag('description', trim(get_string('dimensionnumber', 'workshopform_rubric', '')));
 103          $this->xmlwriter->full_tag('descriptionformat', FORMAT_HTML);
 104  
 105          foreach ($this->elements as $element) {
 106              $this->write_xml('workshopform_rubric_level', array(
 107                  'id'               => $element['id'],
 108                  'grade'            => $element['maxscore'],
 109                  'definition'       => $element['description'],
 110                  'definitionformat' => FORMAT_HTML
 111              ), array('/workshopform_rubric_level/id'));
 112          }
 113  
 114          $this->xmlwriter->end_tag('workshopform_rubric_dimension');
 115      }
 116  
 117      /**
 118       * Processes gathered elements coming from the legacy rubric strategy
 119       */
 120      protected function convert_legacy_rubric_elements() {
 121          $this->write_xml('workshopform_rubric_config', array('layout' => 'grid'));
 122  
 123          foreach ($this->elements as $element) {
 124              $this->xmlwriter->begin_tag('workshopform_rubric_dimension', array('id' => $element['id']));
 125              $this->xmlwriter->full_tag('sort', $element['elementno']);
 126              $this->xmlwriter->full_tag('description', $element['description']);
 127              $this->xmlwriter->full_tag('descriptionformat', FORMAT_HTML);
 128  
 129              foreach ($this->rubrics[$element['id']] as $rubric) {
 130                  $fakerecord          = new stdClass();
 131                  $fakerecord->rgrade  = $rubric['rubricno'];
 132                  $fakerecord->eweight = $element['weight'];
 133                  $fakerecord->rdesc   = $rubric['description'];
 134                  $level = (array)workshopform_rubric_upgrade_rubric_level($fakerecord, $element['id']);
 135                  unset($level['dimensionid']);
 136                  $level['id'] = $this->converter->get_nextid();
 137                  $this->write_xml('workshopform_rubric_level', $level, array('/workshopform_rubric_level/id'));
 138              }
 139  
 140              $this->xmlwriter->end_tag('workshopform_rubric_dimension');
 141          }
 142      }
 143  }
 144  
 145  /**
 146   * Transforms given record into an object to be saved into workshopform_rubric_levels
 147   *
 148   * This is used during Rubric 1.9 -> Rubric 2.0 conversion
 149   *
 150   * @param stdClass $old legacy record from joined workshop_elements_old + workshop_rubrics_old
 151   * @param int $newdimensionid id of the new workshopform_rubric dimension record to be linked to
 152   * @return stdclass to be saved in workshopform_rubric_levels
 153   */
 154  function workshopform_rubric_upgrade_rubric_level(stdclass $old, $newdimensionid) {
 155      $new = new stdclass();
 156      $new->dimensionid = $newdimensionid;
 157      $new->grade = $old->rgrade * workshopform_rubric_upgrade_weight($old->eweight);
 158      $new->definition = $old->rdesc;
 159      $new->definitionformat = FORMAT_HTML;
 160      return $new;
 161  }
 162  
 163  /**
 164   * Given old workshop element weight, returns the weight multiplier
 165   *
 166   * Negative weights are not supported any more and are replaced with weight = 0.
 167   * Legacy workshop did not store the raw weight but the index in the array
 168   * of weights (see $WORKSHOP_EWEIGHTS in workshop 1.x). workshop 2.0 uses
 169   * integer weights only (0-16) so all previous weights are multiplied by 4.
 170   *
 171   * @param $oldweight index in legacy $WORKSHOP_EWEIGHTS
 172   * @return int new weight
 173   */
 174  function workshopform_rubric_upgrade_weight($oldweight) {
 175  
 176      switch ($oldweight) {
 177          case 8: $weight = 1; break;
 178          case 9: $weight = 2; break;
 179          case 10: $weight = 3; break;
 180          case 11: $weight = 4; break;
 181          case 12: $weight = 6; break;
 182          case 13: $weight = 8; break;
 183          case 14: $weight = 16; break;
 184          default: $weight = 0;
 185      }
 186      return $weight;
 187  }