Search moodle.org's
Developer Documentation

See Release Notes
Long Term Support Release

  • Bug fixes for general core bugs in 4.1.x will end 13 November 2023 (12 months).
  • Bug fixes for security issues in 4.1.x will end 10 November 2025 (36 months).
  • PHP version: minimum PHP 7.4.0 Note: minimum PHP version has increased since Moodle 4.0. PHP 8.0.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   * @package   moodlecore
  18   * @subpackage backup-imscc
  19   * @copyright 2009 Mauro Rondinelli (mauro.rondinelli [AT] uvcms.com)
  20   * @license   http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
  21   */
  22  defined('MOODLE_INTERNAL') or die('Direct access to this script is forbidden.');
  23  
  24  require_once($CFG->dirroot . '/backup/cc/includes/constants.php');
  25  require_once($CFG->dirroot . '/backup/cc/cc2moodle.php');
  26  
  27  function cc_convert ($dir) {
  28      global $OUTPUT;
  29  
  30      $manifest_file = $dir . DIRECTORY_SEPARATOR . 'imsmanifest.xml';
  31      $moodle_file = $dir . DIRECTORY_SEPARATOR . 'moodle.xml';
  32      $schema_file = 'cc' . DIRECTORY_SEPARATOR . '' . DIRECTORY_SEPARATOR . 'schemas' . DIRECTORY_SEPARATOR . 'cclibxml2validator.xsd';
  33  
  34      if (is_readable($manifest_file) && !is_readable($moodle_file)) {
  35  
  36          $is_cc = detect_cc_format($manifest_file);
  37  
  38          if ($is_cc) {
  39  
  40              $detected_requirements = detect_requirements();
  41  
  42              if (!$detected_requirements["php5"]) {
  43                  echo $OUTPUT->notification(get_string('cc_import_req_php5', 'imscc'));
  44                  return false;
  45              }
  46  
  47              if (!$detected_requirements["dom"]) {
  48                  echo $OUTPUT->notification(get_string('cc_import_req_dom', 'imscc'));
  49                  return false;
  50              }
  51  
  52              if (!$detected_requirements["libxml"]) {
  53                  echo $OUTPUT->notification(get_string('cc_import_req_libxml', 'imscc'));
  54                  return false;
  55              }
  56  
  57              if (!$detected_requirements["libxmlminversion"]) {
  58                  echo $OUTPUT->notification(get_string('cc_import_req_libxmlminversion', 'imscc'));
  59                  return false;
  60              }
  61              if (!$detected_requirements["xsl"]) {
  62                  echo $OUTPUT->notification(get_string('cc_import_req_xsl', 'imscc'));
  63                  return false;
  64              }
  65  
  66              echo get_string('cc2moodle_checking_schema', 'imscc') . '<br />';
  67  
  68              $cc_manifest = new DOMDocument();
  69  
  70              if ($cc_manifest->load($manifest_file)) {
  71                  if ($cc_manifest->schemaValidate($schema_file)) {
  72  
  73                      echo get_string('cc2moodle_valid_schema', 'imscc') . '<br />';
  74  
  75                      $cc2moodle = new cc2moodle($manifest_file);
  76  
  77                      if (!$cc2moodle->is_auth()) {
  78                          return $cc2moodle->generate_moodle_xml();
  79                      } else {
  80                          echo $OUTPUT->notification(get_string('cc2moodle_req_auth', 'imscc'));
  81                          return false;
  82                      }
  83  
  84                  } else {
  85                      echo $OUTPUT->notification(get_string('cc2moodle_invalid_schema', 'imscc'));
  86                      return false;
  87                  }
  88  
  89              } else {
  90                  echo $OUTPUT->notification(get_string('cc2moodle_manifest_dont_load', 'imscc'));
  91                  return false;
  92              }
  93          }
  94      }
  95  
  96      return true;
  97  }
  98  
  99  function detect_requirements () {
 100  
 101      if (floor(phpversion()) >= 5) {
 102          $detected["php5"] = true;
 103      } else {
 104          $detected["php5"] = false;
 105      }
 106  
 107      $detected["xsl"] = extension_loaded('xsl');
 108      $detected['dom'] = extension_loaded('dom');
 109      $detected['libxml'] = extension_loaded('libxml');
 110      $detected['libxmlminversion'] = extension_loaded('libxml') && version_compare(LIBXML_DOTTED_VERSION, '2.6.30', '>=');
 111  
 112      return $detected;
 113  
 114  }
 115  
 116  function detect_cc_format ($xml_file) {
 117  
 118      $inpos = 0;
 119      $xml_snippet = file_get_contents($xml_file, 0, NULL, 0, 500);
 120  
 121      if (!empty($xml_snippet)) {
 122  
 123          $xml_snippet = strtolower($xml_snippet);
 124          $xml_snippet = preg_replace('/\s*/m', '', $xml_snippet);
 125          $xml_snippet = str_replace("'", '', $xml_snippet);
 126          $xml_snippet = str_replace('"', '', $xml_snippet);
 127  
 128          $search_string = "xmlns=" . NS_COMMON_CARTRIDGE;
 129  
 130          $inpos = strpos($xml_snippet, $search_string);
 131  
 132          if ($inpos) {
 133              return true;
 134          } else {
 135              return false;
 136          }
 137  
 138      } else {
 139          return false;
 140      }
 141  
 142  }