3 // This file is part of Moodle - http://moodle.org/
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.
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.
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/>.
19 * @subpackage backup-imscc
20 * @copyright 2011 Darko Miletic (dmiletic@moodlerooms.com)
21 * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
24 defined('MOODLE_INTERNAL') or die('Direct access to this script is forbidden.');
26 require_once($CFG->dirroot
. '/backup/cc/cc2moodle.php');
27 require_once($CFG->dirroot
. '/backup/cc/entities11.class.php');
28 require_once($CFG->dirroot
. '/backup/cc/entity11.resource.class.php');
29 require_once($CFG->dirroot
. '/backup/cc/entity11.forum.class.php');
30 require_once($CFG->dirroot
. '/backup/cc/entity11.quiz.class.php');
31 require_once($CFG->dirroot
. '/backup/cc/entity11.lti.class.php');
33 class cc112moodle
extends cc2moodle
{
34 const CC_TYPE_FORUM
= 'imsdt_xmlv1p1';
35 const CC_TYPE_QUIZ
= 'imsqti_xmlv1p2/imscc_xmlv1p1/assessment';
36 const CC_TYPE_QUESTION_BANK
= 'imsqti_xmlv1p2/imscc_xmlv1p1/question-bank';
37 const CC_TYPE_WEBLINK
= 'imswl_xmlv1p1';
38 const CC_TYPE_ASSOCIATED_CONTENT
= 'associatedcontent/imscc_xmlv1p1/learning-application-resource';
39 const CC_TYPE_BASICLTI
= 'imsbasiclti_xmlv1p0';
41 public static $namespaces = array('imscc' => 'http://www.imsglobal.org/xsd/imsccv1p1/imscp_v1p1',
42 'lomimscc' => 'http://ltsc.ieee.org/xsd/imsccv1p1/LOM/manifest',
43 'lom' => 'http://ltsc.ieee.org/xsd/imsccv1p1/LOM/resource',
44 'xsi' => 'http://www.w3.org/2001/XMLSchema-instance',
45 'cc' => 'http://www.imsglobal.org/xsd/imsccv1p1/imsccauth_v1p1');
47 public static $restypes = array('associatedcontent/imscc_xmlv1p1/learning-application-resource', 'webcontent');
48 public static $forumns = array('dt' => 'http://www.imsglobal.org/xsd/imsccv1p1/imsdt_v1p1');
49 public static $quizns = array('xmlns' => 'http://www.imsglobal.org/xsd/ims_qtiasiv1p2');
50 public static $resourcens = array('wl' => 'http://www.imsglobal.org/xsd/imsccv1p1/imswl_v1p1');
51 public static $basicltins = array(
52 'xmlns' => 'http://www.imsglobal.org/xsd/imslticc_v1p0',
53 'blti' => 'http://www.imsglobal.org/xsd/imsbasiclti_v1p0',
54 'lticm' => 'http://www.imsglobal.org/xsd/imslticm_v1p0',
55 'lticp' => 'http://www.imsglobal.org/xsd/imslticp_v1p0'
59 public function __construct($path_to_manifest) {
60 parent
::__construct($path_to_manifest);
63 public function generate_moodle_xml () {
66 $cdir = static::$path_to_manifest_folder . DIRECTORY_SEPARATOR
. 'course_files';
68 if (!file_exists($cdir)) {
69 mkdir($cdir, $CFG->directorypermissions
, true);
72 $sheet_base = static::loadsheet(SHEET_BASE
);
74 // MOODLE_BACKUP / INFO / DETAILS / MOD
75 $node_info_details_mod = $this->create_code_info_details_mod();
77 // MOODLE_BACKUP / BLOCKS / BLOCK
78 $node_course_blocks_block = $this->create_node_course_blocks_block();
80 // MOODLE_BACKUP / COURSES / SECTIONS / SECTION
81 $node_course_sections_section = $this->create_node_course_sections_section();
83 // MOODLE_BACKUP / COURSES / QUESTION_CATEGORIES
84 $node_course_question_categories = $this->create_node_question_categories();
86 // MOODLE_BACKUP / COURSES / MODULES / MOD
87 $node_course_modules_mod = $this->create_node_course_modules_mod();
89 // MOODLE_BACKUP / COURSE / HEADER
90 $node_course_header = $this->create_node_course_header();
93 $filename = optional_param('file', 'not_available.zip', PARAM_RAW
);
94 $filename = basename($filename);
96 $www_root = $CFG->wwwroot
;
98 $find_tags = array('[#zip_filename#]',
100 '[#node_course_header#]',
101 '[#node_info_details_mod#]',
102 '[#node_course_blocks_block#]',
103 '[#node_course_sections_section#]',
104 '[#node_course_question_categories#]',
105 '[#node_course_modules#]');
107 $replace_values = array($filename,
110 $node_info_details_mod,
111 $node_course_blocks_block,
112 $node_course_sections_section,
113 $node_course_question_categories,
114 $node_course_modules_mod);
116 $result_xml = str_replace($find_tags, $replace_values, $sheet_base);
118 // COPY RESOURSE FILES
119 $entities = new entities11();
121 $entities->move_all_files();
123 if (array_key_exists("index", self
::$instances)) {
125 if (!file_put_contents(static::$path_to_manifest_folder . DIRECTORY_SEPARATOR
. 'moodle.xml', $result_xml)) {
126 static::log_action('Cannot save the moodle manifest file: ' . static::$path_to_tmp_folder . DIRECTORY_SEPARATOR
. 'moodle.xml', true);
133 static::log_action('The course is empty', false);
140 public function convert_to_moodle_type ($cc_type) {
141 $type = parent
::convert_to_moodle_type($cc_type);
143 if ($type == TYPE_UNKNOWN
) {
144 if ($cc_type == static::CC_TYPE_BASICLTI
) {
145 $type = MOODLE_TYPE_LTI
;
152 protected function create_node_question_categories () {
154 $quiz = new cc11_quiz();
156 static::log_action('Creating node: QUESTION_CATEGORIES');
158 $node_course_question_categories = $quiz->generate_node_question_categories();
160 return $node_course_question_categories;
163 protected function create_code_info_details_mod () {
164 $result = parent
::create_code_info_details_mod();
166 $count_blti = $this->count_instances(MOODLE_TYPE_LTI
);
168 $sheet_info_details_mod_instances_instance = static::loadsheet(SHEET_INFO_DETAILS_MOD_INSTANCE
);
172 if ($count_blti > 0) {
173 $blti_instance = $this->create_mod_info_details_mod_instances_instance($sheet_info_details_mod_instances_instance, $count_blti, static::$instances['instances'][MOODLE_TYPE_LTI
]);
174 $blti_mod = $blti_instance ?
$this->create_mod_info_details_mod(MOODLE_TYPE_LTI
, $blti_instance) : '';
177 return $result . $blti_mod;
182 * @see cc2moodle::get_module_visible()
184 protected function get_module_visible($identifier) {
185 //Should item be hidden or not
187 if (!empty($identifier)) {
188 $xpath = static::newx_path(static::$manifest, static::$namespaces);
189 $query = '/imscc:manifest/imscc:resources/imscc:resource[@identifier="' . $identifier . '"]';
190 $query .= '//lom:intendedEndUserRole/lom:value';
191 $intendeduserrole = $xpath->query($query);
192 if (!empty($intendeduserrole) && ($intendeduserrole->length
> 0)) {
193 $role = trim($intendeduserrole->item(0)->nodeValue
);
194 if ((strcasecmp('Instructor', $role) === 0) ||
(strcasecmp('Mentor', $role) === 0)) {
202 protected function create_node_course_modules_mod () {
203 $labels = new cc_label();
204 $resources = new cc11_resource();
205 $forums = new cc11_forum();
206 $quiz = new cc11_quiz();
207 $basiclti = new cc11_lti();
209 static::log_action('Creating node: COURSE/MODULES/MOD');
212 $node_course_modules_mod_label = $labels->generate_node();
214 // RESOURCES (WEB CONTENT AND WEB LINK)
215 $node_course_modules_mod_resource = $resources->generate_node();
218 $node_course_modules_mod_forum = $forums->generate_node();
221 $node_course_modules_mod_quiz = $quiz->generate_node_course_modules_mod();
224 $node_course_modules_mod_basiclti = $basiclti->generate_node();
226 $node_course_modules = $node_course_modules_mod_label.
227 $node_course_modules_mod_resource .
228 $node_course_modules_mod_forum .
229 $node_course_modules_mod_quiz .
230 $node_course_modules_mod_basiclti;
232 return $node_course_modules;