// Backup format
const FORMAT_MOODLE = 'moodle2';
const FORMAT_MOODLE1 = 'moodle1';
- const FORMAT_IMSCC = 'imscc';
+ const FORMAT_IMSCC1 = 'imscc1';
+ const FORMAT_IMSCC11 = 'imscc11';
const FORMAT_UNKNOWN = 'unknown';
// Interactive
--- /dev/null
+<?php
+
+// This file is part of Moodle - http://moodle.org/
+//
+// Moodle is free software: you can redistribute it and/or modify
+// it under the terms of the GNU General Public License as published by
+// the Free Software Foundation, either version 3 of the License, or
+// (at your option) any later version.
+//
+// Moodle is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+// GNU General Public License for more details.
+//
+// You should have received a copy of the GNU General Public License
+// along with Moodle. If not, see <http://www.gnu.org/licenses/>.
+/**
+ * @package moodlecore
+ * @subpackage backup-imscc
+ * @copyright 2011 Darko Miletic (dmiletic@moodlerooms.com)
+ * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
+ */
+
+defined('MOODLE_INTERNAL') or die('Direct access to this script is forbidden.');
+
+require_once($CFG->dirroot . '/backup/cc/cc2moodle.php');
+require_once($CFG->dirroot . '/backup/cc/entities11.class.php');
+require_once($CFG->dirroot . '/backup/cc/entity11.resource.class.php');
+require_once($CFG->dirroot . '/backup/cc/entity11.forum.class.php');
+require_once($CFG->dirroot . '/backup/cc/entity11.quiz.class.php');
+require_once($CFG->dirroot . '/backup/cc/entity11.lti.class.php');
+
+class cc112moodle extends cc2moodle {
+ const CC_TYPE_FORUM = 'imsdt_xmlv1p1';
+ const CC_TYPE_QUIZ = 'imsqti_xmlv1p2/imscc_xmlv1p1/assessment';
+ const CC_TYPE_QUESTION_BANK = 'imsqti_xmlv1p2/imscc_xmlv1p1/question-bank';
+ const CC_TYPE_WEBLINK = 'imswl_xmlv1p1';
+ const CC_TYPE_ASSOCIATED_CONTENT = 'associatedcontent/imscc_xmlv1p1/learning-application-resource';
+ const CC_TYPE_BASICLTI = 'imsbasiclti_xmlv1p0';
+
+ public static $namespaces = array('imscc' => 'http://www.imsglobal.org/xsd/imsccv1p1/imscp_v1p1',
+ 'lomimscc' => 'http://ltsc.ieee.org/xsd/imsccv1p1/LOM/manifest',
+ 'lom' => 'http://ltsc.ieee.org/xsd/imsccv1p1/LOM/resource',
+ 'xsi' => 'http://www.w3.org/2001/XMLSchema-instance',
+ 'cc' => 'http://www.imsglobal.org/xsd/imsccv1p1/imsccauth_v1p1');
+
+ public static $restypes = array('associatedcontent/imscc_xmlv1p1/learning-application-resource', 'webcontent');
+ public static $forumns = array('dt' => 'http://www.imsglobal.org/xsd/imsccv1p1/imsdt_v1p1');
+ public static $quizns = array('xmlns' => 'http://www.imsglobal.org/xsd/ims_qtiasiv1p2');
+ public static $resourcens = array('wl' => 'http://www.imsglobal.org/xsd/imsccv1p1/imswl_v1p1');
+ public static $basicltins = array(
+ 'xmlns' => 'http://www.imsglobal.org/xsd/imslticc_v1p0',
+ 'blti' => 'http://www.imsglobal.org/xsd/imsbasiclti_v1p0',
+ 'lticm' => 'http://www.imsglobal.org/xsd/imslticm_v1p0',
+ 'lticp' => 'http://www.imsglobal.org/xsd/imslticp_v1p0'
+ );
+
+
+ public function __construct($path_to_manifest) {
+ parent::__construct($path_to_manifest);
+ }
+
+ public function generate_moodle_xml () {
+
+ global $CFG;
+
+ mkdir(static::$path_to_manifest_folder . DIRECTORY_SEPARATOR . 'course_files');
+
+ $sheet_base = static::loadsheet(SHEET_BASE);
+
+ // MOODLE_BACKUP / INFO / DETAILS / MOD
+ $node_info_details_mod = $this->create_code_info_details_mod();
+
+ // MOODLE_BACKUP / BLOCKS / BLOCK
+ $node_course_blocks_block = $this->create_node_course_blocks_block();
+
+ // MOODLE_BACKUP / COURSES / SECTIONS / SECTION
+ $node_course_sections_section = $this->create_node_course_sections_section();
+
+ // MOODLE_BACKUP / COURSES / QUESTION_CATEGORIES
+ $node_course_question_categories = $this->create_node_question_categories();
+
+ // MOODLE_BACKUP / COURSES / MODULES / MOD
+ $node_course_modules_mod = $this->create_node_course_modules_mod();
+
+ // MOODLE_BACKUP / COURSE / HEADER
+ $node_course_header = $this->create_node_course_header();
+
+ // GENERAL INFO
+ $filename = optional_param('file', 'not_available.zip', PARAM_RAW);
+ $filename = basename($filename);
+
+ $www_root = $CFG->wwwroot;
+
+ $find_tags = array('[#zip_filename#]',
+ '[#www_root#]',
+ '[#node_course_header#]',
+ '[#node_info_details_mod#]',
+ '[#node_course_blocks_block#]',
+ '[#node_course_sections_section#]',
+ '[#node_course_question_categories#]',
+ '[#node_course_modules#]');
+
+ $replace_values = array($filename,
+ $www_root,
+ $node_course_header,
+ $node_info_details_mod,
+ $node_course_blocks_block,
+ $node_course_sections_section,
+ $node_course_question_categories,
+ $node_course_modules_mod);
+
+ $result_xml = str_replace($find_tags, $replace_values, $sheet_base);
+
+ // COPY RESOURSE FILES
+ $entities = new entities11();
+
+ $entities->move_all_files();
+
+ if (array_key_exists("index", self::$instances)) {
+
+ if (!file_put_contents(static::$path_to_manifest_folder . DIRECTORY_SEPARATOR . 'moodle.xml', $result_xml)) {
+ static::log_action('Cannot save the moodle manifest file: ' . static::$path_to_tmp_folder . DIRECTORY_SEPARATOR . 'moodle.xml', true);
+ } else {
+ $status = true;
+ }
+
+ } else {
+ $status = false;
+ static::log_action('The course is empty', false);
+ }
+
+ return $status;
+
+ }
+
+ public function convert_to_moodle_type ($cc_type) {
+ $type = parent::convert_to_moodle_type($cc_type);
+
+ if ($type == TYPE_UNKNOWN) {
+ if ($cc_type == static::CC_TYPE_BASICLTI) {
+ $type = MOODLE_TYPE_LTI;
+ }
+ }
+
+ return $type;
+ }
+
+ protected function create_node_question_categories () {
+
+ $quiz = new cc11_quiz();
+
+ static::log_action('Creating node: QUESTION_CATEGORIES');
+
+ $node_course_question_categories = $quiz->generate_node_question_categories();
+
+ return $node_course_question_categories;
+ }
+
+ protected function create_code_info_details_mod () {
+ $result = parent::create_code_info_details_mod();
+
+ $count_blti = $this->count_instances(MOODLE_TYPE_LTI);
+
+ $sheet_info_details_mod_instances_instance = static::loadsheet(SHEET_INFO_DETAILS_MOD_INSTANCE);
+
+ $blti_mod = '';
+
+ if ($count_blti > 0) {
+ $blti_instance = $this->create_mod_info_details_mod_instances_instance($sheet_info_details_mod_instances_instance, $count_blti, static::$instances['instances'][MOODLE_TYPE_LTI]);
+ $blti_mod = $blti_instance ? $this->create_mod_info_details_mod(MOODLE_TYPE_LTI, $blti_instance) : '';
+ }
+
+ return $result . $blti_mod;
+ }
+
+ protected function create_node_course_modules_mod () {
+ $resources = new cc11_resource();
+ $forums = new cc11_forum();
+ $quiz = new cc11_quiz();
+ $basiclti = new cc11_lti();
+
+ static::log_action('Creating node: COURSE/MODULES/MOD');
+
+ // RESOURCES (WEB CONTENT AND WEB LINK)
+ $node_course_modules_mod_resource = $resources->generate_node();
+
+ // FORUMS
+ $node_course_modules_mod_forum = $forums->generate_node();
+
+ // QUIZ
+ $node_course_modules_mod_quiz = $quiz->generate_node_course_modules_mod();
+
+ //BasicLTI
+ $node_course_modules_mod_basiclti = $basiclti->generate_node();
+
+ $node_course_modules = $node_course_modules_mod_resource .
+ $node_course_modules_mod_forum .
+ $node_course_modules_mod_quiz .
+ $node_course_modules_mod_basiclti;
+
+ return $node_course_modules;
+ }
+
+}
\ No newline at end of file
class cc2moodle {
+ const CC_TYPE_FORUM = 'imsdt_xmlv1p0';
+ const CC_TYPE_QUIZ = 'imsqti_xmlv1p2/imscc_xmlv1p0/assessment';
+ const CC_TYPE_QUESTION_BANK = 'imsqti_xmlv1p2/imscc_xmlv1p0/question-bank';
+ const CC_TYPE_WEBLINK = 'imswl_xmlv1p0';
+ const CC_TYPE_WEBCONTENT = 'webcontent';
+ const CC_TYPE_ASSOCIATED_CONTENT = 'associatedcontent/imscc_xmlv1p0/learning-application-resource';
+ const CC_TYPE_EMPTY = '';
+
+ public static $restypes = array('associatedcontent/imscc_xmlv1p0/learning-application-resource', 'webcontent');
+ public static $forumns = array('dt' => 'http://www.imsglobal.org/xsd/imsdt_v1p0');
+ public static $quizns = array('xmlns' => 'http://www.imsglobal.org/xsd/ims_qtiasiv1p2');
+ public static $resourcens = array('wl' => 'http://www.imsglobal.org/xsd/imswl_v1p0');
+ /**
+ *
+ * @return array
+ */
+ public static function getquizns() {
+ return static::$quizns;
+ }
+
+ /**
+ *
+ * @return array
+ */
+ public static function getforumns() {
+ return static::$forumns;
+ }
+
+ /**
+ *
+ * @return array
+ */
+ public static function getresourcens() {
+ return static::$resourcens;
+ }
+
+ public static function get_manifest($folder) {
+ if (!is_dir($folder)) {
+ return false;
+ }
+
+ $result = false;
+ try {
+ $dirIter = new RecursiveDirectoryIterator($folder, RecursiveDirectoryIterator::KEY_AS_PATHNAME);
+ $recIter = new RecursiveIteratorIterator($dirIter, RecursiveIteratorIterator::CHILD_FIRST);
+ foreach ($recIter as $info) {
+ if ($info->isFile() && ($info->getFilename() == 'imsmanifest.xml')) {
+ $result = $info->getPathname();
+ break;
+ }
+ }
+ } catch (Exception $e) {}
+
+ return $result;
+ }
+
public static $instances = array();
public static $manifest;
public static $path_to_manifest_folder;
- public static $namespaces = array('imscc' => 'http://www.imsglobal.org/xsd/imscc/imscp_v1p1',
+ public static $namespaces = array('imscc' => 'http://www.imsglobal.org/xsd/imscc/imscp_v1p1',
'lomimscc' => 'http://ltsc.ieee.org/xsd/imscc/LOM',
- 'lom' => 'http://ltsc.ieee.org/xsd/LOM',
- 'voc' => 'http://ltsc.ieee.org/xsd/LOM/vocab',
- 'xsi' => 'http://www.w3.org/2001/XMLSchema-instance',
- 'cc' => 'http://www.imsglobal.org/xsd/imsccauth_v1p0');
+ 'lom' => 'http://ltsc.ieee.org/xsd/LOM',
+ 'voc' => 'http://ltsc.ieee.org/xsd/LOM/vocab',
+ 'xsi' => 'http://www.w3.org/2001/XMLSchema-instance',
+ 'cc' => 'http://www.imsglobal.org/xsd/imsccauth_v1p0');
function __construct ($path_to_manifest) {
- self::$manifest = new DOMDocument();
+ static::$manifest = new DOMDocument();
+ static::$manifest->validateOnParse = false;
- self::$path_to_manifest_folder = dirname($path_to_manifest);
+ static::$path_to_manifest_folder = dirname($path_to_manifest);
- self::log_action('Proccess start');
- self::log_action('Load the manifest file: ' . $path_to_manifest);
+ static::log_action('Proccess start');
+ static::log_action('Load the manifest file: ' . $path_to_manifest);
- if (!self::$manifest->load($path_to_manifest)) {
- self::log_action('Cannot load the manifest file: ' . $path_to_manifest, true);
+ if (!static::$manifest->load($path_to_manifest, LIBXML_NONET)) {
+ static::log_action('Cannot load the manifest file: ' . $path_to_manifest, true);
}
}
public function is_auth () {
- $xpath = self::newx_path(self::$manifest, self::$namespaces);
+ $xpath = static::newx_path(static::$manifest, static::$namespaces);
$count_auth = $xpath->evaluate('count(/imscc:manifest/cc:authorizations)');
return $response;
}
- private function get_metadata ($section, $key) {
+ protected function get_metadata ($section, $key) {
- $xpath = self::newx_path(self::$manifest, self::$namespaces);
+ $xpath = static::newx_path(static::$manifest, static::$namespaces);
$metadata = $xpath->query('/imscc:manifest/imscc:metadata/lomimscc:lom/lomimscc:' . $section . '/lomimscc:' . $key . '/lomimscc:string');
$value = !empty($metadata->item(0)->nodeValue) ? $metadata->item(0)->nodeValue : '';
global $CFG;
- mkdir(self::$path_to_manifest_folder . DIRECTORY_SEPARATOR . 'course_files');
+ mkdir(static::$path_to_manifest_folder . DIRECTORY_SEPARATOR . 'course_files');
- $sheet_base = self::loadsheet(SHEET_BASE);
+ $sheet_base = static::loadsheet(SHEET_BASE);
// MOODLE_BACKUP / INFO / DETAILS / MOD
$node_info_details_mod = $this->create_code_info_details_mod();
$node_course_header = $this->create_node_course_header();
// GENERAL INFO
- $filename = optional_param('file', 'not_available.zip');
+ $filename = optional_param('file', 'not_available.zip', PARAM_RAW);
$filename = basename($filename);
$www_root = $CFG->wwwroot;
if (array_key_exists("index", self::$instances)) {
- if (!file_put_contents(self::$path_to_manifest_folder . DIRECTORY_SEPARATOR . 'moodle.xml', $result_xml)) {
- self::log_action('Cannot save the moodle manifest file: ' . self::$path_to_tmp_folder . DIRECTORY_SEPARATOR . 'moodle.xml', true);
+ if (!file_put_contents(static::$path_to_manifest_folder . DIRECTORY_SEPARATOR . 'moodle.xml', $result_xml)) {
+ static::log_action('Cannot save the moodle manifest file: ' . static::$path_to_tmp_folder . DIRECTORY_SEPARATOR . 'moodle.xml', true);
} else {
$status = true;
}
} else {
$status = false;
notify('The course is empty');
- self::log_action('The course is empty', false);
+ static::log_action('The course is empty', false);
}
return $status;
}
- private function get_sections_numbers ($instances) {
+ protected function get_sections_numbers ($instances) {
$count = 0;
return $count;
}
- private function create_node_course_header () {
+ protected function create_node_course_header () {
$node_course_header = '';
- $sheet_course_header = self::loadsheet(SHEET_COURSE_HEADER);
+ $sheet_course_header = static::loadsheet(SHEET_COURSE_HEADER);
- $course_title = $this->get_metadata('general', 'title');
- $section_count = $this->get_sections_numbers(self::$instances) - 1;
+ $course_title = trim($this->get_metadata('general', 'title'));
+ $course_title = empty($course_title) ? 'Untitled Course' : $course_title;
+ $course_description = $this->get_metadata('general', 'description');
+ $section_count = $this->get_sections_numbers(static::$instances) - 1;
if ($section_count == -1) {
$section_count = 0;
$find_tags = array('[#course_name#]',
'[#course_short_name#]',
+ '[#course_description#]',
'[#date_now#]',
'[#section_count#]');
- $replace_values = array($course_title,
- $course_short_name,
+ $replace_values = array(htmlentities($course_title),
+ htmlentities($course_short_name),
+ htmlentities($course_description),
time(),
$section_count);
return $node_course_header;
}
- private function create_node_question_categories () {
+ protected function create_node_question_categories () {
- $quiz = new quiz();
+ $quiz = new cc_quiz();
- self::log_action('Creating node: QUESTION_CATEGORIES');
+ static::log_action('Creating node: QUESTION_CATEGORIES');
$node_course_question_categories = $quiz->generate_node_question_categories();
return $node_course_question_categories;
}
- private function create_node_course_modules_mod () {
+ protected function create_node_course_modules_mod () {
- $labels = new label();
- $resources = new resource();
- $forums = new forum();
- $quiz = new quiz();
+ $labels = new cc_label();
+ $resources = new cc_resource();
+ $forums = new cc_forum();
+ $quiz = new cc_quiz();
- self::log_action('Creating node: COURSE/MODULES/MOD');
+ static::log_action('Creating node: COURSE/MODULES/MOD');
// LABELS
$node_course_modules_mod_label = $labels->generate_node();
// QUIZ
$node_course_modules_mod_quiz = $quiz->generate_node_course_modules_mod();
- $node_course_modules = $node_course_modules_mod_label . $node_course_modules_mod_resource . $node_course_modules_mod_forum . $node_course_modules_mod_quiz;
+ $node_course_modules = /*$node_course_modules_mod_label .*/ $node_course_modules_mod_resource . $node_course_modules_mod_forum . $node_course_modules_mod_quiz;
return $node_course_modules;
}
- private function create_node_course_sections_section () {
+ protected function create_node_course_sections_section () {
- self::log_action('Creating node: COURSE/SECTIONS/SECTION');
+ static::log_action('Creating node: COURSE/SECTIONS/SECTION');
$node_course_sections_section = '';
- $sheet_course_sections_section = self::loadsheet(SHEET_COURSE_SECTIONS_SECTION);
+ $sheet_course_sections_section = static::loadsheet(SHEET_COURSE_SECTIONS_SECTION);
$topics = $this->get_nodes_by_criteria('deep', ROOT_DEEP);
return $node_course_sections_section;
}
- private function create_node_course_blocks_block () {
+ protected function create_node_course_blocks_block () {
global $CFG;
- self::log_action('Creating node: COURSE/BLOCKS/BLOCK');
+ static::log_action('Creating node: COURSE/BLOCKS/BLOCK');
- $sheet_course_blocks_block = self::loadsheet(SHEET_COURSE_BLOCKS_BLOCK);
+ $sheet_course_blocks_block = static::loadsheet(SHEET_COURSE_BLOCKS_BLOCK);
$node_course_blocks_block = '';
$format_config = $CFG->dirroot . '/course/format/weeks/config.php';
}
- private function create_node_course_sections_section_mods_mod ($root_parent) {
+ protected function create_node_course_sections_section_mods_mod ($root_parent) {
- $sheet_course_sections_section_mods_mod = self::loadsheet(SHEET_COURSE_SECTIONS_SECTION_MODS_MOD);
+ $sheet_course_sections_section_mods_mod = static::loadsheet(SHEET_COURSE_SECTIONS_SECTION_MODS_MOD);
$childs = $this->get_nodes_by_criteria('root_parent', $root_parent);
if ($childs) {
$response = array();
- if (array_key_exists('index', self::$instances)) {
- foreach (self::$instances['index'] as $item) {
+ if (array_key_exists('index', static::$instances)) {
+ foreach (static::$instances['index'] as $item) {
if ($item[$key] == $value) {
$response[] = $item;
}
return $response;
}
- private function create_code_info_details_mod () {
+ //Modified here
+ protected function create_code_info_details_mod () {
- self::log_action('Creating node: INFO/DETAILS/MOD');
+ static::log_action('Creating node: INFO/DETAILS/MOD');
- $xpath = self::newx_path(self::$manifest, self::$namespaces);
+ $xpath = static::newx_path(static::$manifest, static::$namespaces);
- $items = $xpath->query('/imscc:manifest/imscc:organizations/imscc:organization/imscc:item | /imscc:manifest/imscc:resources/imscc:resource[@type="' . CC_TYPE_QUESTION_BANK . '"]');
+ $items = $xpath->query('/imscc:manifest/imscc:organizations/imscc:organization/imscc:item | /imscc:manifest/imscc:resources/imscc:resource[@type="' . static::CC_TYPE_QUESTION_BANK . '"]');
$this->create_instances($items);
$count_resource = $this->count_instances(MOODLE_TYPE_RESOURCE);
$count_label = $this->count_instances(MOODLE_TYPE_LABEL);
- $sheet_info_details_mod_instances_instance = self::loadsheet(SHEET_INFO_DETAILS_MOD_INSTANCE);
+ $sheet_info_details_mod_instances_instance = static::loadsheet(SHEET_INFO_DETAILS_MOD_INSTANCE);
if ($count_resource > 0) {
- $resource_instance = $this->create_mod_info_details_mod_instances_instance($sheet_info_details_mod_instances_instance, $count_resource, self::$instances['instances'][MOODLE_TYPE_RESOURCE]);
+ $resource_instance = $this->create_mod_info_details_mod_instances_instance($sheet_info_details_mod_instances_instance, $count_resource, static::$instances['instances'][MOODLE_TYPE_RESOURCE]);
}
if ($count_quiz > 0) {
- $quiz_instance = $this->create_mod_info_details_mod_instances_instance($sheet_info_details_mod_instances_instance, $count_quiz, self::$instances['instances'][MOODLE_TYPE_QUIZ]);
+ $quiz_instance = $this->create_mod_info_details_mod_instances_instance($sheet_info_details_mod_instances_instance, $count_quiz, static::$instances['instances'][MOODLE_TYPE_QUIZ]);
}
if ($count_forum > 0) {
- $forum_instance = $this->create_mod_info_details_mod_instances_instance($sheet_info_details_mod_instances_instance, $count_forum, self::$instances['instances'][MOODLE_TYPE_FORUM]);
+ $forum_instance = $this->create_mod_info_details_mod_instances_instance($sheet_info_details_mod_instances_instance, $count_forum, static::$instances['instances'][MOODLE_TYPE_FORUM]);
}
if ($count_label > 0) {
- $label_instance = $this->create_mod_info_details_mod_instances_instance($sheet_info_details_mod_instances_instance, $count_label, self::$instances['instances'][MOODLE_TYPE_LABEL]);
+ $label_instance = $this->create_mod_info_details_mod_instances_instance($sheet_info_details_mod_instances_instance, $count_label, static::$instances['instances'][MOODLE_TYPE_LABEL]);
}
$resource_mod = $count_resource ? $this->create_mod_info_details_mod(MOODLE_TYPE_RESOURCE, $resource_instance) : '';
$forum_mod = $count_forum ? $this->create_mod_info_details_mod(MOODLE_TYPE_FORUM, $forum_instance) : '';
$label_mod = $count_label ? $this->create_mod_info_details_mod(MOODLE_TYPE_LABEL, $label_instance) : '';
- return $label_mod . $resource_mod . $quiz_mod . $forum_mod;
+ return /*$label_mod .*/ $resource_mod . $quiz_mod . $forum_mod;
}
- private function create_mod_info_details_mod ($mod_type, $node_info_details_mod_instances_instance) {
+ protected function create_mod_info_details_mod ($mod_type, $node_info_details_mod_instances_instance) {
- $sheet_info_details_mod = self::loadsheet(SHEET_INFO_DETAILS_MOD);
+ $sheet_info_details_mod = static::loadsheet(SHEET_INFO_DETAILS_MOD);
$find_tags = array('[#mod_type#]' ,'[#node_info_details_mod_instances_instance#]');
$replace_values = array($mod_type , $node_info_details_mod_instances_instance);
return str_replace($find_tags, $replace_values, $sheet_info_details_mod);
}
- private function create_mod_info_details_mod_instances_instance ($sheet, $instances_quantity, $instances) {
+ protected function create_mod_info_details_mod_instances_instance ($sheet, $instances_quantity, $instances) {
$instance = '';
for ($i = 1; $i <= $instances_quantity; $i++) {
- $user_info = ($instances[$i - 1]['common_cartriedge_type'] == CC_TYPE_FORUM) ? 'true' : 'false';
+ $user_info = ($instances[$i - 1]['common_cartriedge_type'] == static::CC_TYPE_FORUM) ? 'true' : 'false';
$replace_values = array($instances[$i - 1]['instance'],
- $instances[$i - 1]['title'],
+ htmlentities($instances[$i - 1]['title']),
$user_info);
$instance .= str_replace($find_tags, $replace_values, $sheet);
}
- private function create_instances ($items, $level = 0, &$array_index = 0, $index_root = 0) {
+ protected function create_instances ($items, $level = 0, &$array_index = 0, $index_root = 0) {
$level++;
$i = 1;
if ($items) {
- $xpath = self::newx_path(self::$manifest, self::$namespaces);
+ $xpath = self::newx_path(static::$manifest, static::$namespaces);
foreach ($items as $item) {
$index_root = $array_index;
}
- self::$instances['index'][$array_index]['common_cartriedge_type'] = $cc_type;
- self::$instances['index'][$array_index]['moodle_type'] = $moodle_type;
- self::$instances['index'][$array_index]['title'] = $title ? $title : '';
- self::$instances['index'][$array_index]['root_parent'] = $index_root;
- self::$instances['index'][$array_index]['index'] = $array_index;
- self::$instances['index'][$array_index]['deep'] = $level;
- self::$instances['index'][$array_index]['instance'] = $this->count_instances($moodle_type);
- self::$instances['index'][$array_index]['resource_indentifier'] = $identifierref;
-
- self::$instances['instances'][$moodle_type][] = array('title' => $title,
- 'instance' => self::$instances['index'][$array_index]['instance'],
+ static::$instances['index'][$array_index]['common_cartriedge_type'] = $cc_type;
+ static::$instances['index'][$array_index]['moodle_type'] = $moodle_type;
+ static::$instances['index'][$array_index]['title'] = $title ? $title : '';
+ static::$instances['index'][$array_index]['root_parent'] = $index_root;
+ static::$instances['index'][$array_index]['index'] = $array_index;
+ static::$instances['index'][$array_index]['deep'] = $level;
+ static::$instances['index'][$array_index]['instance'] = $this->count_instances($moodle_type);
+ static::$instances['index'][$array_index]['resource_indentifier'] = $identifierref;
+
+ static::$instances['instances'][$moodle_type][] = array('title' => $title,
+ 'instance' => static::$instances['index'][$array_index]['instance'],
'common_cartriedge_type' => $cc_type , 'resource_indentifier' => $identifierref);
$more_items = $xpath->query('imscc:item', $item);
$quantity = 0;
- if (array_key_exists('index', self::$instances)) {
- if (self::$instances['index'] && $type) {
+ if (array_key_exists('index', static::$instances)) {
+ if (static::$instances['index'] && $type) {
- foreach (self::$instances['index'] as $instance) {
+ foreach (static::$instances['index'] as $instance) {
if (!empty($instance['moodle_type'])) {
$types[] = $instance['moodle_type'];
}
}
public function convert_to_moodle_type ($cc_type) {
+ $type = TYPE_UNKNOWN;
- if ($cc_type == CC_TYPE_FORUM) {
+ if ($cc_type == static::CC_TYPE_FORUM) {
$type = MOODLE_TYPE_FORUM;
}
- if ($cc_type == CC_TYPE_QUIZ) {
+
+ if ($cc_type == static::CC_TYPE_QUIZ) {
$type = MOODLE_TYPE_QUIZ;
}
- if ($cc_type == CC_TYPE_WEBLINK) {
+
+ if ($cc_type == static::CC_TYPE_WEBLINK) {
$type = MOODLE_TYPE_RESOURCE;
}
- if ($cc_type == CC_TYPE_WEBCONTENT) {
+
+ if ($cc_type == static::CC_TYPE_WEBCONTENT) {
$type = MOODLE_TYPE_RESOURCE;
}
- if ($cc_type == CC_TYPE_ASSOCIATED_CONTENT) {
+
+ if ($cc_type == static::CC_TYPE_ASSOCIATED_CONTENT) {
$type = MOODLE_TYPE_RESOURCE;
}
- if ($cc_type == CC_TYPE_QUESTION_BANK) {
+
+ if ($cc_type == static::CC_TYPE_QUESTION_BANK) {
$type = MOODLE_TYPE_QUESTION_BANK;
}
- if ($cc_type == CC_TYPE_EMPTY) {
+ /*if ($cc_type == static::CC_TYPE_EMPTY) {
$type = MOODLE_TYPE_LABEL;
- }
-
- $type = empty($type) ? TYPE_UNKNOWN : $type;
+ }*/
return $type;
}
public function get_item_cc_type ($identifier) {
- $xpath = self::newx_path(self::$manifest, self::$namespaces);
+ $xpath = static::newx_path(static::$manifest, static::$namespaces);
$nodes = $xpath->query('/imscc:manifest/imscc:resources/imscc:resource[@identifier="' . $identifier . '"]/@type');
if (!empty($namespaces)) {
foreach ($namespaces as $prefix => $ns) {
if (!$xpath->registerNamespace($prefix, $ns)) {
- self::log_action('Cannot register the namespace: ' . $prefix . ':' . $ns, true);
+ static::log_action('Cannot register the namespace: ' . $prefix . ':' . $ns, true);
}
}
}
$content = (is_readable($file) && ($content = file_get_contents($file))) ? $content : false;
- self::log_action('Loading sheet: ' . $file);
+ static::log_action('Loading sheet: ' . $file);
if (!$content) {
- self::log_action('Cannot load the xml sheet: ' . $file, true);
+ static::log_action('Cannot load the xml sheet: ' . $file, true);
}
- self::log_action('Load OK!');
+ static::log_action('Load OK!');
return $content;
}
+ public static function log_file() {
+ return static::$path_to_manifest_folder . DIRECTORY_SEPARATOR . 'cc2moodle.log';
+ }
+
public static function log_action ($text, $critical_error = false) {
- $filename = cc2moodle::$path_to_manifest_folder . DIRECTORY_SEPARATOR . 'cc2moodle.log';
$full_message = strtoupper(date("j/n/Y g:i:s a")) . " - " . $text . "\r";
- file_put_contents($filename, $full_message, FILE_APPEND);
+ file_put_contents(static::log_file(), $full_message, FILE_APPEND);
if ($critical_error) {
- self::critical_error($text);
+ static::critical_error($text);
}
}
- private function critical_error ($text) {
+ protected function critical_error ($text) {
- $path_to_log = cc2moodle::$path_to_manifest_folder . '/cc2moodle.log';
+ $path_to_log = static::log_file();
echo '
die();
}
- private function create_course_code ($title) {
-
- $code = '';
- $words = explode(' ', $title);
-
- foreach ($words as $word) {
- $code .= $word[0];
- }
-
- $code = strtoupper($code . '-1');
+ protected function create_course_code ($title) {
+ //Making sure that text of the short name does not go over the DB limit.
+ //and leaving the space to add additional characters by the platform
+ $code = substr(strtoupper(str_replace(' ', '', trim($title))),0,94);
return $code;
}
}
--- /dev/null
+<?php
+// This file is part of Moodle - http://moodle.org/
+//
+// Moodle is free software: you can redistribute it and/or modify
+// it under the terms of the GNU General Public License as published by
+// the Free Software Foundation, either version 3 of the License, or
+// (at your option) any later version.
+//
+// Moodle is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+// GNU General Public License for more details.
+//
+// You should have received a copy of the GNU General Public License
+// along with Moodle. If not, see <http://www.gnu.org/licenses/>.
+/**
+* Main include for IMS Common Cartridge export classes
+*
+* @package backup-convert
+* @copyright 2011 Darko Miletic <dmiletic@moodlerooms.com>
+* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
+*/
+
+require_once($CFG->dirroot .'/backup/cc/cc_lib/xmlbase.php');
+require_once($CFG->dirroot .'/backup/cc/cc_lib/cc_resources.php');
+require_once($CFG->dirroot .'/backup/cc/cc_lib/cc_builder_creator.php');
+require_once($CFG->dirroot .'/backup/cc/cc_lib/cc_manifest.php');
+require_once($CFG->dirroot .'/backup/cc/cc_lib/cc_metadata.php');
+require_once($CFG->dirroot .'/backup/cc/cc_lib/cc_metadata_resource.php');
+require_once($CFG->dirroot .'/backup/cc/cc_lib/cc_metadata_file.php');
+require_once($CFG->dirroot .'/backup/cc/cc_lib/cc_version11.php');
+require_once($CFG->dirroot .'/backup/cc/cc_lib/gral_lib/pathutils.php');
+require_once($CFG->dirroot .'/backup/cc/cc_lib/gral_lib/functions.php');
+require_once($CFG->dirroot .'/backup/cc/cc_lib/cc_organization.php');
+require_once($CFG->dirroot .'/backup/cc/cc_lib/cc_converter_basiclti.php');
+require_once($CFG->dirroot .'/backup/cc/cc_lib/cc_converter_lti.php');
+require_once($CFG->dirroot .'/backup/cc/cc_lib/cc_converter_forum.php');
+require_once($CFG->dirroot .'/backup/cc/cc_lib/cc_converter_url.php');
+require_once($CFG->dirroot .'/backup/cc/cc_lib/cc_converter_resource.php');
+require_once($CFG->dirroot .'/backup/cc/cc_lib/cc_convert_moodle2.php');
--- /dev/null
+<?php
+// This file is part of Moodle - http://moodle.org/
+//
+// Moodle is free software: you can redistribute it and/or modify
+// it under the terms of the GNU General Public License as published by
+// the Free Software Foundation, either version 3 of the License, or
+// (at your option) any later version.
+//
+// Moodle is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+// GNU General Public License for more details.
+//
+// You should have received a copy of the GNU General Public License
+// along with Moodle. If not, see <http://www.gnu.org/licenses/>.
+/**
+* @package backup-convert
+* @subpackage cc-library
+* @copyright 2011 Darko Miletic <dmiletic@moodlerooms.com>
+* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
+*/
+
+
+require_once 'cc_general.php';
+
+class assesment1_resurce_file extends general_cc_file {
+ const deafultname = 'assesment.xml';
+
+ protected $rootns = 'xmlns';
+ protected $rootname = 'questestinterop';
+ protected $ccnamespaces = array('xmlns' => 'http://www.imsglobal.org/xsd/ims_qtiasiv1p2',
+ 'xsi' => 'http://www.w3.org/2001/XMLSchema-instance');
+ protected $ccnsnames = array('xmlns' => 'http://www.imsglobal.org/profile/cc/ccv1p0/derived_schema/domainProfile_4/ims_qtiasiv1p2_localised.xsd');
+
+ protected $assesment_title = null;
+ protected $assesment_ident = null;
+ protected $qtimetadata = array();
+
+ protected function on_save() {
+ $rns = $this->ccnamespaces[$this->rootns];
+ //add some root stuff
+ $assesment = $this->append_new_element_ns($this->root, $rns, 'assesment');
+ $this->append_new_attribute_ns($assesment, $rns, 'ident', $this->assesment_ident);
+ $this->append_new_attribute_ns($assesment, $rns, 'title', $this->assesment_title);
+
+ if (!empty($this->qtimetadata)) {
+ $qtimetadata = $this->append_new_element_ns($assesment, $rns, 'qtimetadata');
+ foreach ($this->qtimetadata as $label => $entry) {
+ $this->append_new_element_ns($qtimetadata, $rns, 'fieldlabel', $label);
+ $this->append_new_element_ns($qtimetadata, $rns, 'fieldentry', $entry);
+ }
+ }
+
+ //TODO: implement section processing (looks quite complicated for implementing)
+
+ //TODO: finish this!
+ return false;
+ }
+}
+
+
+class assesment11_resurce_file extends assesment1_resurce_file {
+ protected $ccnsnames = array('xmlns' => 'http://www.imsglobal.org/profile/cc/ccv1p1/ccv1p1_qtiasiv1p2p1_v1p0.xsd');
+}
--- /dev/null
+<?php
+// This file is part of Moodle - http://moodle.org/
+//
+// Moodle is free software: you can redistribute it and/or modify
+// it under the terms of the GNU General Public License as published by
+// the Free Software Foundation, either version 3 of the License, or
+// (at your option) any later version.
+//
+// Moodle is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+// GNU General Public License for more details.
+//
+// You should have received a copy of the GNU General Public License
+// along with Moodle. If not, see <http://www.gnu.org/licenses/>.
+/**
+* @package backup-convert
+* @copyright 2011 Darko Miletic <dmiletic@moodlerooms.com>
+* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
+*/
+
+require_once 'cc_general.php';
+
+class basicltil1_resurce_file extends general_cc_file {
+ const deafultname = 'basiclti.xml';
+
+ protected $rootns = 'xmlns';
+ protected $rootname = 'cartridge_basiclti_link';
+ protected $ccnamespaces = array('xmlns' => 'http://www.imsglobal.org/xsd/imslticc_v1p0',
+ 'blti' => 'http://www.imsglobal.org/xsd/imsbasiclti_v1p0',
+ 'lticm' => 'http://www.imsglobal.org/xsd/imslticm_v1p0',
+ 'lticp' => 'http://www.imsglobal.org/xsd/imslticp_v1p0',
+ 'xsi' => 'http://www.w3.org/2001/XMLSchema-instance');
+ protected $ccnsnames = array('xmlns' => 'http://www.imsglobal.org/xsd/lti/ltiv1p0/imslticc_v1p0.xsd',
+ 'blti' => 'http://www.imsglobal.org/xsd/lti/ltiv1p0/imsbasiclti_v1p0p1.xsd',
+ 'lticm' => 'http://www.imsglobal.org/xsd/lti/ltiv1p0/imslticm_v1p0.xsd',
+ 'lticp' => 'http://www.imsglobal.org/xsd/lti/ltiv1p0/imslticp_v1p0.xsd');
+
+ protected $title = 'Untitled';
+ protected $description = 'description';
+ protected $custom_properties = array();
+ protected $extension_properties = array();
+ protected $extension_platform = null;
+ protected $launch_url = null;
+ protected $secure_launch_url = null;
+ protected $icon = null;
+ protected $secure_icon = null;
+ protected $vendor = false;
+ protected $vendor_code = 'I';
+ protected $vendor_name = null;
+ protected $vendor_description = null;
+ protected $vendor_url = null;
+ protected $vendor_contact = null;
+ protected $cartridge_bundle = null;
+ protected $cartridge_icon = null;
+
+ public function set_title($title) {
+ $this->title = $title;
+ }
+ public function set_description($description) {
+ $this->description = $description;
+ }
+ public function set_launch_url ($url) {
+ $this->launch_url = $url;
+ }
+ public function set_secure_launch_url ($url) {
+ $this->secure_launch_url = $url;
+ }
+ public function set_launch_icon ($icon) {
+ $this->icon = $icon;
+ }
+ public function set_secure_launch_icon ($icon) {
+ $this->secure_icon = $icon;
+ }
+ public function set_vendor_code ($code) {
+ $this->vendor_code = $code;
+ $this->vendor = true;
+ }
+ public function set_vendor_name ($name) {
+ $this->vendor_name = $name;
+ $this->vendor = true;
+ }
+ public function set_vendor_description ($desc) {
+ $this->vendor_description = $desc;
+ $this->vendor = true;
+ }
+ public function set_vendor_url ($url) {
+ $this->vendor_url = $url;
+ $this->vendor = true;
+ }
+ public function set_vendor_contact ($email) {
+ $this->vendor_contact = array('email' => $email);
+ $this->vendor = true;
+ }
+ public function add_custom_property ($property, $value) {
+ $this->custom_properties[$property] = $value;
+ }
+ public function add_extension ($extension, $value) {
+ $this->extension_properties[$extension] = $value;
+ }
+ public function set_extension_platform ($value) {
+ $this->extension_platform = $value;
+ }
+
+ public function set_cartridge_bundle($value) {
+ $this->cartridge_bundle = $value;
+ }
+
+ public function set_cartridge_icon($value) {
+ $this->cartridge_icon = $value;
+ }
+
+ protected function on_save() {
+ //this has to be done like this since order of apearance of the tags is also mandatory
+ //and specified in basiclti schema files
+
+ //main items
+ $rns = $this->ccnamespaces['blti'];
+ $this->append_new_element_ns($this->root, $rns, 'title' , $this->title );
+ $this->append_new_element_ns($this->root, $rns, 'description', $this->description);
+
+ //custom properties
+ if (!empty($this->custom_properties)) {
+ $custom = $this->append_new_element_ns($this->root, $rns, 'custom');
+ foreach ($this->custom_properties as $property => $value) {
+ $node = $this->append_new_element_ns($custom, $this->ccnamespaces['lticm'], 'property' , $value);
+ $this->append_new_attribute_ns($node, $this->ccnamespaces['xmlns'],'name', $property);
+ }
+ }
+
+ //extension properties
+ if (!empty($this->extension_properties)) {
+ $extension = $this->append_new_element_ns($this->root, $rns, 'extensions');
+ if (!empty($this->extension_platform)) {
+ $this->append_new_attribute_ns($extension, $this->ccnamespaces['xmlns'], 'platform', $this->extension_platform);
+ }
+ foreach ($this->extension_properties as $property => $value) {
+ $node = $this->append_new_element_ns($extension, $this->ccnamespaces['lticm'], 'property' , $value);
+ $this->append_new_attribute_ns($node, $this->ccnamespaces['xmlns'], 'name', $property);
+ }
+ }
+
+ $this->append_new_element_ns($this->root, $rns, 'launch_url' , $this->launch_url );
+ if (!empty($this->secure_launch_url)) {
+ $this->append_new_element_ns($this->root, $rns, 'secure_launch_url' , $this->secure_launch_url);
+ }
+ $this->append_new_element_ns($this->root, $rns, 'icon' , $this->icon );
+ if (!empty($this->secure_icon)) {
+ $this->append_new_element_ns($this->root, $rns, 'secure_icon' , $this->secure_icon);
+ }
+
+ //vendor info
+ $vendor = $this->append_new_element_ns($this->root, $rns, 'vendor');
+ $vcode = empty($this->vendor_code) ? 'I' : $this->vendor_code;
+ $this->append_new_element_ns($vendor, $this->ccnamespaces['lticp'], 'code', $vcode);
+ $this->append_new_element_ns($vendor, $this->ccnamespaces['lticp'], 'name', $this->vendor_name);
+ if (!empty($this->vendor_description)) {
+ $this->append_new_element_ns($vendor, $this->ccnamespaces['lticp'], 'description', $this->vendor_description);
+ }
+ if (!empty($this->vendor_url)) {
+ $this->append_new_element_ns($vendor, $this->ccnamespaces['lticp'], 'url', $this->vendor_url);
+ }
+ if (!empty($this->vendor_contact)) {
+ $vcontact = $this->append_new_element_ns($vendor, $this->ccnamespaces['lticp'], 'contact');
+ $this->append_new_element_ns($vcontact, $this->ccnamespaces['lticp'], 'email', $this->vendor_contact['email']);
+ }
+
+ //cartridge bundle and icon
+ if (!empty($this->cartridge_bundle)) {
+ $cbundle = $this->append_new_element_ns($this->root, $this->ccnamespaces['xmlns'], 'cartridge_bundle');
+ $this->append_new_attribute_ns($cbundle, $this->ccnamespaces['xmlns'], 'identifierref', $this->cartridge_bundle);
+ }
+ if (!empty($this->cartridge_icon)) {
+ $cicon = $this->append_new_element_ns($this->root, $this->ccnamespaces['xmlns'], 'cartridge_icon');
+ $this->append_new_attribute_ns($cicon, $this->ccnamespaces['xmlns'], 'identifierref', $this->cartridge_icon);
+ }
+
+ return true;
+ }
+
+}
--- /dev/null
+<?php
+// This file is part of Moodle - http://moodle.org/
+//
+// Moodle is free software: you can redistribute it and/or modify
+// it under the terms of the GNU General Public License as published by
+// the Free Software Foundation, either version 3 of the License, or
+// (at your option) any later version.
+//
+// Moodle is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+// GNU General Public License for more details.
+//
+// You should have received a copy of the GNU General Public License
+// along with Moodle. If not, see <http://www.gnu.org/licenses/>.
+/**
+* @package backup-convert
+* @subpackage cc-library
+* @copyright 2011 Darko Miletic <dmiletic@moodlerooms.com>
+* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
+*/
+
+/**
+ * Factory pattern class
+ * Create the version class to use
+ *
+ */
+class cc_builder_creator {
+
+ public static function factory($version){
+ if (is_null($version)) {
+ throw new Exception("Version is null!");
+ }
+ if (include_once 'cc_version' . $version . '.php') {
+ $classname = 'cc_version' . $version;
+ return new $classname;
+ } else {
+ throw new Exception ("Dont find cc version class!");
+ }
+ }
+}
\ No newline at end of file
--- /dev/null
+<?php
+// This file is part of Moodle - http://moodle.org/
+//
+// Moodle is free software: you can redistribute it and/or modify
+// it under the terms of the GNU General Public License as published by
+// the Free Software Foundation, either version 3 of the License, or
+// (at your option) any later version.
+//
+// Moodle is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+// GNU General Public License for more details.
+//
+// You should have received a copy of the GNU General Public License
+// along with Moodle. If not, see <http://www.gnu.org/licenses/>.
+/**
+* @package backup-convert
+* @subpackage cc-library
+* @copyright 2011 Darko Miletic <dmiletic@moodlerooms.com>
+* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
+*/
+
+if (!extension_loaded('fileinfo')) {
+ die('You must install fileinfo extension!');
+}
+
+abstract class cc_convert_moodle2 {
+
+ /**
+ *
+ * Enter description here ...
+ * @param unknown_type $packagedir
+ * @param unknown_type $outdir
+ * @throws DOMException
+ * @throws InvalidArgumentException
+ */
+ public static function convert($packagedir, $outdir) {
+ $dir = realpath($packagedir);
+ if (empty($dir)) {
+ throw new InvalidArgumentException('Directory does not exist!');
+ }
+ $odir = realpath($outdir);
+ if (empty($odir)) {
+ throw new InvalidArgumentException('Directory does not exist!');
+ }
+ $coursefile = $dir.DIRECTORY_SEPARATOR.'course'.DIRECTORY_SEPARATOR.'course.xml';
+ $doc = new XMLGenericDocument();
+ if ($doc->load($coursefile)) {
+ $course_name = $doc->nodeValue('/course/fullname');
+ $course_desc = $doc->nodeValue('/course/summary');
+ $course_language = $doc->nodeValue('/course/lang');
+ $course_language = empty($course_language) ? 'en' : $course_language;
+ $course_category = $doc->nodeValue('/course/category/name');
+
+ //Initialize the manifest metadata class
+ $meta = new cc_metadata_manifest();
+
+ //Package metadata
+ $metageneral = new cc_metadata_general();
+ $metageneral->set_language($course_language);
+ $metageneral->set_title($course_name, $course_language);
+ $metageneral->set_description($course_desc, $course_language);
+ $metageneral->set_catalog('category');
+ $metageneral->set_entry($course_category);
+ $meta->add_metadata_general($metageneral);
+
+ // Create the manifest
+ $manifest = new cc_manifest(cc_version::v11);
+
+ $manifest->add_metadata_manifest($meta);
+
+ $organization = null;
+
+ //Package structure - default organization and resources
+ //Get the course structure - this will be transformed into organization
+ //Step 1 - Get the list and order of sections/topics
+ $moodle_backup = $dir . DIRECTORY_SEPARATOR . 'moodle_backup.xml';
+ $secp = new XMLGenericDocument();
+ $docp = new XMLGenericDocument();
+ if ($docp->load($moodle_backup)) {
+ //sections
+ $sections = array();
+ $section_list = $docp->nodeList('/moodle_backup/information/contents/sections/section');
+ if (!empty($section_list)) {
+ foreach ($section_list as $node) {
+ $sectionid = $docp->nodeValue('sectionid', $node);
+ $sectiontitle = $docp->nodeValue('title' , $node);
+ $sectionpath = $docp->nodeValue('directory', $node);
+ $sequence = array();
+ //Get section stuff
+ $section_file = $dir .
+ DIRECTORY_SEPARATOR .
+ $sectionpath .
+ DIRECTORY_SEPARATOR .
+ 'section.xml';
+ if ($secp->load($section_file)) {
+ $rawvalue = $secp->nodeValue('/section/sequence');
+ if ($rawvalue != '$@NULL@$') {
+ $sequence = explode(',', $rawvalue);
+ }
+ }
+ $sections[$sectionid] = array($sectiontitle, $sequence);
+ }
+ }
+ //organization title
+ $organization = new cc_organization();
+ //Add section/topic items
+ foreach ($sections as $sectionid => $values) {
+ $item = new cc_item();
+ $item->title = $values[0];
+ self::process_sequence($item, $manifest, $values[1], $dir, $odir);
+ $organization->add_item($item);
+ }
+ $manifest->put_nodes();
+ }
+
+ if (!empty($organization)) {
+ $manifest->add_new_organization($organization);
+ }
+
+ $manifestpath = $outdir.DIRECTORY_SEPARATOR.'imsmanifest.xml';
+ $manifest->saveTo($manifestpath);
+ }
+
+ }
+
+ /**
+ *
+ * Process the activites and create item structure
+ * @param cc_i_item $item
+ * @param array $sequence
+ * @param string $packageroot - directory path
+ * @throws DOMException
+ */
+ protected static function process_sequence(cc_i_item &$item, cc_i_manifest &$manifest, array $sequence, $packageroot, $outdir) {
+ $moodle_backup = $packageroot . DIRECTORY_SEPARATOR . 'moodle_backup.xml';
+ $doc = new XMLGenericDocument();
+ if(!$doc->load($moodle_backup)) {
+ return;
+ }
+ $activities = $doc->nodeList('/moodle_backup/information/contents/activities/activity');
+ if (!empty($activities)) {
+ $dpp = new XMLGenericDocument();
+ foreach ($activities as $activity) {
+ $moduleid = $doc->nodeValue('moduleid', $activity);
+ if (in_array($moduleid, $sequence)) {
+ //detect activity type
+ $directory = $doc->nodeValue('directory', $activity);
+ $path = $packageroot . DIRECTORY_SEPARATOR . $directory;
+ $module_file = $path . DIRECTORY_SEPARATOR . 'module.xml';
+ if ($dpp->load($module_file)) {
+ $activity_type = $dpp->nodeValue('/module/modulename');
+ $activity_indentation = $dpp->nodeValue('/module/indent');
+ $aitem = self::item_indenter($item, $activity_indentation);
+ $caller = "cc_converter_{$activity_type}";
+ if (class_exists($caller)) {
+ $obj = new $caller($aitem, $manifest, $packageroot, $path);
+ if ( !$obj->convert($outdir) ) {
+ echo "failed to convert {$activity_type}".PHP_EOL;
+ }
+ } else {
+ echo "skipped {$activity_type}".PHP_EOL;
+ }
+ }
+ }
+ }
+ }
+ }
+
+ protected static function item_indenter(cc_i_item &$item, $level = 0) {
+ $indent = (int)$level;
+ $indent = ($indent) <= 0 ? 0 : $indent;
+ $nprev = null;
+ $nfirst = null;
+ for ($pos = 0, $size = $indent; $pos < $size; $pos++) {
+ $nitem = new cc_item();
+ $nitem->title = '';
+ if (empty($nfirst)) {
+ $nfirst = $nitem;
+ }
+ if (!empty($nprev)) {
+ $nprev->add_child_item($nitem);
+ }
+ $nprev = $nitem;
+ }
+ $result = $item;
+ if (!empty($nfirst)) {
+ $item->add_child_item($nfirst);
+ $result = $nprev;
+ }
+ return $result;
+ }
+
+}
\ No newline at end of file
--- /dev/null
+<?php
+// This file is part of Moodle - http://moodle.org/
+//
+// Moodle is free software: you can redistribute it and/or modify
+// it under the terms of the GNU General Public License as published by
+// the Free Software Foundation, either version 3 of the License, or
+// (at your option) any later version.
+//
+// Moodle is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+// GNU General Public License for more details.
+//
+// You should have received a copy of the GNU General Public License
+// along with Moodle. If not, see <http://www.gnu.org/licenses/>.
+/**
+* @package backup-convert
+* @subpackage cc-library
+* @copyright 2011 Darko Miletic <dmiletic@moodlerooms.com>
+* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
+*/
+
+require_once 'cc_converters.php';
+require_once 'cc_general.php';
+require_once 'cc_basiclti.php';
+
+class cc_converter_basiclti extends cc_converter {
+
+ public function __construct(cc_i_item &$item, cc_i_manifest &$manifest, $rootpath, $path){
+ $this->cc_type = cc_version11::basiclti;
+ $this->defaultfile = 'basiclti.xml';
+ $this->defaultname = basicltil1_resurce_file::deafultname;
+ parent::__construct($item, $manifest, $rootpath, $path);
+ }
+
+ public function convert($outdir) {
+ $rt = new basicltil1_resurce_file();
+ $title = $this->doc->nodeValue('/activity/basiclti/name');
+ $rt->set_title($title);
+ $rt->set_launch_url($this->doc->nodeValue('/activity/basiclti/toolurl'));
+ $rt->set_launch_icon('');
+ $rt->set_vendor_code($this->doc->nodeValue('/activity/basiclti/organizationid'));
+ $rt->set_vendor_description($this->doc->nodeValue('/activity/basiclti/organizationdescr'));
+ $rt->set_vendor_url($this->doc->nodeValue('/activity/basiclti/organizationurl'));
+ $this->store($rt, $outdir, $title);
+ return true;
+ }
+
+}
--- /dev/null
+<?php
+// This file is part of Moodle - http://moodle.org/
+//
+// Moodle is free software: you can redistribute it and/or modify
+// it under the terms of the GNU General Public License as published by
+// the Free Software Foundation, either version 3 of the License, or
+// (at your option) any later version.
+//
+// Moodle is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+// GNU General Public License for more details.
+//
+// You should have received a copy of the GNU General Public License
+// along with Moodle. If not, see <http://www.gnu.org/licenses/>.
+/**
+* @package backup-convert
+* @subpackage cc-library
+* @copyright 2011 Darko Miletic <dmiletic@moodlerooms.com>
+* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
+*/
+
+require_once 'cc_converters.php';
+require_once 'cc_general.php';
+require_once 'cc_forum.php';
+
+class cc_converter_forum extends cc_converter {
+
+ public function __construct(cc_i_item &$item, cc_i_manifest &$manifest, $rootpath, $path){
+ $this->cc_type = cc_version11::discussiontopic;
+ $this->defaultfile = 'forum.xml';
+ $this->defaultname = 'discussion.xml';
+ parent::__construct($item, $manifest, $rootpath, $path);
+ }
+
+ public function convert($outdir) {
+ $rt = new forum11_resurce_file();
+ $title = $this->doc->nodeValue('/activity/forum/name');
+ $rt->set_title($title);
+ $text = $this->doc->nodeValue('/activity/forum/intro');
+ $deps = null;
+ if (!empty($text)) {
+ $textformat = intval($this->doc->nodeValue('/activity/forum/introformat'));
+ $contextid = $this->doc->nodeValue('/activity/@contextid');
+ $result = cc_helpers::process_linked_files($text,
+ $this->manifest,
+ $this->rootpath,
+ $contextid,
+ $outdir);
+
+ $textformat = ($textformat == 1) ? 'text/html' : 'text/plain';
+ $rt->set_text($result[0], $textformat);
+ $deps = $result[1];
+ }
+
+ $this->store($rt, $outdir, $title, $deps);
+ return true;
+ }
+
+}
+
--- /dev/null
+<?php
+// This file is part of Moodle - http://moodle.org/
+//
+// Moodle is free software: you can redistribute it and/or modify
+// it under the terms of the GNU General Public License as published by
+// the Free Software Foundation, either version 3 of the License, or
+// (at your option) any later version.
+//
+// Moodle is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+// GNU General Public License for more details.
+//
+// You should have received a copy of the GNU General Public License
+// along with Moodle. If not, see <http://www.gnu.org/licenses/>.
+/**
+* @package backup-convert
+* @subpackage cc-library
+* @copyright 2011 Darko Miletic <dmiletic@moodlerooms.com>
+* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
+*/
+
+require_once 'cc_converters.php';
+require_once 'cc_general.php';
+require_once 'cc_basiclti.php';
+
+class cc_converter_lti extends cc_converter {
+
+ public function __construct(cc_i_item &$item, cc_i_manifest &$manifest, $rootpath, $path){
+ $this->cc_type = cc_version11::basiclti;
+ $this->defaultfile = 'lti.xml';
+ $this->defaultname = basicltil1_resurce_file::deafultname;
+ parent::__construct($item, $manifest, $rootpath, $path);
+ }
+
+ public function convert($outdir) {
+ $rt = new basicltil1_resurce_file();
+ $title = $this->doc->nodeValue('/activity/lti/name');
+ $rt->set_title($title);
+ $rt->set_description($this->doc->nodeValue('/activity/lti/intro'));
+ $rt->set_launch_url($this->doc->nodeValue('/activity/lti/toolurl'));
+ $rt->set_launch_icon('');
+ $this->store($rt, $outdir, $title);
+ return true;
+ }
+}
--- /dev/null
+<?php
+// This file is part of Moodle - http://moodle.org/
+//
+// Moodle is free software: you can redistribute it and/or modify
+// it under the terms of the GNU General Public License as published by
+// the Free Software Foundation, either version 3 of the License, or
+// (at your option) any later version.
+//
+// Moodle is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+// GNU General Public License for more details.
+//
+// You should have received a copy of the GNU General Public License
+// along with Moodle. If not, see <http://www.gnu.org/licenses/>.
+/**
+* @package backup-convert
+* @subpackage cc-library
+* @copyright 2011 Darko Miletic <dmiletic@moodlerooms.com>
+* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
+*/
+
+require_once 'cc_converters.php';
+require_once 'cc_general.php';
+
+class cc_converter_resource extends cc_converter {
+
+ public function __construct(cc_i_item &$item, cc_i_manifest &$manifest, $rootpath, $path){
+ $this->cc_type = cc_version11::webcontent;
+ $this->defaultfile = 'resource.xml';
+ parent::__construct($item, $manifest, $rootpath, $path);
+ }
+
+ public function convert($outdir) {
+ $title = $this->doc->nodeValue('/activity/resource/name');
+ $contextid = $this->doc->nodeValue('/activity/@contextid');
+ $files = cc_helpers::handle_resource_content($this->manifest,
+ $this->rootpath,
+ $contextid,
+ $outdir);
+ $deps = null;
+ $resvalue = null;
+ foreach ($files as $vfile => $values) {
+ if ($values[2]) {
+ $resvalue = $values[0];
+ break;
+ }
+ }
+
+ $resitem = new cc_item();
+ $resitem->identifierref = $resvalue;
+ $resitem->title = $title;
+ $this->item->add_child_item($resitem);
+
+ return true;
+ }
+
+}
+
--- /dev/null
+<?php
+// This file is part of Moodle - http://moodle.org/
+//
+// Moodle is free software: you can redistribute it and/or modify
+// it under the terms of the GNU General Public License as published by
+// the Free Software Foundation, either version 3 of the License, or
+// (at your option) any later version.
+//
+// Moodle is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+// GNU General Public License for more details.
+//
+// You should have received a copy of the GNU General Public License
+// along with Moodle. If not, see <http://www.gnu.org/licenses/>.
+/**
+* @package backup-convert
+* @subpackage cc-library
+* @copyright 2011 Darko Miletic <dmiletic@moodlerooms.com>
+* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
+*/
+
+require_once 'cc_converters.php';
+require_once 'cc_general.php';
+require_once 'cc_weblink.php';
+
+class cc_converter_url extends cc_converter {
+
+ public function __construct(cc_i_item &$item, cc_i_manifest &$manifest, $rootpath, $path){
+ $this->cc_type = cc_version11::weblink;
+ $this->defaultfile = 'url.xml';
+ $this->defaultname = 'weblink.xml';
+ parent::__construct($item, $manifest, $rootpath, $path);
+ }
+
+ public function convert($outdir) {
+ $rt = new url11_resurce_file();
+ $title = $this->doc->nodeValue('/activity/url/name');
+ $rt->set_title($title);
+ $url = $this->doc->nodeValue('/activity/url/externalurl');
+ if (!empty($url)) {
+ /**
+ *
+ * Display value choices
+ * 0 - automatic (system chooses what to do) (usualy defaults to the open)
+ * 1 - embed - display within a frame
+ * 5 - open - just open it full in the same frame
+ * 6 - in popup - popup - new frame
+ */
+ $display = intval($this->doc->nodeValue('/activity/forum/display'));
+ $target = ($display == 6) ? '_blank' : '_self';
+ //TODO: Moodle also supports custom parameters
+ //this should be transformed somehow into url where possible
+ $rt->set_url($url, $target);
+ }
+
+ $this->store($rt, $outdir, $title);
+ return true;
+ }
+
+}
+
--- /dev/null
+<?php
+// This file is part of Moodle - http://moodle.org/
+//
+// Moodle is free software: you can redistribute it and/or modify
+// it under the terms of the GNU General Public License as published by
+// the Free Software Foundation, either version 3 of the License, or
+// (at your option) any later version.
+//
+// Moodle is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+// GNU General Public License for more details.
+//
+// You should have received a copy of the GNU General Public License
+// along with Moodle. If not, see <http://www.gnu.org/licenses/>.
+/**
+* @package backup-convert
+* @subpackage cc-library
+* @copyright 2011 Darko Miletic <dmiletic@moodlerooms.com>
+* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
+*/
+
+require_once 'cc_interfaces.php';
+
+abstract class cc_converter {
+ /**
+ *
+ * Enter description here ...
+ * @var cc_item
+ */
+ protected $item = null;
+ /**
+ *
+ * Enter description here ...
+ * @var cc_manifest
+ */
+ protected $manifest = null;
+ /**
+ *
+ * Enter description here ...
+ * @var string
+ */
+ protected $rootpath = null;
+ /**
+ *
+ * Enter description here ...
+ * @var string
+ */
+ protected $path = null;
+ /**
+ *
+ * Enter description here ...
+ * @var string
+ */
+ protected $defaultfile = null;
+ /**
+ *
+ * Enter description here ...
+ * @var string
+ */
+ protected $defaultname = null;
+ /**
+ *
+ * Enter description here ...
+ * @var string
+ */
+ protected $cc_type = null;
+ /**
+ *
+ * Document
+ * @var XMLGenericDocument
+ */
+ protected $doc = null;
+
+ /**
+ *
+ * ctor
+ * @param cc_i_item $item
+ * @param cc_i_manifest $manifest
+ * @param string $rootpath
+ * @param string $path
+ * @throws InvalidArgumentException
+ */
+ public function __construct(cc_i_item &$item, cc_i_manifest &$manifest, $rootpath, $path){
+ $rpath = realpath($rootpath);
+ if (empty($rpath)) {
+ throw new InvalidArgumentException('Invalid path!');
+ }
+ $rpath2 = realpath($path);
+ if (empty($rpath)) {
+ throw new InvalidArgumentException('Invalid path!');
+ }
+ $doc = new XMLGenericDocument();
+ if (!$doc->load($path . DIRECTORY_SEPARATOR . $this->defaultfile)) {
+ throw new RuntimeException('File does not exist!');
+ }
+
+ $this->doc = $doc;
+ $this->item = $item;
+ $this->manifest = $manifest;
+ $this->rootpath = $rpath;
+ $this->path = $rpath2;
+ }
+
+ /**
+ *
+ * performs conversion
+ * @param string $outdir - root directory of common cartridge
+ * @return boolean
+ */
+ abstract public function convert($outdir);
+
+ /**
+ *
+ * Stores any files that need to be stored
+ */
+ protected function store(general_cc_file $doc, $outdir, $title, $deps = null) {
+ $rdir = new cc_resource_location($outdir);
+ $rtp = $rdir->fullpath(true).$this->defaultname;
+ $doc->saveTo($rtp);
+ $resource = new cc_resource($rdir->rootdir(), $this->defaultname, $rdir->dirname(true));
+ $resource->dependency = empty($deps) ? array() : $deps;
+ $res = $this->manifest->add_resource($resource, null, $this->cc_type);
+ $resitem = new cc_item();
+ $resitem->attach_resource($res[0]);
+ $resitem->title = $title;
+ $this->item->add_child_item($resitem);
+ }
+}
--- /dev/null
+<?php
+// This file is part of Moodle - http://moodle.org/
+//
+// Moodle is free software: you can redistribute it and/or modify
+// it under the terms of the GNU General Public License as published by
+// the Free Software Foundation, either version 3 of the License, or
+// (at your option) any later version.
+//
+// Moodle is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+// GNU General Public License for more details.
+//
+// You should have received a copy of the GNU General Public License
+// along with Moodle. If not, see <http://www.gnu.org/licenses/>.
+/**
+* @package backup-convert
+* @subpackage cc-library
+* @copyright 2011 Darko Miletic <dmiletic@moodlerooms.com>
+* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
+*/
+
+require_once 'cc_general.php';
+
+class forum1_resurce_file extends general_cc_file {
+ const deafultname = 'discussion.xml';
+
+ protected $rootns = 'dt';
+ protected $rootname = 'dt:topic';
+ protected $ccnamespaces = array('dt' => 'http://www.imsglobal.org/xsd/imsdt_v1p0',
+ 'xsi' => 'http://www.w3.org/2001/XMLSchema-instance');
+ protected $ccnsnames = array('dt' => 'http://www.imsglobal.org/profile/cc/ccv1p0/derived_schema/domainProfile_6/imsdt_v1p0_localised.xsd');
+
+ protected $title = null;
+ protected $text_type = 'text/plain';
+ protected $text = null;
+ protected $attachments = array();
+
+ public function set_title($title) {
+ $this->title = $title;
+ }
+
+ public function set_text($text, $type='text/plain') {
+ $this->text = $text;
+ $this->text_type = $type;
+ }
+
+ public function set_attachments(array $attachments) {
+ $this->attachments = $attachments;
+ }
+
+ protected function on_save() {
+ $this->append_new_element($this->root, 'title', $this->title);
+ $text = $this->append_new_element($this->root, 'text', $this->text);
+ $this->append_new_attribute($text, 'texttype', $this->text_type);
+ if (!empty($this->attachments)) {
+ $attachments = $this->append_new_element($this->root, 'attachments');
+ foreach ($this->attachments as $value) {
+ $att = $this->append_new_element($attachments, 'attachment');
+ $this->append_new_attribute($att, 'href', $value);
+ }
+ }
+ return true;
+ }
+
+}
+
+class forum11_resurce_file extends forum1_resurce_file {
+ protected $rootns = 'dt';
+ protected $rootname = 'topic';
+ protected $ccnamespaces = array('dt' => 'http://www.imsglobal.org/xsd/imsccv1p1/imsdt_v1p1',
+ 'xsi' => 'http://www.w3.org/2001/XMLSchema-instance');
+ protected $ccnsnames = array('dt' => 'http://www.imsglobal.org/profile/cc/ccv1p1/ccv1p1_imsdt_v1p1.xsd');
+
+ protected function on_save() {
+ $rns = $this->ccnamespaces[$this->rootns];
+ $this->append_new_element_ns($this->root, $rns, 'title', $this->title);
+ $text = $this->append_new_element_ns($this->root, $rns, 'text', $this->text);
+ $this->append_new_attribute_ns($text, $rns, 'texttype', $this->text_type);
+ if (!empty($this->attachments)) {
+ $attachments = $this->append_new_element_ns($this->root, $rns, 'attachments');
+ foreach ($this->attachments as $value) {
+ $att = $this->append_new_element_ns($attachments, $rns, 'attachment');
+ $this->append_new_attribute_ns($att, $rns, 'href', $value);
+ }
+ }
+ return true;
+ }
+
+}
+
+
+
--- /dev/null
+<?php
+// This file is part of Moodle - http://moodle.org/
+//
+// Moodle is free software: you can redistribute it and/or modify
+// it under the terms of the GNU General Public License as published by
+// the Free Software Foundation, either version 3 of the License, or
+// (at your option) any later version.
+//
+// Moodle is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+// GNU General Public License for more details.
+//
+// You should have received a copy of the GNU General Public License
+// along with Moodle. If not, see <http://www.gnu.org/licenses/>.
+/**
+* @package backup-convert
+* @subpackage cc-library
+* @copyright 2011 Darko Miletic <dmiletic@moodlerooms.com>
+* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
+*/
+
+require_once 'gral_lib/cssparser.php';
+require_once 'xmlbase.php';
+
+class general_cc_file extends XMLGenericDocument {
+ /**
+ *
+ * Root element
+ * @var DOMElement
+ */
+ protected $root = null;
+ protected $rootns = null;
+ protected $rootname = null;
+ protected $ccnamespaces = array();
+ protected $ccnsnames = array();
+
+ public function __construct() {
+ parent::__construct();
+
+ foreach ($this->ccnamespaces as $key => $value){
+ $this->registerNS($key,$value);
+ }
+ }
+
+
+ protected function on_create() {
+ $rootel = $this->append_new_element_ns($this->doc,
+ $this->ccnamespaces[$this->rootns],
+ $this->rootname);
+ //add all namespaces
+ foreach ($this->ccnamespaces as $key => $value) {
+ $dummy_attr = "{$key}:dummy";
+ $this->doc->createAttributeNS($value,$dummy_attr);
+ }
+
+ // add location of schemas
+ $schemaLocation='';
+ foreach ($this->ccnsnames as $key => $value) {
+ $vt = empty($schemaLocation) ? '' : ' ';
+ $schemaLocation .= $vt.$this->ccnamespaces[$key].' '.$value;
+ }
+ $this->append_new_attribute_ns($rootel,
+ $this->ccnamespaces['xsi'],
+ 'xsi:schemaLocation',
+ $schemaLocation);
+
+ $this->root = $rootel;
+ }
+
+}
--- /dev/null
+<?php
+// This file is part of Moodle - http://moodle.org/
+//
+// Moodle is free software: you can redistribute it and/or modify
+// it under the terms of the GNU General Public License as published by
+// the Free Software Foundation, either version 3 of the License, or
+// (at your option) any later version.
+//
+// Moodle is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+// GNU General Public License for more details.
+//
+// You should have received a copy of the GNU General Public License
+// along with Moodle. If not, see <http://www.gnu.org/licenses/>.
+/**
+* @package backup-convert
+* @subpackage cc-library
+* @copyright 2011 Darko Miletic <dmiletic@moodlerooms.com>
+* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
+*/
+
+/**
+ * CC Manifest Interface
+ */
+interface cc_i_manifest {
+
+ public function on_create ();
+ public function on_load ();
+ public function on_save ();
+ public function add_new_organization (cc_i_organization &$org);
+ public function get_resources ();
+ public function get_resource_list ();
+ public function add_resource (cc_i_resource $res, $identifier=null, $type='webcontent');
+ public function add_metadata_manifest(cc_i_metadata_manifest $met);
+ public function add_metadata_resource (cc_i_metadata_resource $met,$identifier);
+ public function add_metadata_file (cc_i_metadata_file $met,$identifier,$filename);
+ public function put_nodes ();
+
+}
+
+
+
+/**
+ * CC Organization Interface
+ */
+interface cc_i_organization {
+
+ public function add_item (cc_i_item &$item);
+ public function has_items ();
+ public function attr_value (&$nod, $name, $ns=null);
+ public function process_organization (&$node,&$doc);
+
+}
+
+
+
+/**
+ * CC Item Interface
+ */
+interface cc_i_item {
+
+ public function add_child_item (cc_i_item &$item);
+ public function attach_resource ($res); // can be object or value
+ public function has_child_items ();
+ public function attr_value (&$nod, $name, $ns=null);
+ public function process_item (&$node,&$doc);
+
+}
+
+
+/**
+ * CC Resource Interface
+ */
+interface cc_i_resource {
+
+ public function get_attr_value (&$nod, $name, $ns=null);
+ public function add_resource ($fname, $location='');
+ public function import_resource (DOMElement &$node, cc_i_manifest &$doc);
+ public function process_resource ($manifestroot, &$fname,$folder);
+
+}
+
+
+
+/**
+ * CC Metadata Manifest Interface
+ */
+interface cc_i_metadata_manifest {
+
+ public function add_metadata_general($obj);
+ public function add_metadata_technical($obj);
+ public function add_metadata_rights($obj);
+ public function add_metadata_lifecycle($obj);
+
+}
+
+
+/**
+ * CC Metadata Resource Interface
+ */
+interface cc_i_metadata_resource {
+
+ public function add_metadata_resource_educational($obj);
+
+}
+
+/**
+ * CC Metadata File Interface
+ */
+interface cc_i_metadata_file {
+
+ public function add_metadata_file_educational($obj);
+
+}
+
--- /dev/null
+<?php
+// This file is part of Moodle - http://moodle.org/
+//
+// Moodle is free software: you can redistribute it and/or modify
+// it under the terms of the GNU General Public License as published by
+// the Free Software Foundation, either version 3 of the License, or
+// (at your option) any later version.
+//
+// Moodle is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+// GNU General Public License for more details.
+//
+// You should have received a copy of the GNU General Public License
+// along with Moodle. If not, see <http://www.gnu.org/licenses/>.
+/**
+* Manifest management
+*
+* @package backup-convert
+* @subpackage cc-library
+* @copyright 2011 Darko Miletic <dmiletic@moodlerooms.com>
+* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
+*/
+
+
+require_once 'cc_utils.php';
+require_once 'xmlbase.php';
+require_once 'cc_resources.php';
+require_once 'cc_version_base.php';
+require_once 'gral_lib/pathutils.php';
+
+
+/**
+ * Manifest Class
+ *
+ */
+class cc_manifest extends XMLGenericDocument implements cc_i_manifest {
+ private $ccversion = null;
+ private $ccobj = null;
+ private $rootmanifest = null;
+ private $activemanifest = null;
+ private $parentmanifest = null;
+ private $parentparentmanifest = null;
+ private $ares = array();
+ private $mainidentifier = null;
+
+ public function __construct($ccver = cc_version::v1,$activemanifest=null,
+ $parentmanifest=null,$parentparentmanifest=null) {
+
+ if (is_int($ccver)){
+ $this->ccversion=$ccver;
+ $classname = "cc_version{$ccver}";
+ $this->ccobj = new $classname;
+ parent::__construct('UTF-8',true);
+ } else
+ if (is_object($ccver) && (get_class($ccver)=='cc_manifest')){
+ $this->doc = $ccver->doc;
+ $this->rootmanifest = $ccver->rootmanifest;
+ $this->activemanifest = $activemanifest;
+ $this->parentmanifest = $parentmanifest;
+ $this->parentparentmanifest = $parentparentmanifest;
+ $this->ccversion = $ccver->ccversion;
+ $this->ccobj = $ccver;
+ $this->register_namespaces_for_xpath();
+ }
+ }
+
+ public function __destruct() {
+ parent::__destruct();
+ }
+
+
+ /**
+ * Register Namespace for use XPATH
+ *
+ */
+ public function register_namespaces_for_xpath(){
+ $scnam = $this->activemanifest->get_cc_namespaces();
+ foreach ($scnam as $key => $value){
+ $this->registerNS($key,$value);
+ }
+ }
+
+ /**
+ * TODO - implement this method - critical
+ * Enter description here ...
+ */
+ private function fill_manifest() {
+
+ }
+
+ /**
+ * Add Metadata For Manifest
+ *
+ * @param cc_i_metadata_manifest $met
+ */
+ public function add_metadata_manifest (cc_i_metadata_manifest $met){
+ $metanode = $this->node("//imscc:manifest[@identifier='".
+ $this->activemanifest->manifestID().
+ "']/imscc:metadata");
+ $nmeta = $this->activemanifest->create_metadata_node($met,$this->doc,$metanode);
+ $metanode->appendChild($nmeta);
+ }
+
+
+ /**
+ * Add Metadata For Resource
+ *
+ * @param cc_i_metadata_resource $met
+ * @param string $identifier
+ */
+ public function add_metadata_resource (cc_i_metadata_resource $met,$identifier){
+ $metanode = $this->node("//imscc:resource".
+ "[@identifier='".
+ $identifier.
+ "']");
+ $metanode2 = $this->node("//imscc:resource".
+ "[@identifier='".
+ $identifier.
+ "']/imscc:file");
+ $dnode = $this->doc->createElementNS($this->ccnamespaces['imscc'], "metadata");
+
+ $metanode->insertBefore($dnode,$metanode2);
+
+ $this->activemanifest->create_metadata_resource_node($met,$this->doc,$dnode);
+ }
+
+
+ /**
+ * Add Metadata For File
+ *
+ * @param cc_i_metadata_file $met
+ * @param string $identifier
+ * @param string $filename
+ */
+ public function add_metadata_file (cc_i_metadata_file $met,$identifier,$filename){
+
+ if (empty($met) || empty($identifier) || empty($filename)){
+ throw new Exception('Try to add a metadata file with nulls values given!');
+ }
+
+ $metanode = $this->node("//imscc:resource".
+ "[@identifier='".
+ $identifier.
+ "']/imscc:file".
+ "[@href='".
+ $filename.
+ "']");
+
+ $dnode = $this->doc->createElementNS($this->ccnamespaces['imscc'], "metadata");
+
+ $metanode->appendChild($dnode);
+
+ $this->activemanifest->create_metadata_file_node($met,$this->doc,$dnode);
+ }
+
+
+ public function on_create (){
+ $this->activemanifest = cc_builder_creator::factory($this->ccversion);
+ $this->rootmanifest = $this->activemanifest;
+ $result = $this->activemanifest->create_manifest($this->doc);
+ $this->register_namespaces_for_xpath();
+ return $result;
+
+ }
+
+
+ public function get_relative_base_path() {return $this->activemanifest->base();}
+ public function parent_manifest () {return new cc_manifest($this,$this->parentmanifest,$this->parentparentmanifest);}
+ public function root_manifest () {return new cc_manifest($this,$this->rootmanifest);}
+ public function manifestID () {return $this->activemanifest->manifestID();}
+ public function get_manifest_namespaces() {return $this->rootmanifest->get_cc_namespaces(); }
+
+
+
+ /**
+ * Add a new organization
+ *
+ * @param cc_i_organization $org
+ */
+ public function add_new_organization(cc_i_organization &$org) {
+ $norg = $this->activemanifest->create_organization_node($org,$this->doc);
+ $orgnode = $this->node("//imscc:manifest[@identifier='".
+ $this->activemanifest->manifestID().
+ "']/imscc:organizations");
+ $orgnode->appendChild($norg);
+ }
+
+
+
+ public function get_resources($searchspecific='') {
+ $reslist = $this->get_resource_list($searchspecific);
+ $resourcelist = array();
+ foreach ($reslist as $resourceitem) {
+ $resourcelist[]=new cc_resource($this, $resourceitem);
+ }
+ return $resourcelist;
+ }
+
+
+
+ public function get_cc_namespace_path($nsname) {
+ if (is_string($nsname) && (!empty($nsname))){
+ $scnam = $this->activemanifest->get_cc_namespaces();
+ return $scnam[$nsname];
+ }
+ return null;
+ }
+
+
+ public function get_resource_list($searchspecific=''){
+ return $this->nodeList("//imscc:manifest[@identifier='".
+ $this->activemanifest->manifestID().
+ "']/imscc:resources/imscc:resource".$searchspecific);
+ }
+
+
+ public function on_load (){
+ $this->register_namespaces_for_xpath();
+ $this->fill_manifest();
+ return true;
+ }
+
+ public function on_save (){
+ return true;
+ }
+
+
+ /**
+ * Add a resource to the manifest
+ *
+ * @param cc_i_resource $res
+ * @param string $identifier
+ * @param string $type
+ * @return array
+ */
+ public function add_resource (cc_i_resource $res, $identifier=null, $type='webcontent'){
+
+ if (!$this->ccobj->valid($type)){
+ throw new Exception("Type invalid...");
+ }
+
+ if (is_null($res)){
+ throw new Exception('Invalid Resource or dont give it');
+ }
+ $rst = null;
+
+ if (is_string($res)){
+ $rst = new cc_resource($this->filePath(), $res);
+ if (is_string($identifier)){
+ $rst->identifier = $identifier;
+ }
+ } else {
+ $rst = $res;
+ }
+
+ //TODO: This has to be reviewed since it does not handle properly mutiple file
+ // dependencies
+ if (is_object($identifier)) {
+ $this->activemanifest->create_resource_node($rst,$this->doc,$identifier);
+ } else {
+ $nresnode = null;
+
+ $rst->type = $type;
+ if (!cc_helpers::is_html($rst->filename)) {
+ $rst->href = null;
+ }
+ $this->activemanifest->create_resource_node($rst,$this->doc,$nresnode);
+
+
+ for ($i = 1 ; $i < count ($rst->files); $i++){
+ $ident = $this->get_identifier_by_filename($rst->files[$i]);
+ if(empty($ident)){
+ $newres = new cc_resource($rst->manifestroot,$rst->files[$i],false);
+ if (!empty($newres)) {
+ if (!cc_helpers::is_html($rst->files[$i])) {
+ $newres->href = null;
+ }
+ $newres->type = 'webcontent';
+ $this->activemanifest->create_resource_node($newres,$this->doc,$nresnode);
+ }
+ }
+
+ }
+ foreach ($this->activemanifest->resources as $k => $v){
+ ($k);
+ $depen = $this->check_if_exist_in_other($v->files[0]);
+ if (!empty($depen)){
+ $this->replace_file_x_dependency($depen,$v->files[0]);
+ // coloca aca como type = webcontent porque son archivos dependientes
+ // quizas aqui habria q ver de que type es el que vino y segun eso, ponerlo
+ // en associatedcontent o en webcontent
+ $v->type = 'webcontent';
+ }
+ }
+ }
+
+ $tmparray = array($rst->identifier,$rst->files[0]);
+ return $tmparray;
+ }
+
+
+
+ private function check_if_exist_in_other($name){
+ $status = array();
+ foreach ($this->activemanifest->resources as $key => $value){
+ ($key);
+ for ($i=1; $i< count($value->files); $i++){
+ if ($name == $value->files[$i]){
+ array_push($status,$value->identifier);
+ }
+ }
+ }
+ return $status;
+ }
+
+
+ private function replace_file_x_dependency($depen,$name){
+ foreach ($depen as $key => $value){
+ ($key);
+ $ident = $this->get_identifier_by_filename($name);
+ $this->activemanifest->resources[$value]->files =
+ $this->array_remove_by_value($this->activemanifest->resources[$value]->files,$name);
+ if (!in_array($ident,$this->activemanifest->resources[$value]->dependency)){
+ array_push($this->activemanifest->resources[$value]->dependency,$ident);
+ }
+
+ }
+ return true;
+ }
+
+
+ private function get_identifier_by_filename($name){
+ $result = null;
+ foreach ($this->activemanifest->resources as $key => $value) {
+ if ($name == $value->files[0]){
+ $result = $key;
+ break;
+ }
+ }
+ return $result;
+ }
+
+
+
+ private function array_remove_by_value($arr,$value) {
+ return array_values(array_diff($arr,array($value)));
+
+ }
+
+ private function array_remove_by_key($arr,$key) {
+ return array_values(array_diff_key($arr,array($key)));
+
+ }
+
+
+ /**
+ * Append the resources nodes in the Manifest
+ *
+ * @return DOMNode
+ */
+ public function put_nodes (){
+
+ $resnodestr = "//imscc:manifest[@identifier='".$this->activemanifest->manifestID().
+ "']/imscc:resources";
+ $resnode = $this->node($resnodestr);
+
+ foreach ($this->activemanifest->resources as $key => $node) {
+ ($key);
+ $resnode->appendChild($this->activemanifest->create_resource_node($node,$this->doc,null));
+ }
+ return $resnode;
+
+ }
+}
+
+
--- /dev/null
+<?php
+// This file is part of Moodle - http://moodle.org/
+//
+// Moodle is free software: you can redistribute it and/or modify
+// it under the terms of the GNU General Public License as published by
+// the Free Software Foundation, either version 3 of the License, or
+// (at your option) any later version.
+//
+// Moodle is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+// GNU General Public License for more details.
+//
+// You should have received a copy of the GNU General Public License
+// along with Moodle. If not, see <http://www.gnu.org/licenses/>.
+
+/**
+* @package backup-convert
+* @subpackage cc-library
+* @copyright 2011 Darko Miletic <dmiletic@moodlerooms.com>
+* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
+*/
+
+
+
+ /**
+ Defined as specified in CC 1.1
+ */
+class intended_user_role {
+ const LEARNER = 'Learner';
+ const INSTRUCTOR = 'Instructor';
+ const MENTOR = 'Mentor';
+}
+
+class technical_role {
+ const AUTHOR = 'author';
+ const PUBLISHER = 'publisher';
+ const UNKNOWN = 'unknown';
+ const INITIATOR = 'initiator';
+ const TERMINATOR = 'terminator';
+ const VALIDATOR = 'validator';
+ const EDITOR = 'editor';
+ const GRAPHICAL_DESIGNER = 'graphical designer';
+ const TECHNICAL_IMPLEMENTER = 'technical implementer';
+ const CONTENT_PROVIDER = 'content provider';
+ const TECHNICAL_VALIDATOR = 'technical validator';
+ const EDUCATION_VALIDATOR = 'educational validator';
+ const SCRIPT_WRITER = 'script writer';
+ const INSTRUCTIONAL_DESIGNER= 'instructional designer';
+ const SUBJET_MATTER_EXPERT = 'subject matter expert';
+}
+
+
+class rights_copyright {
+ const YES = 'yes';
+ const NO = 'no';
+}
+
+
+class rights_cost {
+ const YES = 'yes';
+ const NO = 'no';
+}
+
+
+// Language identifier (as defined in ISO 639-1, ISO 639-2, and ISO 3166-1)
+class language_lom {
+ const US_ENGLISH = 'en-US';
+ const GB_ENGLISH = 'en-GB';
+ const AR_SPANISH = 'es-AR';
+ const GR_GREEK = 'el-GR';
+
+}
+
+
+
+/**
+ * Metadata Manifest
+ *
+ */
+class cc_metadata_manifest implements cc_i_metadata_manifest {
+
+
+ public $arraygeneral = array();
+ public $arraytech = array();
+ public $arrayrights = array();
+ public $arraylifecycle = array();
+
+
+ public function add_metadata_general($obj){
+ if (empty($obj)){
+ throw new Exception('Medatada Object given is invalid or null!');
+ }
+ !is_null($obj->title)? $this->arraygeneral['title']=$obj->title:null;
+ !is_null($obj->language)? $this->arraygeneral['language']=$obj->language:null;
+ !is_null($obj->description)? $this->arraygeneral['description']=$obj->description:null;
+ !is_null($obj->keyword)? $this->arraygeneral['keyword']=$obj->keyword:null;
+ !is_null($obj->coverage)? $this->arraygeneral['coverage']=$obj->coverage:null;
+ !is_null($obj->catalog)? $this->arraygeneral['catalog']=$obj->catalog:null;
+ !is_null($obj->entry)? $this->arraygeneral['entry']=$obj->entry:null;
+ }
+
+ public function add_metadata_technical($obj){
+ if (empty($obj)){
+ throw new Exception('Medatada Object given is invalid or null!');
+ }
+ !is_null($obj->format)? $this->arraytech['format']=$obj->format:null;
+ }
+
+
+ public function add_metadata_rights($obj){
+ if (empty($obj)){
+ throw new Exception('Medatada Object given is invalid or null!');
+ }
+ !is_null($obj->copyright)? $this->arrayrights['copyrightAndOtherRestrictions']=$obj->copyright:null;
+ !is_null($obj->description)? $this->arrayrights['description']=$obj->description:null;
+ !is_null($obj->cost)? $this->arrayrights['cost']=$obj->cost:null;
+
+ }
+
+
+ public function add_metadata_lifecycle($obj){
+ if (empty($obj)){
+ throw new Exception('Medatada Object given is invalid or null!');
+ }
+ !is_null($obj->role)? $this->arraylifecycle['role']=$obj->role:null;
+ !is_null($obj->entity)? $this->arraylifecycle['entity']=$obj->entity:null;
+ !is_null($obj->date)? $this->arraylifecycle['date']=$obj->date:null;
+
+ }
+
+}
+
+
+/**
+ * Metadata Lifecycle Type
+ *
+ */
+class cc_metadata_lifecycle{
+
+ public $role = array();
+ public $entity = array();
+ public $date = array();
+
+ public function set_role($role){
+ $this->role[] = array($role);
+ }
+ public function set_entity($entity){
+ $this->entity[] = array($entity);
+ }
+ public function set_date($date){
+ $this->date[] = array($date);
+ }
+
+
+}
+
+/**
+ * Metadata Rights Type
+ *
+ */
+class cc_metadata_rights {
+
+ public $copyright = array();
+ public $description = array();
+ public $cost = array();
+
+ public function set_copyright($copy){
+ $this->copyright[] = array($copy);
+ }
+ public function set_description ($des,$language){
+ $this->description[] = array($language,$des);
+ }
+ public function set_cost($cost){
+ $this->cost[] = array($cost);
+ }
+
+}
+
+
+/**
+ * Metadata Technical Type
+ *
+ */
+class cc_metadata_technical {
+
+ public $format = array();
+
+
+ public function set_format($format){
+ $this->format[] = array($format);
+ }
+
+}
+
+
+/**
+ * Metadata General Type
+ *
+ */
+class cc_metadata_general {
+
+ public $title = array();
+ public $language = array();
+ public $description = array();
+ public $keyword = array();
+ public $coverage = array();
+ public $catalog = array();
+ public $entry = array();
+
+
+
+ public function set_coverage ($coverage,$language){
+ $this->coverage[] = array($language,$coverage);
+ }
+ public function set_description ($description,$language){
+ $this->description[] = array($language,$description);
+ }
+ public function set_keyword ($keyword,$language){
+ $this->keyword[] = array($language,$keyword);
+ }
+ public function set_language ($language){
+ $this->language[] = array($language);
+ }
+ public function set_title ($title,$language){
+ $this->title[] = array($language,$title);
+ }
+ public function set_catalog ($cat){
+ $this->catalog[] = array($cat);
+ }
+ public function set_entry ($entry){
+ $this->entry[] = array($entry);
+ }
+
+
+}
\ No newline at end of file
--- /dev/null
+<?php
+// This file is part of Moodle - http://moodle.org/
+//
+// Moodle is free software: you can redistribute it and/or modify
+// it under the terms of the GNU General Public License as published by
+// the Free Software Foundation, either version 3 of the License, or
+// (at your option) any later version.
+//
+// Moodle is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+// GNU General Public License for more details.
+//
+// You should have received a copy of the GNU General Public License
+// along with Moodle. If not, see <http://www.gnu.org/licenses/>.
+
+/**
+* Metadata management
+*
+* @package backup-convert
+* @subpackage cc-library
+* @copyright 2011 Darko Miletic <dmiletic@moodlerooms.com>
+* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
+*/
+
+
+/**
+ * Metadata File Education Type
+ *
+ */
+class cc_metadata_file_educational{
+
+ public $value = array();
+
+ public function set_value ($value){
+ $arr = array($value);
+ $this->value[] = $arr;
+ }
+
+}
+
+/**
+ * Metadata File
+ *
+ */
+class cc_metadata_file implements cc_i_metadata_file {
+
+ public $arrayeducational = array();
+
+ public function add_metadata_file_educational($obj){
+ if (empty($obj)){
+ throw new Exception('Medatada Object given is invalid or null!');
+ }
+ !is_null($obj->value)? $this->arrayeducational['value']=$obj->value:null;
+ }
+
+
+}
\ No newline at end of file
--- /dev/null
+<?php
+// This file is part of Moodle - http://moodle.org/
+//
+// Moodle is free software: you can redistribute it and/or modify
+// it under the terms of the GNU General Public License as published by
+// the Free Software Foundation, either version 3 of the License, or
+// (at your option) any later version.
+//
+// Moodle is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+// GNU General Public License for more details.
+//
+// You should have received a copy of the GNU General Public License
+// along with Moodle. If not, see <http://www.gnu.org/licenses/>.
+
+/**
+* Metadata managing
+*
+* @package backup-convert
+* @subpackage cc-library
+* @copyright 2011 Darko Miletic <dmiletic@moodlerooms.com>
+* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
+*/
+
+
+
+/**
+ * Metadata Resource Educational Type
+ *
+ */
+class cc_metadata_resouce_educational{
+
+ public $value = array();
+
+
+ public function set_value ($value){
+ $arr = array($value);
+ $this->value[] = $arr;
+ }
+
+}
+
+/**
+ * Metadata Resource
+ *
+ */
+class cc_metadata_resouce implements cc_i_metadata_resource {
+
+ public $arrayeducational = array();
+
+ public function add_metadata_resource_educational($obj){
+ if (empty($obj)){
+ throw new Exception('Medatada Object given is invalid or null!');
+ }
+ !is_null($obj->value)? $this->arrayeducational['value']=$obj->value:null;
+ }
+
+
+}
\ No newline at end of file
--- /dev/null
+<?php
+// This file is part of Moodle - http://moodle.org/
+//
+// Moodle is free software: you can redistribute it and/or modify
+// it under the terms of the GNU General Public License as published by
+// the Free Software Foundation, either version 3 of the License, or
+// (at your option) any later version.
+//
+// Moodle is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+// GNU General Public License for more details.
+//
+// You should have received a copy of the GNU General Public License
+// along with Moodle. If not, see <http://www.gnu.org/licenses/>.
+
+/**
+* @package backup-convert
+* @subpackage cc-library
+* @copyright 2011 Darko Miletic <dmiletic@moodlerooms.com>
+* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
+*/
+
+require_once 'cc_utils.php';
+require_once 'cc_version_base.php';
+require_once 'cc_resources.php';
+require_once 'cc_manifest.php';
+
+
+/**
+ * Organization Class
+ *
+ */
+
+class cc_organization implements cc_i_organization {
+
+
+ public $title = null;
+ public $identifier = null;
+ public $structure = null;
+ public $itemlist = null;
+ private $metadata = null;
+ private $sequencing = null;
+
+
+
+ public function __construct($node=null, $doc=null) {
+ if (is_object($node) && is_object($doc)) {
+ $this->process_organization($node,$doc);
+ } else {
+ $this->init_new();
+ }
+ }
+
+ /**
+ * Add one Item into the Organization
+ *
+ * @param cc_i_item $item
+ */
+ public function add_item(cc_i_item &$item) {
+ if (is_null($this->itemlist)) {
+ $this->itemlist = array();
+ }
+ $this->itemlist[$item->identifier] = $item;
+ }
+
+ /**
+ * Add new Item into the Organization
+ *
+ * @param string $title
+ * @return cc_i_item
+ */
+ public function add_new_item($title='') {
+ $nitem = new cc_item();
+ $nitem->title = $title;
+ $this->add_item($nitem);
+ return $nitem;
+ }
+
+
+ public function has_items() {
+ return is_array($this->itemlist) && (count($this->itemlist) > 0);
+ }
+
+ public function attr_value(&$nod, $name, $ns=null) {
+ return is_null($ns) ?
+ ($nod->hasAttribute($name) ? $nod->getAttribute($name) : null) :
+ ($nod->hasAttributeNS($ns, $name) ? $nod->getAttributeNS($ns, $name) : null);
+ }
+
+
+ public function process_organization(&$node,&$doc) {
+ $this->identifier = $this->attr_value($node,"identifier");
+ $this->structure = $this->attr_value($node,"structure");
+ $this->title = '';
+ $nlist = $node->getElementsByTagName('title');
+ if (is_object($nlist) && ($nlist->length > 0) ) {
+ $this->title = $nlist->item(0)->nodeValue;
+ }
+ $nlist = $doc->nodeList("//imscc:organization[@identifier='".$this->identifier."']/imscc:item");
+ $this->itemlist=array();
+ foreach ($nlist as $item) {
+ $this->itemlist[$item->getAttribute("identifier")] = new cc_item($item,$doc);
+ }
+ $this->isempty=false;
+ }
+
+ public function init_new() {
+ $this->title = null;
+ $this->identifier = cc_helpers::uuidgen('O_');
+ $this->structure = 'rooted-hierarchy';
+ $this->itemlist = null;
+ $this->metadata = null;
+ $this->sequencing = null;
+
+ }
+
+ public function uuidgen() {
+ $uuid = sprintf('%04x%04x', mt_rand(0, 65535), mt_rand(0, 65535));
+ return strtoupper(trim($uuid));
+ }
+
+
+}
+
+
+/**
+ * Item Class
+ *
+ */
+class cc_item implements cc_i_item {
+
+
+ public $identifier = null;
+ public $identifierref = null;
+ public $isvisible = null;
+ public $title = null;
+ public $parameters = null;
+ public $childitems = null;
+ private $parentItem = null;
+ private $isempty = true;
+
+
+
+ public function __construct($node=null,$doc=null) {
+ if (is_object($node)) {
+ $clname = get_class($node);
+ if ($clname =='cc_resource') {
+ $this->init_new_item();
+ $this->identifierref = $node->identifier;
+ $this->title = is_string($doc) && (!empty($doc)) ? $doc : 'item';
+ } else if ($clname =='cc_manifest') {
+ $this->init_new_item();
+ $this->identifierref = $node->manifestID();
+ $this->title = is_string($doc) && (!empty($doc)) ? $doc : 'item';
+ } else if ( is_object($doc)){
+ $this->process_item($node,$doc);
+ } else {
+ $this->init_new_item();
+ }
+ } else {
+ $this->init_new_item();
+ }
+ }
+
+
+
+ public function attr_value(&$nod, $name, $ns=null) {
+ return is_null($ns) ?
+ ($nod->hasAttribute($name) ? $nod->getAttribute($name) : null) :
+ ($nod->hasAttributeNS($ns, $name) ? $nod->getAttributeNS($ns, $name) : null);
+ }
+
+
+ public function process_item(&$node,&$doc) {
+ $this->identifier = $this->attr_value($node,"identifier");
+ $this->structure = $this->attr_value($node,"structure");
+ $this->identifierref = $this->attr_value($node,"identifierref");
+ $atr = $this->attr_value($node,"isvisible");
+ $this->isvisible = is_null($atr) ? true : $atr;
+ $nlist = $node->getElementsByTagName('title');
+ if (is_object($nlist) && ($nlist->length > 0) ) {
+ $this->title = $nlist->item(0)->nodeValue;
+ }
+ $nlist = $doc->nodeList("//imscc:item[@identifier='".$this->identifier."']/imscc:item");
+ if ($nlist->length > 0) {
+ $this->childitems=array();
+ foreach ($nlist as $item) {
+ $key=$this->attr_value($item,"identifier");
+ $this->childitems[$key] = new cc_item($item,$doc);
+ }
+ }
+ $this->isempty = false;
+ }
+
+ /**
+ * Add one Child Item
+ *
+ * @param cc_i_item $item
+ */
+ public function add_child_item(cc_i_item &$item) {
+ if (is_null($this->childitems)) {
+ $this->childitems = array();
+ }
+ $this->childitems[$item->identifier] = $item;
+ }
+
+
+ /**
+ * Add new child Item
+ *
+ * @param string $title
+ * @return cc_i_item
+ */
+ public function add_new_child_item($title='') {
+ $sc = new cc_item();
+ $sc->title = $title;
+ $this->add_child_item($sc);
+ return $sc;
+ }
+
+
+
+ public function attach_resource($resource) {
+
+ if ($this->has_child_items()) {
+ throw new Exception("Can not attach resource to item that contains other items!");
+ }
+ $resident = null;
+ if (is_string($resource)) {
+ $resident = $resource;
+ } else if (is_object($resource)) {
+ $clname = get_class($resource);
+ if ($clname == 'cc_resource') {
+ $resident = $resource->identifier;
+ } else
+ if ($clname == 'cc_manifest') {
+ $resident = $resource->manifestID();
+ } else {
+ throw new Exception("Unable to attach resource. Invalid object.");
+ }
+ }
+ if (is_null($resident) || (empty($resident))) {
+ throw new Exception("Resource must have valid identifier!");
+ }
+ $this->identifierref = $resident;
+ }
+
+ public function has_child_items() {
+ return is_array($this->childitems) && (count($this->childitems) > 0);
+ }
+
+ public function child_item($identifier) {
+ return $this->has_child_items() ? $this->childitems[$identifier] : null;
+ }
+
+
+ public function init_clean() {
+ $this->identifier = null;
+ $this->isvisible = null;
+ $this->title = null;
+ $this->parameters = null;
+ $this->childitems = null;
+ $this->parentItem = null;
+ $this->isempty = true;
+ }
+
+ public function init_new_item() {
+ $this->identifier = cc_helpers::uuidgen('I_');
+ $this->isvisible = true; //default is true
+ $this->title = null;
+ $this->parameters = null;
+ $this->childitems = null;
+ $this->parentItem = null;
+ $this->isempty = false;
+ }
+
+}
\ No newline at end of file
--- /dev/null
+<?php
+// This file is part of Moodle - http://moodle.org/
+//
+// Moodle is free software: you can redistribute it and/or modify
+// it under the terms of the GNU General Public License as published by
+// the Free Software Foundation, either version 3 of the License, or
+// (at your option) any later version.
+//
+// Moodle is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+// GNU General Public License for more details.
+//
+// You should have received a copy of the GNU General Public License
+// along with Moodle. If not, see <http://www.gnu.org/licenses/>.
+
+/**
+* @package backup-convert
+* @subpackage cc-library
+* @copyright 2011 Darko Miletic <dmiletic@moodlerooms.com>
+* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
+*/
+
+require_once 'cc_interfaces.php';
+require_once 'xmlbase.php';
+require_once 'gral_lib/pathutils.php';
+require_once 'gral_lib/ccdependencyparser.php';
+require_once 'cc_version_base.php';
+require_once 'cc_version1.php';
+require_once 'cc_manifest.php';
+
+/**
+ * Common Cartridge Version
+ *
+ */
+class cc_version{
+ const v1 = 1;
+ const v11 = 11;
+}
+
+
+class cc1_resource_type {
+ const webcontent = 'webcontent';
+ const questionbank = 'imsqti_xmlv1p2/imscc_xmlv1p0/question-bank';
+ const assessment = 'imsqti_xmlv1p2/imscc_xmlv1p0/assessment';
+ const associatedcontent = 'associatedcontent/imscc_xmlv1p0/learning-application-resource';
+ const discussiontopic = 'imsdt_xmlv1p0';
+ const weblink = 'imswl_xmlv1p0';
+
+ public static $checker = array(self::webcontent,
+ self::assessment,
+ self::associatedcontent,
+ self::discussiontopic,
+ self::questionbank,
+ self::weblink);
+
+}
+
+class cc11_resource_type {
+ const webcontent = 'webcontent';
+ const questionbank = 'imsqti_xmlv1p2/imscc_xmlv1p1/question-bank';
+ const assessment = 'imsqti_xmlv1p2/imscc_xmlv1p1/assessment';
+ const associatedcontent = 'associatedcontent/imscc_xmlv1p1/learning-application-resource';
+ const discussiontopic = 'imsdt_xmlv1p1';
+ const weblink = 'imswl_xmlv1p1';
+ const basiclti = 'imsbasiclti_xmlv1p0';
+
+ public static $checker = array(self::webcontent,
+ self::assessment,
+ self::associatedcontent,
+ self::discussiontopic,
+ self::questionbank,
+ self::weblink,
+ self::basiclti);
+
+}
+
+
+/**
+ * Resource Class
+ *
+ */
+class cc_resource implements cc_i_resource {
+
+ public $identifier = null;
+ public $type = null;
+ public $dependency = array();
+ public $identifierref = null;
+ public $href = null;
+ public $base = null;
+ public $persiststate = null;
+ public $filename = null;
+ public $files = array();
+ public $isempty = null;
+ public $manifestroot = null;
+ public $folder = null;
+
+ private $throwonerror = true;
+
+ public function __construct($manifest, $file, $folder='', $throwonerror = true) {
+ $this->throwonerror = $throwonerror;
+ if (is_string($manifest)) {
+ $this->folder = $folder;
+ $this->process_resource($manifest, $file,$folder);
+ $this->manifestroot = $manifest;
+ } else if (is_object($manifest)) {
+ $this->import_resource($file,$manifest.$folder);
+ }
+ }
+
+ /**
+ * Add resource
+ *
+ * @param string $fname
+ * @param string $location
+ */
+ public function add_resource ($fname, $location =''){
+ $this->process_resource($fname,$location);
+
+ }
+
+
+ /**
+ * Import a resource
+ *
+ * @param DOMElement $node
+ * @param cc_i_manifest $doc
+ */
+ public function import_resource(DOMElement &$node, cc_i_manifest &$doc) {
+
+ $searchstr = "//imscc:manifest[@identifier='".$doc->manifestID().
+ "']/imscc:resources/imscc:resource";
+ $this->identifier = $this->get_attr_value($node,"identifier");
+ $this->type = $this->get_attr_value($node,"type");
+ $this->href = $this->get_attr_value($node,"href");
+ $this->base = $this->get_attr_value($node,"base");
+ $this->persiststate = null;
+ $nodo = $doc->nodeList($searchstr."[@identifier='".
+ $this->identifier."']/metadata/@href");
+ $this->metadata = $nodo->nodeValue;
+ $this->filename = $this->href;
+ $nlist = $doc->nodeList($searchstr."[@identifier='".
+ $this->identifier."']/imscc:file/@href");
+ $this->files = array();
+ foreach ($nlist as $file) {
+ $this->files[] = $file->nodeValue;
+ }
+ $nlist = $doc->nodeList($searchstr."[@identifier='".
+ $this->identifier."']/imscc:dependency/@identifierref");
+ $this->dependency = array();
+ foreach ($nlist as $dependency) {
+ $this->dependency[] = $dependency->nodeValue;
+ }
+ $this->isempty = false;
+ }
+
+
+ /**
+ * Get a attribute value
+ *
+ * @param DOMElement $nod
+ * @param string $name
+ * @param string $ns
+ * @return string
+ */
+ public function get_attr_value(&$nod, $name, $ns=null) {
+ return is_null($ns) ?
+ ($nod->hasAttribute($name) ? $nod->getAttribute($name) : null) :
+ ($nod->hasAttributeNS($ns, $name) ? $nod->getAttributeNS($ns, $name) : null);
+ }
+
+
+ /**
+ * Process a resource
+ *
+ * @param string $manifestroot
+ * @param string $fname
+ * @param string $folder
+ */
+ public function process_resource($manifestroot, &$fname, $folder) {
+ $file = empty($folder) ? $manifestroot.'/'.$fname : $manifestroot.'/'.$folder.'/'.$fname;
+ if (!file_exists($file) && $this->throwonerror){
+ throw new Exception('The file doesnt exist!');
+ }
+
+ //TODO: ver el tema de fpatch con el tema de unix y windows
+ //$fpathtocheck = $this->adjust_path($manifestroot,$fname);
+ //!empty($fpathtocheck) &&
+ if (GetDepFiles($manifestroot, $fname, $this->folder, $this->files)) {
+ array_unshift($this->files,$folder.$fname);
+ $this->init_empty_new();
+ $this->href = $folder.$fname;
+ $this->identifierref = $folder.$fname;
+ $this->filename = $fname;
+ $this->isempty = false;
+ $this->folder = $folder;
+ } else {
+ $this->init_clean();
+ }
+ }
+
+ public function adjust_path($mroot, $fname) {
+ $result = null;
+ if (file_exists($fname->filename)) {
+ $result = pathDiff($fname->filename,$mroot);
+
+ } else if (file_exists($mroot.$fname->filename) || file_exists($mroot.DIRECTORY_SEPARATOR.$fname->filename)) {
+ $result = trim(toUrlPath($fname->filename),"/");
+ }
+ return $result;
+ }
+
+
+
+ public function init_clean() {
+ $this->identifier = null;
+ $this->type = null;
+ $this->href = null;
+ $this->base = null;
+ $this->metadata = array();
+ $this->dependency = array();
+ $this->identifierref = null;
+ $this->persiststate = null;
+ $this->filename = '';
+ $this->files = array();
+ $this->isempty = true;
+ }
+
+
+ public function init_empty_new() {
+ $this->identifier = cc_helpers::uuidgen('I_', '_R');
+ $this->type = null;
+ $this->href = null;
+ $this->persiststate = null;
+ $this->filename = null;
+ $this->isempty = false;
+ $this->identifierref = null;
+ }
+
+ public function get_manifestroot(){
+ return $this->manifestroot;
+ }
+
+}
\ No newline at end of file
--- /dev/null
+<?php
+// This file is part of Moodle - http://moodle.org/
+//
+// Moodle is free software: you can redistribute it and/or modify
+// it under the terms of the GNU General Public License as published by
+// the Free Software Foundation, either version 3 of the License, or
+// (at your option) any later version.
+//
+// Moodle is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+// GNU General Public License for more details.
+//
+// You should have received a copy of the GNU General Public License
+// along with Moodle. If not, see <http://www.gnu.org/licenses/>.
+
+/**
+* @package backup-convert
+* @subpackage cc-library
+* @copyright 2011 Darko Miletic <dmiletic@moodlerooms.com>
+* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
+*/
+
+require_once 'xmlbase.php';
+
+/**
+ *
+ * Various helper utils
+ * @author Darko Miletic dmiletic@moodlerooms.com
+ *
+ */
+abstract class cc_helpers {
+
+ /**
+ *
+ * Checks extension of the supplied filename
+ * @param string $filename
+ */
+ public static function is_html($filename) {
+ $extension = strtolower(pathinfo($filename, PATHINFO_EXTENSION));
+ return in_array($extension, array('htm', 'html'));
+ }
+
+ /**
+ *
+ * Generates unique identifier
+ * @param string $prefix
+ * @param string $suffix
+ * @return string
+ */
+ public static function uuidgen($prefix = '', $suffix = '', $uppercase = true) {
+ $uuid = trim(sprintf('%s%04x%04x%s', $prefix, mt_rand(0, 65535), mt_rand(0, 65535), $suffix));
+ $result = $uppercase ? strtoupper($uuid) : strtolower($uuid) ;
+ return $result;
+ }
+
+ /**
+ *
+ * Creates new folder with random name
+ * @param string $where
+ * @param string $prefix
+ * @param string $suffix
+ * @return mixed - directory short name or false in case of faliure
+ */
+ public static function randomdir($where, $prefix = '', $suffix = '') {
+ $dirname = false;
+ $randomname = self::uuidgen($prefix, $suffix, false);
+ $newdirname = $where.DIRECTORY_SEPARATOR.$randomname;
+ if (mkdir($newdirname)) {
+ chmod($newdirname, 0755);
+ $dirname = $randomname;
+ }
+ return $dirname;
+ }
+
+ /**
+ *
+ * Get list of embedded files
+ * @param string $html
+ * @return multitype:mixed
+ */
+ public static function embedded_files($html) {
+ $result = array();
+ $doc = new XMLGenericDocument();
+ if ($doc->loadHTML($html)) {
+ $list = $doc->nodeList("//img[starts-with(@src,'@@PLUGINFILE@@')]/@src");
+ foreach ($list as $filelink) {
+ $result[] = str_replace('@@PLUGINFILE@@', '', $filelink->nodeValue);
+ }
+ }
+ return $result;
+ }
+
+ public static function embedded_mapping($packageroot, $contextid = null) {
+ $main_file = $packageroot . DIRECTORY_SEPARATOR . 'files.xml';
+ $mfile = new XMLGenericDocument();
+ if (!$mfile->load($main_file)) {
+ return false;
+ }
+ $query = "/files/file[filename!='.']";
+ if (!empty($contextid)) {
+ $query .= "[contextid='{$contextid}']";
+ }
+ $files = $mfile->nodeList($query);
+ $depfiles = array();
+ foreach ($files as $node) {
+ $mainfile = intval($mfile->nodeValue('sortorder', $node));
+ $filename = $mfile->nodeValue('filename', $node);
+ $filepath = $mfile->nodeValue('filepath', $node);
+ $source = $mfile->nodeValue('source', $node);
+ $author = $mfile->nodeValue('author', $node);
+ $license = $mfile->nodeValue('license', $node);
+ $hashedname = $mfile->nodeValue('contenthash', $node);
+ $hashpart = substr($hashedname, 0, 2);
+ $location = 'files'.DIRECTORY_SEPARATOR.$hashpart.DIRECTORY_SEPARATOR.$hashedname;
+ $type = $mfile->nodeValue('mimetype', $node);
+ $depfiles[$filepath.$filename] = array( $location,
+ ($mainfile == 1),
+ strtolower(str_replace(' ', '_',$filename)),
+ $type,
+ $source,
+ $author,
+ $license,
+ strtolower(str_replace(' ', '_',$filepath)));
+ }
+
+ return $depfiles;
+ }
+
+ public static function add_files(cc_i_manifest &$manifest, $packageroot, $outdir, $allinone = true) {
+ if (pkg_static_resources::instance()->finished) {
+ return;
+ }
+ $files = cc_helpers::embedded_mapping($packageroot);
+ $rdir = $allinone ? new cc_resource_location($outdir) : null;
+ foreach ($files as $virtual => $values) {
+ $clean_filename = $values[2];
+ if (!$allinone) {
+ $rdir = new cc_resource_location($outdir);
+ }
+ $rtp = $rdir->fullpath(true).$clean_filename;
+ //Are there any relative virtual directories?
+ //let us try to recreate them
+ $justdir = $rdir->fullpath(true).$values[7];
+ if (!file_exists($justdir)) {
+ if (!mkdir($justdir, 0777, true)) {
+ throw new RuntimeException('Unable to create directories!');
+ }
+ }
+
+ $source = $packageroot.DIRECTORY_SEPARATOR.$values[0];
+ if (!copy($source, $rtp)) {
+ throw new RuntimeException('Unable to copy files!');
+ }
+ $resource = new cc_resource($rdir->rootdir(), $clean_filename, $rdir->dirname(true));
+ $res = $manifest->add_resource($resource, null, cc_version11::webcontent);
+ pkg_static_resources::instance()->add($virtual, $res[0], $rdir->dirname(true).$clean_filename, $values[1], $resource);
+ }
+
+ pkg_static_resources::instance()->finished = true;
+ }
+
+ /**
+ *
+ * Excerpt from IMS CC 1.1 overview :
+ * No spaces in filenames, directory and file references should
+ * employ all lowercase or all uppercase - no mixed case
+ *
+ * @param cc_i_manifest $manifest
+ * @param string $packageroot
+ * @param integer $contextid
+ * @param string $outdir
+ * @param boolean $allinone
+ * @throws RuntimeException
+ */
+ public static function handle_static_content(cc_i_manifest &$manifest, $packageroot, $contextid, $outdir, $allinone = true){
+ cc_helpers::add_files($manifest, $packageroot, $outdir, $allinone);
+ return pkg_static_resources::instance()->get_values();
+ }
+
+ public static function handle_resource_content(cc_i_manifest &$manifest, $packageroot, $contextid, $outdir, $allinone = true){
+ $result = array();
+ cc_helpers::add_files($manifest, $packageroot, $outdir, $allinone);
+ $files = cc_helpers::embedded_mapping($packageroot, $contextid);
+ //$rdir = $allinone ? new cc_resource_location($outdir) : null;
+ $rootnode = null;
+ $rootvals = null;
+ $depfiles = array();
+ $depres = array();
+ $flocation = null;
+ foreach ($files as $virtual => $values) {
+ $clean_filename = $values[2];
+ $vals = pkg_static_resources::instance()->get_identifier($virtual);
+ $resource = $vals[3];
+ $identifier = $resource->identifier;
+ $flocation = $vals[1];
+ if ($values[1]) {
+ $rootnode = $resource;
+ $rootvals = $flocation;
+ continue;
+ }
+
+ $depres[] = $identifier;
+ $depfiles[] = $vals[1];
+ $result[$virtual] = array($identifier, $flocation, false);
+ }
+
+ if (!empty($rootnode)) {
+ $rootnode->files = array_merge($rootnode->files, $depfiles);
+ $result[$virtual] = array($rootnode->identifier, $rootvals, true);
+ }
+
+ return $result;
+ }
+
+ public static function process_linked_files($content, cc_i_manifest &$manifest, $packageroot, $contextid, $outdir) {
+ /**
+ - detect all embedded files
+ - locate their physical counterparts in moodle 2 backup
+ - copy all files in the cc package stripping any spaces and using inly lowercase letters
+ - add those files as resources of the type webcontent to the manifest
+ - replace the links to the resourcse using $IMS-CC-FILEBASE$ and their new locations
+ - cc_resource has array of files and array of dependencies
+ - most likely we would need to add all files as independent resources and than
+ attach them all as dependencies to the forum tag
+ */
+ $lfiles = self::embedded_files($content);
+ $text = $content;
+ $deps = null;
+ if (!empty($lfiles)) {
+ $files = self::handle_static_content($manifest,
+ $packageroot,
+ $contextid,
+ $outdir);
+ foreach ($lfiles as $lfile) {
+ if (array_key_exists($lfile, $files)) {
+ $text = str_replace('@@PLUGINFILE@@'.$lfile,
+ '$IMS-CC-FILEBASE$../'.$files[$lfile][1],
+ $text);
+ $deps[] = $files[$lfile][0];
+ }
+ }
+ }
+ return array($text, $deps);
+ }
+
+ public static function relative_location($originpath, $linkingpath) {
+ return false;
+ }
+
+}
+
+
+final class cc_resource_location {
+ /**
+ *
+ * Root directory
+ * @var string
+ */
+ private $rootdir = null;
+ /**
+ *
+ * new directory
+ * @var string
+ */
+ private $dir = null;
+ /**
+ *
+ * Full precalculated path
+ * @var string
+ */
+ private $fullpath = null;
+
+ /**
+ *
+ * ctor
+ * @param string $rootdir - path to the containing directory
+ * @throws InvalidArgumentException
+ * @throws RuntimeException
+ */
+ public function __construct($rootdir) {
+ $rdir = realpath($rootdir);
+ if (empty($rdir)) {
+ throw new InvalidArgumentException('Invalid path!');
+ }
+ $dir = cc_helpers::randomdir($rdir, 'i_');
+ if ($dir === false) {
+ throw new RuntimeException('Unable to create directory!');
+ }
+ $this->rootdir = $rdir;
+ $this->dir = $dir;
+ $this->fullpath = $rdir.DIRECTORY_SEPARATOR.$dir;
+ }
+
+ /**
+ *
+ * Newly created directory
+ * @return string
+ */
+ public function dirname($endseparator=false) {
+ return $this->dir.($endseparator ? '/' : '');
+ }
+
+ /**
+ *
+ * Full path to the new directory
+ * @return string
+ */
+ public function fullpath($endseparator=false) {
+ return $this->fullpath.($endseparator ? DIRECTORY_SEPARATOR : '');
+ }
+
+ /**
+ * Returns containing dir
+ * @return string
+ */
+ public function rootdir($endseparator=false) {
+ return $this->rootdir.($endseparator ? DIRECTORY_SEPARATOR : '');
+ }
+}
+
+class pkg_static_resources {
+
+ /**
+ * @var array
+ */
+ private $values = array();
+
+ /**
+ * @var boolean
+ */
+ public $finished = false;
+
+ /**
+ * @var pkg_static_resources
+ */
+ private static $instance = null;
+
+ private function __clone() {}
+ private function __construct() {}
+
+ /**
+ * @return pkg_static_resources
+ */
+ public static function instance() {
+ if (empty(self::$instance)) {
+ $c = __CLASS__;
+ self::$instance = new $c();
+ }
+ return self::$instance;
+ }
+
+ /**
+ *
+ * add new element
+ * @param string $identifier
+ * @param string $file
+ * @param boolean $main
+ */
+ public function add($key, $identifier, $file, $main, $node = null) {
+ $this->values[$key] = array($identifier, $file, $main, $node);
+ }
+
+ /**
+ * @return array
+ */
+ public function get_values() {
+ return $this->values;
+ }
+
+ public function get_identifier($location) {
+ $result = false;
+ if (array_key_exists($location, $this->values)) {
+ $result = $this->values[$location];
+ }
+ return $result;
+ }
+
+ public function reset() {
+ $this->values = array();
+ $this->finished = false ;
+ }
+}
--- /dev/null
+<?php
+// This file is part of Moodle - http://moodle.org/
+//
+// Moodle is free software: you can redistribute it and/or modify
+// it under the terms of the GNU General Public License as published by
+// the Free Software Foundation, either version 3 of the License, or
+// (at your option) any later version.
+//
+// Moodle is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+// GNU General Public License for more details.
+//
+// You should have received a copy of the GNU General Public License
+// along with Moodle. If not, see <http://www.gnu.org/licenses/>.
+
+/**
+* @package backup-convert
+* @subpackage cc-library
+* @copyright 2011 Darko Miletic <dmiletic@moodlerooms.com>
+* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
+*/
+
+require_once 'cc_utils.php';
+require_once 'cc_version_base.php';
+require_once 'cc_organization.php';
+
+
+/**
+ * Version 1 class of Common Cartridge
+ *
+ */
+class cc_version1 extends cc_version_base {
+ const webcontent = 'webcontent';
+ const questionbank = 'imsqti_xmlv1p2/imscc_xmlv1p0/question-bank';
+ const assessment = 'imsqti_xmlv1p2/imscc_xmlv1p0/assessment';
+ const associatedcontent = 'associatedcontent/imscc_xmlv1p0/learning-application-resource';
+ const discussiontopic = 'imsdt_xmlv1p0';
+ const weblink = 'imswl_xmlv1p0';
+
+ public static $checker = array(self::webcontent,
+ self::assessment,
+ self::associatedcontent,
+ self::discussiontopic,
+ self::questionbank,
+ self::weblink);
+
+ /**
+ * Validate if the type are valid or not
+ *
+ * @param string $type
+ * @return bool
+ */
+ public function valid($type) {
+ return in_array($type, self::$checker);
+ }
+
+ public function __construct() {
+ $this->ccnamespaces = array('imscc' => 'http://www.imsglobal.org/xsd/imscc/imscp_v1p1',
+ 'lomimscc' => 'http://ltsc.ieee.org/xsd/imscc/LOM',
+ 'lom' => 'http://ltsc.ieee.org/xsd/LOM',
+ 'voc' => 'http://ltsc.ieee.org/xsd/LOM/vocab',
+ 'xsi' => 'http://www.w3.org/2001/XMLSchema-instance'
+ );
+
+ $this->ccnsnames = array('imscc' => 'http://www.imsglobal.org/profile/cc/ccv1p0/derived_schema/imscp_v1p2_localised.xsd' ,
+ 'lom' => 'http://www.imsglobal.org/profile/cc/ccv1p0/derived_schema/domainProfile_2/lomLoose_localised.xsd' ,
+ 'lomimscc' => 'http://www.imsglobal.org/profile/cc/ccv1p0/derived_schema/domainProfile_1/lomLoose_localised.xsd',
+ 'voc' => 'http://www.imsglobal.org/profile/cc/ccv1p0/derived_schema/domainProfile_2/vocab/loose.xsd'
+ );
+
+ $this->ccversion = '1.0.0';
+ $this->camversion = '1.0.0';
+ $this->_generator = 'Moodle 2 Common Cartridge generator';
+ }
+
+ protected function on_create(DOMDocument &$doc, $rootmanifestnode=null,$nmanifestID=null) {
+ $doc->formatOutput = true;
+ $doc->preserveWhiteSpace = true;
+
+
+ $this->manifestID = is_null($nmanifestID) ? cc_helpers::uuidgen('M_') : $nmanifestID;
+ $mUUID = $doc->createAttribute('identifier');
+ $mUUID->nodeValue = $this->manifestID;
+
+
+ if (is_null($rootmanifestnode)) {
+ if (!empty($this->_generator)) {
+ $comment = $doc->createComment($this->_generator);
+ $doc->appendChild($comment);
+ }
+
+ $rootel = $doc->createElementNS($this->ccnamespaces['imscc'],'manifest');
+ $rootel->appendChild($mUUID);
+ $doc->appendChild($rootel);
+
+ //add all namespaces
+ foreach ($this->ccnamespaces as $key => $value) {
+ if ($key != 'lom' ){
+ $dummy_attr = $key.":dummy";
+ $doc->createAttributeNS($value,$dummy_attr);
+ }
+ }
+
+ // add location of schemas
+ $schemaLocation='';
+ foreach ($this->ccnsnames as $key => $value) {
+ $vt = empty($schemaLocation) ? '' : ' ';
+ $schemaLocation .= $vt.$this->ccnamespaces[$key].' '.$value;
+ }
+ $aSchemaLoc = $doc->createAttributeNS($this->ccnamespaces['xsi'],'xsi:schemaLocation');
+ $aSchemaLoc->nodeValue=$schemaLocation;
+ $rootel->appendChild($aSchemaLoc);
+
+ } else {
+ $rootel = $doc->createElementNS($this->ccnamespaces['imscc'],'imscc:manifest');
+ $rootel->appendChild($mUUID);
+ }
+
+ $metadata = $doc->createElementNS($this->ccnamespaces['imscc'],'metadata');
+ $schema = $doc->createElementNS($this->ccnamespaces['imscc'],'schema','IMS Common Cartridge');
+ $schemaversion = $doc->createElementNS($this->ccnamespaces['imscc'],'schemaversion',$this->ccversion);
+
+ $metadata->appendChild($schema);
+ $metadata->appendChild($schemaversion);
+ $rootel->appendChild($metadata);
+
+ if (!is_null($rootmanifestnode)) {
+ $rootmanifestnode->appendChild($rootel);
+ }
+
+ $organizations = $doc->createElementNS($this->ccnamespaces['imscc'],'organizations');
+ $rootel->appendChild($organizations);
+ $resources = $doc->createElementNS($this->ccnamespaces['imscc'],'resources');
+ $rootel->appendChild($resources);
+
+ return true;
+ }
+
+
+ protected function update_attribute(DOMDocument &$doc, $attrname, $attrvalue, DOMElement &$node) {
+ $busenew = (is_object($node) && $node->hasAttribute($attrname));
+ $nResult = null;
+ if (!$busenew && is_null($attrvalue)) {
+ $node->removeAttribute($attrname);
+ } else {
+ $nResult = $busenew ? $node->getAttributeNode($attrname) : $doc->createAttribute($attrname);
+ $nResult->nodeValue = $attrvalue;
+ if (!$busenew) {
+ $node->appendChild($nResult);
+ }
+ }
+ return $nResult;
+ }
+
+
+ protected function update_attribute_ns(DOMDocument &$doc, $attrname, $attrnamespace,$attrvalue, DOMElement &$node) {
+ $busenew = (is_object($node) && $node->hasAttributeNS($attrnamespace, $attrname));
+ $nResult = null;
+ if (!$busenew && is_null($attrvalue)) {
+ $node->removeAttributeNS($attrnamespace, $attrname);
+ } else {
+ $nResult = $busenew ? $node->getAttributeNodeNS($attrnamespace, $attrname) : $doc->createAttributeNS($attrnamespace, $attrname);
+ $nResult->nodeValue = $attrvalue;
+ if (!$busenew) {
+ $node->appendChild($nResult);
+ }
+ }
+ return $nResult;
+ }
+
+
+ protected function get_child_node(DOMDocument &$doc, $itemname, DOMElement &$node) {
+ $nlist = $node->getElementsByTagName($itemname);
+ $item = is_object($nlist) && ($nlist->length > 0) ? $nlist->item(0) : null;
+ return $item;
+ }
+
+
+ protected function update_child_item(DOMDocument &$doc, $itemname, $itemvalue, DOMElement &$node, $attrtostore=null) {
+ $tnode = $this->get_child_node($doc,'title',$node);
+ $usenew = is_null($tnode);
+ $tnode = $usenew ? $doc->createElementNS($this->ccnamespaces['imscc'], $itemname) : $tnode;
+ if (!is_null($attrtostore)) {
+ foreach ($attrtostore as $key => $value) {
+ $this->update_attribute($doc,$key,$value,$tnode);
+ }
+ }
+ $tnode->nodeValue = $itemvalue;
+ if ($usenew) {
+ $node->appendChild($tnode);
+ }
+ }
+
+
+ protected function update_items($items, DOMDocument &$doc, DOMElement &$xmlnode) {
+ foreach ($items as $key => $item) {
+ $itemnode = $doc->createElementNS($this->ccnamespaces['imscc'], 'item');
+ $this->update_attribute($doc, 'identifier' , $key , $itemnode);
+ $this->update_attribute($doc, 'identifierref', $item->identifierref, $itemnode);
+ $this->update_attribute($doc, 'parameters' , $item->parameters , $itemnode);
+ if (!empty($item->title)) {
+ $titlenode = $doc->createElementNS($this->ccnamespaces['imscc'],
+ 'title',
+ $item->title);
+ $itemnode->appendChild($titlenode);
+ }
+ if ($item->has_child_items()) {
+ $this->update_items($item->childitems, $doc, $itemnode);
+ }
+ $xmlnode->appendChild($itemnode);
+ }
+ }
+
+
+ /**
+ * Create a Resource (How to)
+ *
+ * @param cc_i_resource $res
+ * @param DOMDocument $doc
+ * @param object $xmlnode
+ * @return DOMNode
+ */
+ protected function create_resource(cc_i_resource &$res, DOMDocument &$doc, $xmlnode=null) {
+ $usenew = is_object($xmlnode);
+ $dnode = $usenew ? $xmlnode : $doc->createElementNS($this->ccnamespaces['imscc'], "resource");
+ $this->update_attribute($doc,'identifier',$res->identifier,$dnode);
+ $this->update_attribute($doc,'type' ,$res->type ,$dnode);
+ !is_null($res->href) ? $this->update_attribute($doc,'href',$res->href,$dnode): null;
+ $this->update_attribute($doc,'base' ,$res->base ,$dnode);
+
+ foreach ($res->files as $file) {
+ $nd = $doc->createElementNS($this->ccnamespaces['imscc'],'file');
+ $ndatt = $doc->createAttribute('href');
+ $ndatt->nodeValue = $file;
+ $nd->appendChild($ndatt);
+ $dnode->appendChild($nd);
+ }
+ $this->resources[$res->identifier] = $res;
+
+ foreach ($res->dependency as $dependency){
+ $nd = $doc->createElementNS($this->ccnamespaces['imscc'],'dependency');
+ $ndatt = $doc->createAttribute('identifierref');
+ $ndatt->nodeValue = $dependency;
+ $nd->appendChild($ndatt);
+ $dnode->appendChild($nd);
+ }
+
+ return $dnode;
+ }
+
+
+
+ /**
+ * Create an Item Folder (How To)
+ *
+ * @param cc_i_organization $org
+ * @param DOMDocument $doc
+ * @param DOMElement $xmlnode
+ */
+ protected function create_item_folder (cc_i_organization &$org, DOMDocument &$doc, DOMElement &$xmlnode=null){
+
+ $itemfoldernode = $doc->createElementNS($this->ccnamespaces['imscc'],'item');
+ $this->update_attribute($doc,'identifier', "root", $itemfoldernode);
+
+ if ($org->has_items()) {
+ $this->update_items($org->itemlist, $doc, $itemfoldernode);
+ }
+ if (is_null($this->organizations)) {
+ $this->organizations = array();
+ }
+ $this->organizations[$org->identifier] = $org;
+
+ $xmlnode->appendChild($itemfoldernode);
+ }
+
+
+
+
+ /**
+ * Create an Organization (How To)
+ *
+ * @param cc_i_organization $org
+ * @param DOMDocument $doc
+ * @param object $xmlnode
+ * @return DOMNode
+ */
+ protected function create_organization (cc_i_organization &$org, DOMDocument &$doc, $xmlnode=null){
+
+ $usenew = is_object($xmlnode);
+ $dnode = $usenew ? $xmlnode : $doc->createElementNS($this->ccnamespaces['imscc'], "organization");
+ $this->update_attribute($doc,'identifier' ,$org->identifier,$dnode);
+ $this->update_attribute($doc,'structure' ,$org->structure ,$dnode);
+
+ $this->create_item_folder($org,$doc,$dnode);
+
+ return $dnode;
+ }
+
+
+
+
+ /**
+ * Create Metadata For Manifest (How To)
+ *
+ * @param cc_i_metadata_manifest $met
+ * @param DOMDocument $doc
+ * @param object $xmlnode
+ * @return DOMNode
+ */
+ protected function create_metadata_manifest (cc_i_metadata_manifest $met,DOMDocument &$doc,$xmlnode=null) {
+
+ $dnode = $doc->createElementNS($this->ccnamespaces['lomimscc'], "lom");
+ if (!empty($xmlnode)) {
+ $xmlnode->appendChild($dnode);
+ }
+ $dnodegeneral = empty($met->arraygeneral ) ? null : $this->create_metadata_general ($met, $doc, $xmlnode);
+ $dnodetechnical = empty($met->arraytech ) ? null : $this->create_metadata_technical($met, $doc, $xmlnode);
+ $dnoderights = empty($met->arrayrights ) ? null : $this->create_metadata_rights ($met, $doc, $xmlnode);
+ $dnodelifecycle = empty($met->arraylifecycle) ? null : $this->create_metadata_lifecycle($met, $doc, $xmlnode);
+
+ !is_null($dnodegeneral)?$dnode->appendChild($dnodegeneral):null;
+ !is_null($dnodetechnical)?$dnode->appendChild($dnodetechnical):null;
+ !is_null($dnoderights)?$dnode->appendChild($dnoderights):null;
+ !is_null($dnodelifecycle)?$dnode->appendChild($dnodelifecycle):null;
+
+ return $dnode;
+
+ }
+
+
+
+ /**
+ * Create Metadata For Resource (How To)
+ *
+ * @param cc_i_metadata_resource $met
+ * @param DOMDocument $doc
+ * @param object $xmlnode
+ * @return DOMNode
+ */
+ protected function create_metadata_resource (cc_i_metadata_resource $met,DOMDocument &$doc,$xmlnode=null) {
+
+ $dnode = $doc->createElementNS($this->ccnamespaces['lom'], "lom");
+
+ !empty($xmlnode)? $xmlnode->appendChild($dnode):null;
+ !empty($met->arrayeducational) ? $this->create_metadata_educational($met,$doc,$dnode):null;
+
+ return $dnode;
+ }
+
+
+
+
+ /**
+ * Create Metadata For File (How To)
+ *
+ * @param cc_i_metadata_file $met
+ * @param DOMDocument $doc
+ * @param Object $xmlnode
+ * @return DOMNode
+ */
+ protected function create_metadata_file (cc_i_metadata_file $met,DOMDocument &$doc,$xmlnode=null) {
+
+ $dnode = $doc->createElementNS($this->ccnamespaces['lom'], "lom");
+
+ !empty($xmlnode)? $xmlnode->appendChild($dnode):null;
+ !empty($met->arrayeducational) ? $this->create_metadata_educational($met,$doc,$dnode):null;
+
+ return $dnode;
+ }
+
+
+
+
+ /**
+ * Create General Metadata (How To)
+ *
+ * @param object $met
+ * @param DOMDocument $doc
+ * @param object $xmlnode
+ * @return DOMNode
+ */
+ protected function create_metadata_general($met,DOMDocument &$doc,$xmlnode){
+ ($xmlnode);
+ $nd = $doc->createElementNS($this->ccnamespaces['lomimscc'],'general');
+
+ foreach ($met->arraygeneral as $name => $value) {
+ !is_array($value)?$value =array($value):null;
+ foreach ($value as $k => $v){
+ ($k);
+ if ($name != 'language' && $name != 'catalog' && $name != 'entry'){
+ $nd2 = $doc->createElementNS($this->ccnamespaces['lomimscc'],$name);
+ $nd3 = $doc->createElementNS($this->ccnamespaces['lomimscc'],'string',$v[1]);
+ $ndatt = $doc->createAttribute('language');
+ $ndatt->nodeValue = $v[0];
+ $nd3->appendChild($ndatt);
+ $nd2->appendChild($nd3);
+ $nd->appendChild($nd2);
+ }else{
+ if ($name == 'language'){
+ $nd2 = $doc->createElementNS($this->ccnamespaces['lomimscc'],$name,$v[0]);
+ $nd->appendChild($nd2);
+ }
+ }
+ }
+ }
+ if (!empty($met->arraygeneral['catalog']) || !empty($met->arraygeneral['entry'])){
+ $nd2 = $doc->createElementNS($this->ccnamespaces['lomimscc'],'identifier');
+ $nd->appendChild($nd2);
+ if (!empty($met->arraygeneral['catalog'])){
+ $nd3 = $doc->createElementNS($this->ccnamespaces['lomimscc'],'catalog',$met->arraygeneral['catalog'][0][0]);
+ $nd2->appendChild($nd3);
+ }
+ if (!empty($met->arraygeneral['entry'])){
+ $nd4 = $doc->createElementNS($this->ccnamespaces['lomimscc'],'entry',$met->arraygeneral['entry'][0][0]);
+ $nd2->appendChild($nd4);
+ }
+ }
+ return $nd;
+ }
+
+
+
+
+ /**
+ * Create Technical Metadata (How To)
+ *
+ * @param object $met
+ * @param DOMDocument $doc
+ * @param object $xmlnode
+ * @return DOMNode
+ */
+ protected function create_metadata_technical($met,DOMDocument &$doc,$xmlnode){
+ ($xmlnode);
+ $nd = $doc->createElementNS($this->ccnamespaces['lomimscc'],'technical');
+ $xmlnode->appendChild($nd);
+
+ foreach ($met->arraytech as $name => $value) {
+ ($name);
+ !is_array($value)?$value =array($value):null;
+ foreach ($value as $k => $v){
+ ($k);
+ $nd2 = $doc->createElementNS($this->ccnamespaces['lomimscc'],$name,$v[0]);
+ $nd->appendChild($nd2);
+ }
+ }
+ return $nd;
+ }
+
+
+
+
+ /**
+ * Create Rights Metadata (How To)
+ *
+ * @param object $met
+ * @param DOMDocument $doc
+ * @param object $xmlnode
+ * @return DOMNode
+ */
+ protected function create_metadata_rights($met,DOMDocument &$doc,$xmlnode){
+ ($xmlnode);
+
+ $nd = $doc->createElementNS($this->ccnamespaces['lomimscc'],'rights');
+
+ foreach ($met->arrayrights as $name => $value) {
+ !is_array($value)?$value =array($value):null;
+ foreach ($value as $k => $v){
+ ($k);
+ if ($name == 'description'){
+ $nd2 = $doc->createElementNS($this->ccnamespaces['lomimscc'],$name);
+ $nd3 = $doc->createElementNS($this->ccnamespaces['lomimscc'],'string',$v[1]);
+ $ndatt = $doc->createAttribute('language');
+ $ndatt->nodeValue = $v[0];
+ $nd3->appendChild($ndatt);
+ $nd2->appendChild($nd3);
+ $nd->appendChild($nd2);
+ }elseif ($name == 'copyrightAndOtherRestrictions' || $name == 'cost'){
+ $nd2 = $doc->createElementNS($this->ccnamespaces['lomimscc'],$name);
+ $nd3 = $doc->createElementNS($this->ccnamespaces['lomimscc'],'value',$v[0]);
+ $nd2->appendChild($nd3);
+ $nd->appendChild($nd2);
+ }
+ }
+ }
+ return $nd;
+ }
+
+
+
+
+ /**
+ * Create LifeCyle Metadata (How To)
+ *
+ * @param object $met
+ * @param DOMDocument $doc
+ * @param object $xmlnode
+ * @return DOMNode
+ */
+ protected function create_metadata_lifecycle($met,DOMDocument &$doc,$xmlnode){
+ ($xmlnode);
+
+ $nd = $doc->createElementNS($this->ccnamespaces['lomimscc'],'lifeCycle');
+ $nd2= $doc->createElementNS($this->ccnamespaces['lomimscc'],'contribute');
+
+
+ $nd->appendChild ($nd2);
+ $xmlnode->appendChild ($nd);
+
+ foreach ($met->arraylifecycle as $name => $value) {
+ !is_array($value)?$value =array($value):null;
+ foreach ($value as $k => $v){
+ ($k);
+ if ($name == 'role'){
+ $nd3 = $doc->createElementNS($this->ccnamespaces['lomimscc'],$name);
+ $nd2->appendChild($nd3);
+ $nd4 = $doc->createElementNS($this->ccnamespaces['lomimscc'],'value',$v[0]);
+ $nd3->appendChild($nd4);
+ }else{
+ if ($name == 'date'){
+ $nd3 = $doc->createElementNS($this->ccnamespaces['lomimscc'],$name);
+ $nd2->appendChild($nd3);
+ $nd4 = $doc->createElementNS($this->ccnamespaces['lomimscc'],'dateTime',$v[0]);
+ $nd3->appendChild($nd4);
+ }else{
+ $nd3 = $doc->createElementNS($this->ccnamespaces['lomimscc'],$name,$v[0]);
+ $nd2->appendChild($nd3);
+ }
+ }
+ }
+ }
+ return $nd;
+ }
+
+
+
+
+ /**
+ * Create Education Metadata (How To)
+ *
+ * @param object $met
+ * @param DOMDocument $doc
+ * @param object $xmlnode
+ * @return DOMNode
+ */
+ protected function create_metadata_educational ($met,DOMDocument &$doc, $xmlnode){
+ $nd = $doc->createElementNS($this->ccnamespaces['lom'],'educational');
+ $nd2 = $doc->createElementNS($this->ccnamespaces['lom'],'intendedEndUserRole');
+ $nd3 = $doc->createElementNS($this->ccnamespaces['voc'],'vocabulary');
+
+ $xmlnode->appendChild($nd);
+ $nd->appendChild($nd2);
+ $nd2->appendChild($nd3);
+
+ foreach ($met->arrayeducational as $name => $value) {
+ !is_array($value)?$value =array($value):null;
+ foreach ($value as $k => $v){
+ ($k);
+ $nd4 = $doc->createElementNS($this->ccnamespaces['voc'],$name,$v[0]);
+ $nd3->appendChild($nd4);
+ }
+ }
+ return $nd;
+ }
+
+}
\ No newline at end of file
--- /dev/null
+<?php
+// This file is part of Moodle - http://moodle.org/
+//
+// Moodle is free software: you can redistribute it and/or modify
+// it under the terms of the GNU General Public License as published by
+// the Free Software Foundation, either version 3 of the License, or
+// (at your option) any later version.
+//
+// Moodle is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+// GNU General Public License for more details.
+//
+// You should have received a copy of the GNU General Public License
+// along with Moodle. If not, see <http://www.gnu.org/licenses/>.
+
+/**
+* @package backup-convert
+* @subpackage cc-library
+* @copyright 2011 Darko Miletic <dmiletic@moodlerooms.com>
+* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
+*/
+
+require_once 'cc_version1.php';
+
+
+/**
+ * Version 1.1 class of Common Cartridge
+ *
+ */
+class cc_version11 extends cc_version1 {
+ const webcontent = 'webcontent';
+ const questionbank = 'imsqti_xmlv1p2/imscc_xmlv1p1/question-bank';
+ const assessment = 'imsqti_xmlv1p2/imscc_xmlv1p1/assessment';
+ const associatedcontent = 'associatedcontent/imscc_xmlv1p1/learning-application-resource';
+ const discussiontopic = 'imsdt_xmlv1p1';
+ const weblink = 'imswl_xmlv1p1';
+ const basiclti = 'imsbasiclti_xmlv1p0';
+
+ public static $checker = array(self::webcontent,
+ self::assessment,
+ self::associatedcontent,
+ self::discussiontopic,
+ self::questionbank,
+ self::weblink,
+ self::basiclti);
+
+ /**
+ * Validate if the type are valid or not
+ *
+ * @param string $type
+ * @return bool
+ */
+ public function valid($type) {
+ return in_array($type, self::$checker);
+ }
+
+ public function __construct() {
+ $this->ccnamespaces = array('imscc' => 'http://www.imsglobal.org/xsd/imsccv1p1/imscp_v1p1',
+ 'lomimscc' => 'http://ltsc.ieee.org/xsd/imsccv1p1/LOM/manifest' ,
+ 'lom' => 'http://ltsc.ieee.org/xsd/imsccv1p1/LOM/resource' ,
+ 'xsi' => 'http://www.w3.org/2001/XMLSchema-instance'
+ );
+
+ $this->ccnsnames = array('imscc' => 'http://www.imsglobal.org/profile/cc/ccv1p1/ccv1p1_imscp_v1p2_v1p0.xsd' ,
+ 'lomimscc' => 'http://www.imsglobal.org/profile/cc/ccv1p1/LOM/ccv1p1_lommanifest_v1p0.xsd',
+ 'lom' => 'http://www.imsglobal.org/profile/cc/ccv1p1/LOM/ccv1p1_lomresource_v1p0.xsd'
+ );
+
+ $this->ccversion = '1.1.0';
+ $this->camversion = '1.1.0';
+ $this->_generator = 'Moodle 2 Common Cartridge generator';
+ }
+
+ protected function update_items($items, DOMDocument &$doc, DOMElement &$xmlnode) {
+ foreach ($items as $key => $item) {
+ $itemnode = $doc->createElementNS($this->ccnamespaces['imscc'], 'item');
+ $this->update_attribute($doc, 'identifier' , $key , $itemnode);
+ $this->update_attribute($doc, 'identifierref', $item->identifierref, $itemnode);
+ if (!is_null($item->title)) {
+ $titlenode = $doc->createElementNS($this->ccnamespaces['imscc'],
+ 'title',
+ $item->title);
+ $itemnode->appendChild($titlenode);
+ }
+ if ($item->has_child_items()) {
+ $this->update_items($item->childitems, $doc, $itemnode);
+ }
+ $xmlnode->appendChild($itemnode);
+ }
+ }
+
+}
--- /dev/null
+<?php
+// This file is part of Moodle - http://moodle.org/
+//
+// Moodle is free software: you can redistribute it and/or modify
+// it under the terms of the GNU General Public License as published by
+// the Free Software Foundation, either version 3 of the License, or
+// (at your option) any later version.
+//
+// Moodle is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+// GNU General Public License for more details.
+//
+// You should have received a copy of the GNU General Public License
+// along with Moodle. If not, see <http://www.gnu.org/licenses/>.
+
+/**
+* @package backup-convert
+* @subpackage cc-library
+* @copyright 2011 Darko Miletic <dmiletic@moodlerooms.com>
+* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
+*/
+
+require_once 'cc_organization.php';
+
+
+/**
+ * Abstract Version Base class
+ *
+ */
+abstract class cc_version_base {
+ protected $_generator = null;
+ protected $ccnamespaces = array();
+ protected $isrootmanifest = false;
+ protected $manifestID = null;
+ protected $organizationid = null;
+ public $resources = null;
+ protected $metadata = null;
+ public $organizations = null;
+ protected $base = null;
+ public $ccversion = null;
+ public $camversion = null;
+
+
+ abstract protected function on_create(DOMDocument &$doc,$rootmanifestnode=null,$nmanifestID=null);
+
+ abstract protected function create_metadata_manifest (cc_i_metadata_manifest $met,DOMDocument &$doc,$xmlnode=null);
+
+ abstract protected function create_metadata_resource (cc_i_metadata_resource $met,DOMDocument &$doc,$xmlnode=null);
+
+ abstract protected function create_metadata_file (cc_i_metadata_file $met,DOMDocument &$doc,$xmlnode=null);
+
+ abstract protected function create_resource(cc_i_resource &$res, DOMDocument &$doc, $xmlnode=null);
+
+ abstract protected function create_organization(cc_i_organization &$org, DOMDocument &$doc, $xmlnode=null);
+
+ public function get_cc_namespaces(){
+ return $this->ccnamespaces;
+ }
+
+ public function create_manifest(DOMDocument &$doc,$rootmanifestnode=null){
+ return $this->on_create($doc,$rootmanifestnode);
+ }
+
+ public function create_resource_node(cc_i_resource &$res, DOMDocument &$doc, $xmlnode = null) {
+ return $this->create_resource($res,$doc,$xmlnode);
+ }
+
+
+ public function create_metadata_node (&$met, DOMDocument &$doc, $xmlnode = null){
+ return $this->create_metadata_manifest($met,$doc,$xmlnode);
+ }
+
+ public function create_metadata_resource_node (&$met, DOMDocument &$doc, $xmlnode = null){
+ return $this->create_metadata_resource($met,$doc,$xmlnode);
+ }
+
+ public function create_metadata_file_node (&$met, DOMDocument &$doc, $xmlnode = null){
+ return $this->create_metadata_file($met,$doc,$xmlnode);
+ }
+
+ public function create_organization_node(cc_i_organization &$org, DOMDocument &$doc, $xmlnode = null) {
+ return $this->create_organization($org,$doc,$xmlnode);
+ }
+
+ public function manifestID(){
+ return $this->manifestID;
+ }
+
+ public function set_manifestID($id){
+ $this->manifestID = $id;
+ }
+
+ public function get_base(){
+ return $this->base;
+ }
+
+ public function set_base($baseval){
+ $this->base = $baseval;
+ }
+
+ public function import_resources(DOMElement &$node, cc_i_manifest &$doc) {
+ if (is_null($this->resources)){
+ $this->resources = array();
+ }
+ $nlist = $node->getElementsByTagNameNS($this->ccnamespaces['imscc'],'resource');
+ if (is_object($nlist)) {
+ foreach ($nlist as $nd) {
+ $sc = new cc_resource($doc,$nd);
+ $this->resources[$sc->identifier]=$sc;
+ }
+ }
+ }
+
+ public function import_organization_items(DOMElement &$node, cc_i_manifest &$doc) {
+ if (is_null($this->organizations)) {
+ $this->organizations = array();
+ }
+ $nlist = $node->getElementsByTagNameNS($this->ccnamespaces['imscc'],'organization');
+ if (is_object($nlist)) {
+ foreach ($nlist as $nd) {
+ $sc = new cc_organization($nd,$doc);
+ $this->organizations[$sc->identifier]=$sc;
+ }
+ }
+ }
+
+ public function set_generator($value) {
+ $this->_generator = $value;
+ }
+}
\ No newline at end of file
--- /dev/null
+<?php
+// This file is part of Moodle - http://moodle.org/
+//
+// Moodle is free software: you can redistribute it and/or modify
+// it under the terms of the GNU General Public License as published by
+// the Free Software Foundation, either version 3 of the License, or
+// (at your option) any later version.
+//
+// Moodle is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+// GNU General Public License for more details.
+//
+// You should have received a copy of the GNU General Public License
+// along with Moodle. If not, see <http://www.gnu.org/licenses/>.
+
+/**
+* @package backup-convert
+* @subpackage cc-library
+* @copyright 2011 Darko Miletic <dmiletic@moodlerooms.com>
+* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
+*/
+
+require_once 'cc_general.php';
+
+class url1_resurce_file extends general_cc_file {
+ const deafultname = 'weblink.xml';
+
+ protected $rootns = 'wl';
+ protected $rootname = 'wl:webLink';
+ protected $ccnamespaces = array('wl' => 'http://www.imsglobal.org/xsd/imswl_v1p0',
+ 'xsi' => 'http://www.w3.org/2001/XMLSchema-instance');
+ protected $ccnsnames = array('wl' => 'http://www.imsglobal.org/profile/cc/ccv1p0/derived_schema/domainProfile_5/imswl_v1p0_localised.xsd');
+
+ protected $url = null;
+ protected $title = null;
+ protected $href = null;
+ protected $target = '_self';
+ protected $window_features = null;
+
+ /**
+ *
+ * Set the url title
+ * @param string $title
+ */
+ public function set_title($title) {
+ $this->title = htmlentities($title);
+ }
+
+ /**
+ *
+ * Set the url specifics
+ * @param string $url
+ * @param string $target
+ * @param string $window_features
+ */
+ public function set_url($url, $target='_self', $window_features=null) {
+ $this->url = $url;
+ $this->target = $target;
+ $this->window_features = $window_features;
+ }
+
+ protected function on_save() {
+ $this->append_new_element($this->root, 'title', $this->title);
+ $url = $this->append_new_element($this->root, 'url');
+ $this->append_new_attribute($url, 'href', $this->url);
+ if (!empty($this->target)) {
+ $this->append_new_attribute($url, 'target', $this->target);
+ }
+ if (!empty($this->window_features)) {
+ $this->append_new_attribute($url, 'windowFeatures', $this->window_features);
+ }
+ return true;
+ }
+
+}
+
+class url11_resurce_file extends url1_resurce_file {
+ protected $rootname = 'webLink';
+
+ protected $ccnamespaces = array('wl' => 'http://www.imsglobal.org/xsd/imsccv1p1/imswl_v1p1',
+ 'xsi' => 'http://www.w3.org/2001/XMLSchema-instance');
+ protected $ccnsnames = array('wl' => 'http://www.imsglobal.org/profile/cc/ccv1p1/ccv1p1_imswl_v1p1.xsd');
+
+ protected function on_save() {
+ $rns = $this->ccnamespaces[$this->rootns];
+ $this->append_new_element_ns($this->root, $rns, 'title', $this->title);
+ $url = $this->append_new_element_ns($this->root, $rns, 'url');
+ $this->append_new_attribute_ns($url, $rns, 'href', $this->url);
+ if (!empty($this->target)) {
+ $this->append_new_attribute_ns($url, $rns, 'target', $this->target);
+ }
+ if (!empty($this->window_features)) {
+ $this->append_new_attribute_ns($url, $rns, 'windowFeatures', $this->window_features);
+ }
+ return true;
+ }
+}
+
--- /dev/null
+<?php
+// This file is part of Moodle - http://moodle.org/
+//
+// Moodle is free software: you can redistribute it and/or modify
+// it under the terms of the GNU General Public License as published by
+// the Free Software Foundation, either version 3 of the License, or
+// (at your option) any later version.
+//
+// Moodle is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+// GNU General Public License for more details.
+//
+// You should have received a copy of the GNU General Public License
+// along with Moodle. If not, see <http://www.gnu.org/licenses/>.
+
+require_once $CFG->dirroot .'/backup/cc/cc_lib/xmlbase.php';
+require_once 'cssparser.php';
+require_once 'pathutils.php';
+
+
+
+/**
+ *
+ * Older version better suited for PHP < 5.2
+ * @deprecated
+ * @param unknown_type $url
+ * @return boolean
+ */
+function is_url_deprecated($url) {
+ if (
+ !preg_match('#^http\\:\\/\\/[a-z0-9\-]+\.([a-z0-9\-]+\.)?[a-z]+#i', $url) &&
+ !preg_match('#^https\\:\\/\\/[a-z0-9\-]+\.([a-z0-9\-]+\.)?[a-z]+#i', $url) &&
+ !preg_match('#^ftp\\:\\/\\/[a-z0-9\-]+\.([a-z0-9\-]+\.)?[a-z]+#i', $url)
+ ) {
+ $status = false;
+ } else {
+ $status = true;
+ }
+ return $status;
+}
+
+/**
+ *
+ * validates URL
+ * @param string $url
+ * @return boolean
+ */
+function is_url($url) {
+ $result = filter_var($url, FILTER_VALIDATE_URL, FILTER_FLAG_PATH_REQUIRED) !== false;
+ return $result;
+}
+
+function GetDepFiles($manifestroot, $fname,$folder,&$filenames) {
+ $extension = pathinfo($fname, PATHINFO_EXTENSION);
+ $filenames = array();
+ $dcx = new XMLGenericDocument();
+ $result = true;
+
+ switch ($extension){
+ case 'xml':
+ $result = @$dcx->loadXMLFile($manifestroot.$folder.$fname);
+ if (!$result) {
+ $result = @$dcx->loadXMLFile($manifestroot.DIRECTORY_SEPARATOR.$folder.DIRECTORY_SEPARATOR.$fname);
+ }
+ GetDepFilesXML($manifestroot, $fname,$filenames,$dcx, $folder);
+ break;
+ case 'html':
+ case 'htm':
+ $result = @$dcx->loadHTMLFile($manifestroot.$folder.$fname);
+ if (!$result) {
+ $result = @$dcx->loadHTMLFile($manifestroot.DIRECTORY_SEPARATOR.$folder.DIRECTORY_SEPARATOR.$fname);
+ }
+ GetDepFilesHTML($manifestroot, $fname,$filenames,$dcx, $folder);
+ break;
+ }
+ return $result;
+}
+
+
+
+function GetDepFilesXML ($manifestroot, $fname,&$filenames,&$dcx, $folder){
+ $nlist = $dcx->nodeList("//img/@src | //attachments/attachment/@href | //link/@href | //script/@src");
+ $css_obj_array = array();
+ foreach ($nlist as $nl) {
+ $item = $folder.$nl->nodeValue;
+ $path_parts = pathinfo($item);
+ $fname = $path_parts['basename'];
+ $ext = array_key_exists('extension',$path_parts) ? $path_parts['extension'] : '';
+ if (!is_url($nl->nodeValue)) {
+ //$file = $folder.$nl->nodeValue; // DEPENDERA SI SE QUIERE Q SEA RELATIVO O ABSOLUTO
+ $file = $nl->nodeValue;
+ toNativePath($file);
+ $filenames[]=$file;
+ }
+ }
+ $dcx->registerNS('qti','http://www.imsglobal.org/xsd/imscc/ims_qtiasiv1p2.xsd');
+ $dcx->resetXpath();
+ $nlist = $dcx->nodeList("//qti:mattext | //text");
+ $dcx2 = new XMLGenericDocument();
+ foreach ($nlist as $nl) {
+ if ($dcx2->loadString($nl->nodeValue)){
+ GetDepFilesHTML($manifestroot,$fname,$filenames,$dcx2,$folder);
+ }
+ }
+}
+
+
+
+function GetDepFilesHTML ($manifestroot, $fname, &$filenames, &$dcx, $folder){
+ $dcx->resetXpath();
+ $nlist = $dcx->nodeList("//img/@src | //link/@href | //script/@src | //a[not(starts-with(@href,'#'))]/@href");
+ $css_obj_array=array();
+ foreach ($nlist as $nl) {
+ $item = $folder.$nl->nodeValue;
+ $path_parts = pathinfo($item);
+ $fname = $path_parts['basename'];
+ $ext = array_key_exists('extension',$path_parts) ? $path_parts['extension'] : '';
+ if (!is_url($folder.$nl->nodeValue) && !is_url($nl->nodeValue)) {
+ $path = $folder.$nl->nodeValue;
+ $file = fullPath($path,"/");
+ toNativePath($file);
+ if (file_exists($manifestroot.DIRECTORY_SEPARATOR.$file)) {
+ $filenames[]= $file;
+ }
+ }
+ if ($ext == 'css') {
+ $css = new cssparser();
+ $css->Parse($dcx->filePath().$nl->nodeValue);
+ $css_obj_array[$item]=$css;
+ }
+ }
+ $nlist = $dcx->nodeList("//*/@class");
+ foreach ($nlist as $nl) {
+ $item = $folder.$nl->nodeValue;
+ foreach ($css_obj_array as $csskey => $cssobj) {
+ $bimg = $cssobj->Get($item,"background-image");
+ $limg = $cssobj->Get($item,"list-style-image");
+ $npath = pathinfo($csskey);
+ if ((!empty($bimg))&& ($bimg != 'none')) {
+ $filenames[] = stripUrl($bimg,$npath['dirname'].'/');
+ } else
+ if ((!empty($limg))&& ($limg != 'none')) {
+ $filenames[] = stripUrl($limg,$npath['dirname'].'/');
+ }
+ }
+ }
+ $elems_to_check = array("body","p","ul","h4","a","th");
+ $do_we_have_it = array();
+ foreach ($elems_to_check as $elem) {
+ $do_we_have_it[$elem]=($dcx->nodeList("//".$elem)->length > 0);
+ }
+ foreach ($elems_to_check as $elem) {
+ if ($do_we_have_it[$elem]) {
+ foreach ($css_obj_array as $csskey => $cssobj) {
+ $sb = $cssobj->Get($elem, "background-image");
+ $sbl = $cssobj->Get($elem,"list-style-image");
+ $npath = pathinfo($csskey);
+ if ((!empty($sb)) && ($sb != 'none')) {
+ $filenames[] = stripUrl($sb,$npath['dirname'].'/');
+ } else
+ if ((!empty($sbl)) && ($sbl != 'none')) {
+ $filenames[] = stripUrl($sbl,$npath['dirname'].'/');
+ }
+ }
+ }
+ }
+}
\ No newline at end of file
--- /dev/null
+<?php
+// This file is part of Moodle - http://moodle.org/
+//
+// Moodle is free software: you can redistribute it and/or modify
+// it under the terms of the GNU General Public License as published by
+// the Free Software Foundation, either version 3 of the License, or
+// (at your option) any later version.
+//
+// Moodle is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+// GNU General Public License for more details.
+//
+// You should have received a copy of the GNU General Public License
+// along with Moodle. If not, see <http://www.gnu.org/licenses/>.
+
+class cssparser {
+ private $css;
+ private $html;
+
+ function cssparser($html = true) {
+ // Register "destructor"
+ register_shutdown_function(array(&$this, "finalize"));
+ $this->html = ($html != false);
+ $this->Clear();
+ }
+
+ function finalize() {
+ unset($this->css);
+ }
+
+ function Clear() {
+ unset($this->css);
+ $this->css = array();
+ if($this->html) {
+ $this->Add("ADDRESS", "");
+ $this->Add("APPLET", "");
+ $this->Add("AREA", "");
+ $this->Add("A", "text-decoration : underline; color : Blue;");
+ $this->Add("A:visited", "color : Purple;");
+ $this->Add("BASE", "");
+ $this->Add("BASEFONT", "");
+ $this->Add("BIG", "");
+ $this->Add("BLOCKQUOTE", "");
+ $this->Add("BODY", "");
+ $this->Add("BR", "");
+ $this->Add("B", "font-weight: bold;");
+ $this->Add("CAPTION", "");
+ $this->Add("CENTER", "");
+ $this->Add("CITE", "");
+ $this->Add("CODE", "");
+ $this->Add("DD", "");
+ $this->Add("DFN", "");
+ $this->Add("DIR", "");
+ $this->Add("DIV", "");
+ $this->Add("DL", "");
+ $this->Add("DT", "");
+ $this->Add("EM", "");
+ $this->Add("FONT", "");
+ $this->Add("FORM", "");
+ $this->Add("H1", "");
+ $this->Add("H2", "");
+ $this->Add("H3", "");
+ $this->Add("H4", "");
+ $this->Add("H5", "");
+ $this->Add("H6", "");
+ $this->Add("HEAD", "");
+ $this->Add("HR", "");
+ $this->Add("HTML", "");
+ $this->Add("IMG", "");
+ $this->Add("INPUT", "");
+ $this->Add("ISINDEX", "");
+ $this->Add("I", "font-style: italic;");
+ $this->Add("KBD", "");
+ $this->Add("LINK", "");
+ $this->Add("LI", "");
+ $this->Add("MAP", "");
+ $this->Add("MENU", "");
+ $this->Add("META", "");
+ $this->Add("OL", "");
+ $this->Add("OPTION", "");
+ $this->Add("PARAM", "");
+ $this->Add("PRE", "");
+ $this->Add("P", "");
+ $this->Add("SAMP", "");
+ $this->Add("SCRIPT", "");
+ $this->Add("SELECT", "");
+ $this->Add("SMALL", "");
+ $this->Add("STRIKE", "");
+ $this->Add("STRONG", "");
+ $this->Add("STYLE", "");
+ $this->Add("SUB", "");
+ $this->Add("SUP", "");
+ $this->Add("TABLE", "");
+ $this->Add("TD", "");
+ $this->Add("TEXTAREA", "");
+ $this->Add("TH", "");
+ $this->Add("TITLE", "");
+ $this->Add("TR", "");
+ $this->Add("TT", "");
+ $this->Add("UL", "");
+ $this->Add("U", "text-decoration : underline;");
+ $this->Add("VAR", "");
+ }
+ }
+
+ function SetHTML($html) {
+ $this->html = ($html != false);
+ }
+
+ function Add($key, $codestr) {
+ $key = strtolower($key);
+ $codestr = strtolower($codestr);
+ if(!isset($this->css[$key])) {
+ $this->css[$key] = array();
+ }
+ $codes = explode(";",$codestr);
+ if(count($codes) > 0) {
+ $codekey=''; $codevalue='';
+ foreach($codes as $code) {
+ $code = trim($code);
+ $this->assignValues(explode(":",$code),$codekey,$codevalue);
+ if(strlen($codekey) > 0) {
+ $this->css[$key][trim($codekey)] = trim($codevalue);
+ }
+ }
+ }
+ }
+
+ private function assignValues($arr,&$val1,&$val2) {
+ $n = count($arr);
+ if ($n > 0) {
+ $val1=$arr[0];
+ $val2=($n > 1) ? $arr[1] : '';
+ }
+ }
+ function Get($key, $property) {
+ $key = strtolower($key);
+ $property = strtolower($property);
+ $tag='';$subtag='';$class='';$id='';
+ $this->assignValues(explode(":",$key),$tag,$subtag);
+ $this->assignValues(explode(".",$tag),$tag,$class);
+ $this->assignValues(explode("#",$tag),$tag,$id);
+ $result = "";
+ $_subtag=''; $_class=''; $_id='';
+ foreach($this->css as $_tag => $value) {
+ $this->assignValues(explode(":",$_tag),$_tag,$_subtag);
+ $this->assignValues(explode(".",$_tag),$_tag,$_class);
+ $this->assignValues(explode("#",$_tag),$_tag,$_id);
+
+ $tagmatch = (strcmp($tag, $_tag) == 0) | (strlen($_tag) == 0);
+ $subtagmatch = (strcmp($subtag, $_subtag) == 0) | (strlen($_subtag) == 0);
+ $classmatch = (strcmp($class, $_class) == 0) | (strlen($_class) == 0);
+ $idmatch = (strcmp($id, $_id) == 0);
+
+ if($tagmatch & $subtagmatch & $classmatch & $idmatch) {
+ $temp = $_tag;
+ if((strlen($temp) > 0) & (strlen($_class) > 0)) {
+ $temp .= ".".$_class;
+ } elseif(strlen($temp) == 0) {
+ $temp = ".".$_class;
+ }
+ if((strlen($temp) > 0) & (strlen($_subtag) > 0)) {
+ $temp .= ":".$_subtag;
+ } elseif(strlen($temp) == 0) {
+ $temp = ":".$_subtag;
+ }
+ if(isset($this->css[$temp][$property])) {
+ $result = $this->css[$temp][$property];
+ }
+ }
+ }
+ return $result;
+ }
+
+ function GetSection($key) {
+ $key = strtolower($key);
+ $tag='';$subtag='';$class='';$id='';
+ $_subtag=''; $_class=''; $_id='';
+
+ $this->assignValues(explode(":",$key),$tag,$subtag);
+ $this->assignValues(explode(".",$tag),$tag,$class);
+ $this->assignValues(explode("#",$tag),$tag,$id);
+ $result = array();
+ foreach($this->css as $_tag => $value) {
+ $this->assignValues(explode(":",$_tag),$_tag,$_subtag);
+ $this->assignValues(explode(".",$_tag),$_tag,$_class);
+ $this->assignValues(explode("#",$_tag),$_tag,$_id);
+
+ $tagmatch = (strcmp($tag, $_tag) == 0) | (strlen($_tag) == 0);
+ $subtagmatch = (strcmp($subtag, $_subtag) == 0) | (strlen($_subtag) == 0);
+ $classmatch = (strcmp($class, $_class) == 0) | (strlen($_class) == 0);
+ $idmatch = (strcmp($id, $_id) == 0);
+
+ if($tagmatch & $subtagmatch & $classmatch & $idmatch) {
+ $temp = $_tag;
+ if((strlen($temp) > 0) & (strlen($_class) > 0)) {
+ $temp .= ".".$_class;
+ } elseif(strlen($temp) == 0) {
+ $temp = ".".$_class;
+ }
+ if((strlen($temp) > 0) & (strlen($_subtag) > 0)) {
+ $temp .= ":".$_subtag;
+ } elseif(strlen($temp) == 0) {
+ $temp = ":".$_subtag;
+ }
+ foreach($this->css[$temp] as $property => $value) {
+ $result[$property] = $value;
+ }
+ }
+ }
+ return $result;
+ }
+
+ function ParseStr($str) {
+ $this->Clear();
+ // Remove comments
+ $str = preg_replace("/\/\*(.*)?\*\//Usi", "", $str);
+ // Parse this damn csscode
+ $parts = explode("}",$str);
+ if(count($parts) > 0) {
+ foreach($parts as $part) {
+ $keystr='';$codestr='';
+ $this->assignValues(explode("{",$part),$keystr,$codestr);
+ $keys = explode(",",trim($keystr));
+ if(count($keys) > 0) {
+ foreach($keys as $key) {
+ if(strlen($key) > 0) {
+ $key = str_replace("\n", "", $key);
+ $key = str_replace("\\", "", $key);
+ $this->Add($key, trim($codestr));
+ }
+ }
+ }
+ }
+ }
+ //
+ return (count($this->css) > 0);
+ }
+
+ function Parse($filename) {
+ $this->Clear();
+ if(file_exists($filename)) {
+ return $this->ParseStr(file_get_contents($filename));
+ } else {
+ return false;
+ }
+ }
+
+ function GetCSS() {
+ $result = "";
+ foreach($this->css as $key => $values) {
+ $result .= $key." {\n";
+ foreach($values as $key => $value) {
+ $result .= " $key: $value;\n";
+ }
+ $result .= "}\n\n";
+ }
+ return $result;
+ }
+}
\ No newline at end of file
--- /dev/null
+<?php
+// This file is part of Moodle - http://moodle.org/
+//
+// Moodle is free software: you can redistribute it and/or modify
+// it under the terms of the GNU General Public License as published by
+// the Free Software Foundation, either version 3 of the License, or
+// (at your option) any later version.
+//
+// Moodle is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+// GNU General Public License for more details.
+//
+// You should have received a copy of the GNU General Public License
+// along with Moodle. If not, see <http://www.gnu.org/licenses/>.
+
+/**
+ * LibrerÃa de funciones básicas V1.0 (June, 16th 2009)
+ *
+ *
+ * @author Daniel Mühlrad
+ * @link daniel.muhlrad@uvcms.com
+ * @version 1.0
+ * @copyright 2009
+ *
+ */
+
+
+
+
+/**
+ * Make a Handler error with an exception msg error
+ *
+ * @param integer $errno
+ * @param string $errstr
+ * @param string $errfile
+ * @param string $errline
+ */
+function errorHandler($errno, $errstr, $errfile, $errline) {
+ // si deseas podes guardarlos en un archivo
+ ($errfile);($errline);
+ throw new Exception($errstr, $errno);
+}
+
+
+
+/**
+ * Return de mime-type of a file
+ *
+ * @param string $file
+ * @param string $default_type
+ *
+ */
+function file_mime_type ($file, $default_type = 'application/octet-stream'){
+ $ftype = $default_type;
+ $magic_path = dirname(__FILE__)
+ . DIRECTORY_SEPARATOR
+ . '..'
+ . DIRECTORY_SEPARATOR
+ . 'magic'
+ . DIRECTORY_SEPARATOR
+ . 'magic';
+ $finfo = @finfo_open(FILEINFO_MIME , $magic_path);
+ if ($finfo !== false) {
+
+ $fres = @finfo_file($finfo, $file);
+
+ if ( is_string($fres) && !empty($fres) ) {
+ $ftype = $fres;
+ }
+ @finfo_close($finfo);
+ }
+ return $ftype;
+}
+
+
+
+
+function array_remove_by_value($arr,$value) {
+ return array_values(array_diff($arr,array($value)));
+
+}
+
+
+function array_remove_by_key($arr,$key) {
+ return array_values(array_diff_key($arr,array($key)));
+
+}
+
+
+function cc_print_object($object) {
+ echo '<pre>' . htmlspecialchars(print_r($object,true)) . '</pre>';
+}
+
+
+
+/**
+ * IndexOf - first version of find an element in the Array given
+ * returns the index of the *first* occurance
+ * @param mixed $needle
+ * @param array $haystack
+ * @return mixed The element or false if the function didnt find it
+ */
+
+function indexOf($needle, $haystack) {
+ for ($i = 0; $i < count($haystack) ; $i++) {
+ if ($haystack[$i] == $needle) {
+ return $i;
+ }
+ }
+ return false;
+}
+
+
+/**
+ * IndexOf2 - second version of find an element in the Array given
+ *
+ * @param mixed $needle
+ * @param array $haystack
+ * @return mixed The index of the element or false if the function didnt find it
+ */
+
+function indexOf2($needle, $haystack) {
+ for($i = 0,$z = count($haystack); $i < $z; $i++){
+ if ($haystack[$i] == $needle) { //finds the needle
+ return $i;
+ }
+ }
+ return false;
+}
+
--- /dev/null
+<?php
+// This file is part of Moodle - http://moodle.org/
+//
+// Moodle is free software: you can redistribute it and/or modify
+// it under the terms of the GNU General Public License as published by
+// the Free Software Foundation, either version 3 of the License, or
+// (at your option) any later version.
+//
+// Moodle is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+// GNU General Public License for more details.
+//
+// You should have received a copy of the GNU General Public License
+// along with Moodle. If not, see <http://www.gnu.org/licenses/>.
+
+require_once $CFG->dirroot .'/backup/cc/cc_lib/xmlbase.php';
+require_once 'cssparser.php';
+require_once 'pathutils.php';
+
+
+
+function is_url($url) {
+ if (
+ !preg_match('#^http\\:\\/\\/[a-z0-9\-]+\.([a-z0-9\-]+\.)?[a-z]+#i', $url) &&
+ !preg_match('#^https\\:\\/\\/[a-z0-9\-]+\.([a-z0-9\-]+\.)?[a-z]+#i', $url) &&
+ !preg_match('#^ftp\\:\\/\\/[a-z0-9\-]+\.([a-z0-9\-]+\.)?[a-z]+#i', $url)
+ ) {
+ $status = false;
+ } else {
+ $status = true;
+ }
+ return $status;
+}
+
+function GetDepFiles($manifestroot, $fname,$folder,&$filenames) {
+
+ $extension = end(explode('.',$fname));
+ $filenames = array();
+ $dcx = new XMLGenericDocument();
+ $result = true;
+
+ switch ($extension){
+ case 'xml':
+ $result = @$dcx->loadXMLFile($manifestroot.$folder.$fname);
+ if (!$result) {
+ $result = @$dcx->loadXMLFile($manifestroot.DIRECTORY_SEPARATOR.$folder.DIRECTORY_SEPARATOR.$fname);
+ }
+ GetDepFilesXML($manifestroot, $fname,$filenames,$dcx, $folder);
+ break;
+ case 'html':
+ case 'htm':
+ $result = @$dcx->loadHTMLFile($manifestroot.$folder.$fname);
+ if (!$result) {
+ $result = @$dcx->loadHTMLFile($manifestroot.DIRECTORY_SEPARATOR.$folder.DIRECTORY_SEPARATOR.$fname);
+ }
+ GetDepFilesHTML($manifestroot, $fname,$filenames,$dcx, $folder);
+ break;
+ }
+ return $result;
+}
+
+
+
+function GetDepFilesXML ($manifestroot, $fname,&$filenames,&$dcx, $folder){
+ $nlist = $dcx->nodeList("//img/@src | //attachments/attachment/@href | //link/@href | //script/@src");
+ $css_obj_array = array();
+ foreach ($nlist as $nl) {
+ $item = $nl->nodeValue;
+ $path_parts = pathinfo($item);
+ $fname = $path_parts['basename'];
+ $ext = array_key_exists('extension',$path_parts) ? $path_parts['extension'] : '';
+ if (!is_url($nl->nodeValue)) {
+ //$file = $folder.$nl->nodeValue; // DEPENDERA SI SE QUIERE Q SEA RELATIVO O ABSOLUTO
+ $file = $nl->nodeValue;
+ toNativePath($file);
+ $filenames[]=$file;
+ }
+ }
+ $dcx->registerNS('qti','http://www.imsglobal.org/xsd/imscc/ims_qtiasiv1p2.xsd');
+ $dcx->resetXpath();
+ $nlist = $dcx->nodeList("//qti:mattext | //text");
+ $dcx2 = new XMLGenericDocument();
+ foreach ($nlist as $nl) {
+ if ($dcx2->loadString($nl->nodeValue)){
+ GetDepFilesHTML($manifestroot,$fname,$filenames,$dcx2,$folder);
+ }
+ }
+}
+
+
+
+function GetDepFilesHTML ($manifestroot, $fname,&$filenames,&$dcx, $folder){
+ $dcx->resetXpath();
+ $nlist = $dcx->nodeList("//img/@src | //link/@href | //script/@src | //a[not(starts-with(@href,'#'))]/@href");
+ $css_obj_array=array();
+ foreach ($nlist as $nl) {
+ $item = $nl->nodeValue;
+ $path_parts = pathinfo($item);
+ $fname = $path_parts['basename'];
+ $ext = array_key_exists('extension',$path_parts) ? $path_parts['extension'] : '';
+ if (!is_url($folder.$nl->nodeValue) && !is_url($nl->nodeValue)) {
+ $path = $nl->nodeValue;
+ //$file = fullPath($path,"/");
+ toNativePath($path);
+ $filenames[]= $path;
+ }
+ if ($ext == 'css') {
+ $css = new cssparser();
+ $css->Parse($dcx->filePath().$nl->nodeValue);
+ $css_obj_array[$item]=$css;
+ }
+ }
+ $nlist = $dcx->nodeList("//*/@class");
+ foreach ($nlist as $nl) {
+ $item = $nl->nodeValue;
+ foreach ($css_obj_array as $csskey => $cssobj) {
+ $bimg = $cssobj->Get($item,"background-image");
+ $limg = $cssobj->Get($item,"list-style-image");
+ $npath = pathinfo($csskey);
+ if ((!empty($bimg))&& ($bimg != 'none')) {
+ $filenames[] = stripUrl($bimg,$npath['dirname'].'/');
+ } else
+ if ((!empty($limg))&& ($limg != 'none')) {
+ $filenames[] = stripUrl($limg,$npath['dirname'].'/');
+ }
+ }
+ }
+ $elems_to_check = array("body","p","ul","h4","a","th");
+ $do_we_have_it = array();
+ foreach ($elems_to_check as $elem) {
+ $do_we_have_it[$elem]=($dcx->nodeList("//".$elem)->length > 0);
+ }
+ foreach ($elems_to_check as $elem) {
+ if ($do_we_have_it[$elem]) {
+ foreach ($css_obj_array as $csskey => $cssobj) {
+ $sb = $cssobj->Get($elem, "background-image");
+ $sbl = $cssobj->Get($elem,"list-style-image");
+ $npath = pathinfo($csskey);
+ if ((!empty($sb)) && ($sb != 'none')) {
+ $filenames[] = stripUrl($sb,$npath['dirname'].'/');
+ } else
+ if ((!empty($sbl)) && ($sbl != 'none')) {
+ $filenames[] = stripUrl($sbl,$npath['dirname'].'/');
+ }
+ }
+ }
+ }
+}
\ No newline at end of file
--- /dev/null
+<?php
+// This file is part of Moodle - http://moodle.org/
+//
+// Moodle is free software: you can redistribute it and/or modify
+// it under the terms of the GNU General Public License as published by
+// the Free Software Foundation, either version 3 of the License, or
+// (at your option) any later version.
+//
+// Moodle is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+// GNU General Public License for more details.
+//
+// You should have received a copy of the GNU General Public License
+// along with Moodle. If not, see <http://www.gnu.org/licenses/>.
+
+/**
+ * Function expands all relative parts of supplied path string thus
+ * removing things like ../../ or ./../.
+ *
+ * @param string $path
+ * @param string $dirsep Character that represents directory separator should be
+ * specified here. Default is DIRECTORY_SEPARATOR.
+ * @return string
+ */
+function fullPath($path,$dirsep=DIRECTORY_SEPARATOR) {
+ $token = '$IMS-CC-FILEBASE$';
+ $path = str_replace($token,'',$path);
+ if ( is_string($path) && ($path != '') ) {
+ $sep = $dirsep;
+ $dotDir= '.';
+ $upDir = '..';
+ $length= strlen($path);
+ $rtemp= trim($path);
+ $start = strrpos($path, $sep);
+ $canContinue = ($start !== false);
+ $result= $canContinue ? '': $path;
+ $rcount=0;
+ while ($canContinue) {
+ $dirPart = ($start !== false) ? substr($rtemp,$start+1,$length-$start) : $rtemp;
+ $canContinue = ($dirPart !== false);
+ if ($canContinue) {
+ if ($dirPart != $dotDir) {
+ if ($dirPart == $upDir) {
+ $rcount++;
+ } else {
+ if ($rcount > 0) {
+ $rcount--;
+ } else {
+ $result = ($result == '') ? $dirPart : $dirPart.$sep.$result;
+ }
+ }
+ }
+ $rtemp = substr($path,0,$start);
+ $start = strrpos($rtemp, $sep);
+ $canContinue = (($start !== false) || (strlen($rtemp) > 0));
+ }
+ } //end while
+ }
+ return $result;
+}
+
+
+
+/**
+ * Function strips url part from css link
+ *
+ * @param string $path
+ * @param string $rootDir
+ * @return string
+ */
+function stripUrl($path, $rootDir='') {
+ $result = $path;
+ if ( is_string($path) && ($path != '') ) {
+ $start=strpos($path,'(')+1;
+ $length=strpos($path,')')-$start;
+ $rut = $rootDir.substr($path,$start,$length);
+ $result=fullPath($rut,'/');
+ }
+ return $result;
+}
+
+/**
+ * Converts direcotry separator in given path to / to validate in CC
+ * Value is passed byref hence variable itself is changed
+ *
+ * @param string $path
+ */
+function toNativePath(&$path) {
+ for ($count = 0 ; $count < strlen($path); ++$count) {
+ $chr = $path{$count};
+ if (($chr == '\\') || ($chr == '/')) {
+ $path{$count} = '/';
+ }
+ }
+}
+
+
+/**
+ * Converts direcotry separator in given path to the one on the server platform
+ * Value is passed byref hence variable itself is changed
+ *
+ * @param string $path
+ */
+function toNativePath2(&$path) {
+ for ($count = 0 ; $count < strlen($path); ++$count) {
+ $chr = $path{$count};
+ if (($chr == '\\') || ($chr == '/')) {
+ $path{$count} = DIRECTORY_SEPARATOR;
+ }
+ }
+}
+
+/**
+ * Converts \ Directory separator to the / more suitable for URL
+ *
+ * @param string $path
+ */
+function toUrlPath(&$path) {
+ for ($count = 0 ; $count < strlen($path); ++$count) {
+ $chr = $path{$count};
+ if (($chr == '\\')) {
+ $path{$count} = '/';
+ }
+ }
+}
+
+/**
+ * Returns relative path from two directories with full path
+ *
+ * @param string $path1
+ * @param string $path2
+ * @return string
+ */
+function pathDiff($path1, $path2) {
+ toUrlPath($path1);
+ toUrlPath($path2);
+ $result = "";
+ $bl2 = strlen($path2);
+ $a = strpos($path1,$path2);
+ if ($a !== false) {
+ $result = trim(substr($path1,$bl2+$a),'/');
+ }
+ return $result;
+}
+
+ /**
+ * Copy a file, or recursively copy a folder and its contents
+ *
+ * @author Aidan Lister <aidan@php.net>
+ * @version 1.0.1
+ * @link http://aidanlister.com/repos/v/function.copyr.php
+ * @param string $source Source path
+ * @param string $dest Destination path
+ * @return bool Returns TRUE on success, FALSE on failure
+ */
+ function copyr($source, $dest)
+ {
+ // Simple copy for a file
+ if (is_file($source)) {
+ return copy($source, $dest);
+ }
+
+ // Make destination directory
+ if (!is_dir($dest)) {
+ mkdir($dest);
+ }
+
+ // Loop through the folder
+ $dir = dir($source);
+ while (false !== $entry = $dir->read()) {
+ // Skip pointers
+ if ($entry == '.' || $entry == '..') {
+ continue;
+ }
+
+ // Deep copy directories
+ if ($dest !== "$source/$entry") {
+ copyr("$source/$entry", "$dest/$entry");
+ }
+ }
+
+ // Clean up
+ $dir->close();
+ return true;
+ }
+
+/**
+ * Function returns array with directories contained in folder (only first level)
+ *
+ * @param string $rootDir directory to look into
+ * @param string $contains which string to look for
+ * @param array $excludeitems array of names to be excluded
+ * @param bool $startswith should the $contains value be searched only from
+ * beginning
+ * @return array Returns array of sub-directories. In case $rootDir path is
+ * invalid it returns FALSE.
+ */
+function getDirectories($rootDir, $contains, $excludeitems = null, $startswith = true) {
+ $result = is_dir($rootDir);
+ if ($result) {
+ $dirlist = dir($rootDir);
+ $entry = null;
+ $result = array();
+ while(false !== ($entry = $dirlist->read())) {
+ $currdir = $rootDir.$entry;
+ if (is_dir($currdir)) {
+ $bret = strpos($entry,$contains);
+ if (($bret !== false)) {
+ if (($startswith && ($bret == 0)) || !$startswith) {
+ if (!( is_array($excludeitems) && in_array($entry,$excludeitems) )) {
+ $result[] = $entry;
+ }
+ }
+ }
+ }
+ }
+ }
+ return $result;
+}
+
+function getFilesOnly($rootDir, $contains, $excludeitems = null, $startswith = true,$extension=null) {
+ $result = is_dir($rootDir);
+ if ($result) {
+ $filelist = dir($rootDir);
+ $entry = null;
+ $result = array();
+ while(false !== ($entry = $filelist->read())) {
+ $curritem = $rootDir.$entry;
+ $pinfo = pathinfo($entry);
+ $ext = array_key_exists('extension',$pinfo) ? $pinfo['extension'] : null;
+ if (is_file($curritem) && (is_null($extension) || ($ext == $extension) )) {
+ $bret = strpos($entry,$contains);
+ if (($bret !== false)) {
+ if (($startswith && ($bret == 0)) || !$startswith) {
+ if (!( is_array($excludeitems) && in_array($entry,$excludeitems) )) {
+ $result[] = $entry;
+ }
+ }
+ }
+ }
+ }
+ }
+ natcasesort($result);
+ return $result;
+}
+
+
+
+/**
+ * Search an identifier in array
+ *
+ * @param array $array
+ * @param string $name
+ *
+ */
+
+function search_ident_by_name($array,$name){
+ if (empty($array)){
+ throw new Exception('The array given is null');
+ }
+ $ident = null;
+ foreach ($array as $k => $v){
+ ($k);
+ if ($v[1] == $name){
+ $ident = $v[0];
+ break;
+ }
+ }
+ return $ident;
+}
+
+
+
+
+
+/**
+ * Function returns files recursivly with appeneded relative path
+ *
+ * @param string $startDir
+ * @param string $rootDir
+ * @param array $excludedirs
+ * @param array $excludefileext
+ * @return array
+ */
+function getRawFiles($startDir, &$fhandle, $rootDir='', $excludedirs = null, $excludefileext = null) {
+ $result = is_dir($startDir);
+ if ($result) {
+ $dirlist = dir($startDir);
+ $entry = null;
+ while(false !== ($entry = $dirlist->read())) {
+ $curritem = $startDir.$entry;
+ if (($entry=='.') || ($entry =='..')) {
+ continue;
+ }
+ if (is_dir($curritem)) {
+ if (!( is_array($excludedirs) && in_array($entry,$excludedirs) )) {
+ getRawFiles($startDir.$entry."/",$fhandle,$rootDir.$entry."/",$excludedirs,$excludefileext);
+ }
+ continue;
+ }
+ if (is_file($curritem)){
+ $pinfo = pathinfo($entry);
+ $ext = array_key_exists('extension',$pinfo) ? $pinfo['extension'] : '';
+ if (!is_array($excludefileext) ||
+ (is_array($excludefileext) && !in_array($ext,$excludefileext))) {
+ fwrite($fhandle,$rootDir.$entry."\n");
+ }
+ }
+ }
+ }
+ return $result;
+}
+
+
+function getRawFiles2($startDir,&$arr, $rootDir='', $excludedirs = null, $excludefileext = null) {
+
+ $result = is_dir($startDir);
+ if ($result) {
+ $dirlist = dir($startDir);
+ $entry = null;
+ while(false !== ($entry = $dirlist->read())) {
+ $curritem = $startDir.$entry;
+ if (($entry=='.') || ($entry =='..')) {
+ continue;
+ }
+ if (is_dir($curritem)) {
+ if (!( is_array($excludedirs) && in_array($entry,$excludedirs) )) {
+ getRawFiles2($startDir.$entry."/",$arr,$rootDir.$entry."/",$excludedirs,$excludefileext);
+ }
+ continue;
+ }
+ if (is_file($curritem)){
+ $pinfo = pathinfo($entry);
+ $ext = array_key_exists('extension',$pinfo) ? $pinfo['extension'] : '';
+ if (!is_array($excludefileext) ||
+ (is_array($excludefileext) && !in_array($ext,$excludefileext))) {
+ array_push($arr,$rootDir.$entry);
+ // fwrite($fhandle,$rootDir.$entry."\n");
+ }
+ }
+ }
+ }
+ return $result;
+}
+
+
+function GetFiles($startDir, $outfile, $rootDir='', $excludedirs = null, $excludefileext = null) {
+ $fh = @fopen($outfile,"w+");
+ if ($fh !== FALSE) {
+ getRawFiles($startDir,$fh,$rootDir,$excludedirs,$excludefileext);
+ @fclose($fh);
+ @chmod($outfile,0777);
+ }
+}
+
+
+/**
+ * Function to get an array with all files in a directory and subdirectories
+ *
+ * @param string $startDir
+ * @param string $rootDir
+ * @param string $excludedirs
+ * @param string $excludefileext
+ * @return array
+ */
+
+function GetFilesArray($startDir, $rootDir='', $excludedirs = null, $excludefileext = null) {
+ $arr = array();
+ getRawFiles2($startDir,$arr,$rootDir,$excludedirs,$excludefileext);
+ return $arr;
+}
+
+
+
+/**
+ * Function returns array with directories contained in folder (only first level)
+ * simmilar to getDirectories but returned items are naturally sorted.
+ *
+ * @param string $rootDir
+ * @param string $contains
+ * @param array $excludeitems
+ * @param bool $startswith
+ * @return array
+ */
+function getCourseDirs ($rootDir, $contains, $excludeitems=null, $startswith=true) {
+ $result = getDirectories($rootDir,$contains,$excludeitems,$startswith);
+ if ($result !== false) {
+ natcasesort($result);
+ $result = array_values($result);
+ }
+ return $result;
+}
+
+
+/**
+ * Delete a directory recursive with files inside
+ *
+ * @param string $dirname
+ * @return bool
+ */
+function rmdirr($dirname)
+{
+ if (!file_exists($dirname)) {
+ return false;
+ }
+ if (is_file($dirname) || is_link($dirname)) {
+ return unlink($dirname);
+ }
+ $dir = dir($dirname);
+ while (false !== $entry = $dir->read()) {
+ if ($entry == '.' || $entry == '..') {
+ continue;
+ }
+ rmdirr($dirname . DIRECTORY_SEPARATOR . $entry);
+ }
+ $dir->close();
+ return rmdir($dirname);
+}
\ No newline at end of file
--- /dev/null
+<?php
+// This file is part of Moodle - http://moodle.org/
+//
+// Moodle is free software: you can redistribute it and/or modify
+// it under the terms of the GNU General Public License as published by
+// the Free Software Foundation, either version 3 of the License, or
+// (at your option) any later version.
+//
+// Moodle is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+// GNU General Public License for more details.
+//
+// You should have received a copy of the GNU General Public License
+// along with Moodle. If not, see <http://www.gnu.org/licenses/>.
+
+/**
+* @package backup-convert
+* @subpackage cc-library
+* @copyright 2011 Darko Miletic <dmiletic@moodlerooms.com>
+* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
+*/
+
+require_once 'gral_lib/cssparser.php';
+
+/**
+ * Base XML class
+ *
+ */
+class XMLGenericDocument {
+
+
+ private $charset;
+ /**
+ *
+ * Document
+ * @var DOMDocument
+ */
+ public $doc = null;
+ /**
+ *
+ * Xpath
+ * @var DOMXPath
+ */
+ protected $dxpath = null;
+ private $filename;
+ private $filepath;
+ private $isloaded = false;
+ private $arrayPrefixNS = array();
+ private $is_html = false;
+
+
+ function __construct($ch = 'UTF-8',$validatenow=true){
+ $this->charset = $ch;
+ $this->documentInit();
+ $this->doc->validateOnParse = $validatenow;
+ }
+
+ function __destruct(){
+ $this->dxpath = null;
+ $this->doc = null;
+ }
+
+ private function documentInit($withonCreate=true) {
+ $hg = false;
+ if ($this->isloaded){
+ $guardstate = $this->doc->validateOnParse;
+ $hg = true;
+ unset($this->dxpath);
+ unset($this->doc);
+ $this->isloaded = false;
+ }
+ $this->doc = new DOMDocument("1.0",$this->charset);
+ $this->doc->strictErrorChecking = true;
+ if ($hg) {
+ $this->doc->validateOnParse = $guardstate;
+ }
+ $this->doc->formatOutput = true;
+ $this->doc->preserveWhiteSpace = true;
+ if($withonCreate) {
+ $this->on_create();
+ }
+ }
+
+ public function viewXML (){
+ return $this->doc->saveXML;
+ }
+
+ public function registerNS($prefix, $nsuri) {
+ $this->arrayPrefixNS[$prefix]=$nsuri;
+ }
+
+ public function load($fname) {
+ // Sine xml will remain loaded should the repeated load fail we should recreate document to be empty.
+ $this->documentInit(false);
+ $this->isloaded = $this->doc->load($fname);
+ if ($this->isloaded){
+ $this->filename = $fname;
+ $this->processPath();
+ $this->is_html = false;
+ }
+ return $this->on_load();
+ }
+
+ public function loadUrl($url){
+ $this->documentInit();
+ $this->isloaded = true;
+ $this->doc->loadXML( file_get_contents($url) );
+ $this->is_html = false;
+ return $this->on_load();
+ }
+
+ public function loadHTML ($content){
+ $this->documentInit();
+ $this->doc->validateOnParse = false;
+ $this->isloaded = true;
+ $this->doc->loadHTML($content);
+ $this->is_html = true;
+ return $this->on_load();
+ }
+
+ public function loadXML ($content){
+ $this->documentInit();
+ $this->doc->validateOnParse = false;
+ $this->isloaded = true;
+ $this->doc->load($content);
+ $this->is_html = true;
+ return $this->on_load();
+ }
+
+ public function loadHTMLFile($fname){
+ //Sine xml will remain loaded should the repeated load fail
+ //we shoudl recreate document to be empty
+ $this->documentInit();
+ $this->doc->validateOnParse = false;
+ $this->isloaded = $this->doc->loadHTMLFile($fname);
+ if ($this->isloaded) {
+ $this->filename = $fname;
+ $this->processPath();
+ $this->is_html=true;
+ }
+ return $this->on_load();
+ }
+
+ public function loadXMLFile($fname){
+ //Sine xml will remain loaded should the repeated load fail
+ //we shoudl recreate document to be empty
+ $this->documentInit();
+ $this->doc->validateOnParse = false;
+ $this->isloaded = $this->doc->load($fname);
+ if ($this->isloaded) {
+ $this->filename = $fname;
+ $this->processPath();
+ $this->is_html=true;
+ }
+ return $this->on_load();
+ }
+
+
+ public function loadString($content){
+
+ $this->doc = new DOMDocument("1.0",$this->charset);
+ $content = '<virtualtag>'.$content.'</virtualtag>';
+ $this->doc->loadXML($content);
+
+ return true;
+
+ }
+
+ public function save() {
+ $this->saveTo($this->filename);
+ }
+
+ public function saveTo($fname) {
+ $status = false;
+ if ($this->on_save()) {
+ if ($this->is_html) {
+ $this->doc->saveHTMLFile($fname);
+ } else {
+ $this->doc->save($fname);
+ }
+ $this->filename = $fname;
+ $this->processPath();
+ $status = true;
+ }
+ return $status;
+ }
+
+ public function validate() {
+ return $this->doc->validate();
+ }
+
+ public function attributeValue($path,$attrname,$node=null) {
+ $this->chkxpath();
+ $result = null;
+ $resultlist = null;
+ if (is_null($node)) {
+ $resultlist = $this->dxpath->query($path);
+ } else {
+ $resultlist = $this->dxpath->query($path,$node);
+ }
+ if ( is_object($resultlist) &&
+ ($resultlist->length > 0) &&
+ $resultlist->item(0)->hasAttribute($attrname)){
+ $result = $resultlist->item(0)->getAttribute($attrname);
+ }
+ return $result;
+ }
+
+// public function nodeValue($path,$count = 1,$node=null){
+// $nd = $this->node($path,$count,$node);
+// return $this->nodeTextValue($nd);
+// }
+
+ /**
+ *
+ * Get's text value of the node based on xpath query
+ * @param string $path
+ * @param DOMNode $node
+ * @param int $count
+ * @return string
+ */
+ public function nodeValue($path, $node = null, $count = 1){
+ $nd = $this->node($path,$count,$node);
+ return $this->nodeTextValue($nd);
+ }
+
+ /**
+ *
+ * Get's text value of the node
+ * @param DOMNode $node
+ * @return string
+ */
+ public function nodeTextValue($node){
+ $result = '';
+ if (is_object($node)) {
+ if ($node->hasChildNodes()) {
+ $chnodesList = $node->childNodes;
+ $types = array(XML_TEXT_NODE, XML_CDATA_SECTION_NODE);
+ foreach ($chnodesList as $chnode) {
+ if (in_array($chnode->nodeType, $types)){
+ $result .= $chnode->wholeText;
+ }
+ }
+ }
+ }
+ return $result;
+ }
+
+ /**
+ *
+ * Enter description here ...
+ * @param string $path
+ * @param int $count
+ * @param DOMNode $nd
+ * @return DOMNode
+ */
+ public function node($path, $count = 1, $nd=null) {
+ $result = null;
+ $resultlist = $this->nodeList($path,$nd);
+ if ( is_object($resultlist) &&
+ ($resultlist->length > 0) ){
+ $result = $resultlist->item($count -1);
+ }
+ return $result;
+ }
+
+ /**
+ *
+ * Enter description here ...
+ * @param string $path
+ * @param DOMNode $node
+ * @return DOMNodeList
+ */
+ public function nodeList($path,$node=null){
+
+ $this->chkxpath();
+
+ $resultlist = null;
+ if (is_null($node)) {
+ $resultlist = $this->dxpath->query($path);
+ } else {
+ $resultlist = $this->dxpath->query($path,$node);
+ }
+ return $resultlist;
+ }
+
+ /**
+ *
+ * Create new attribute
+ * @param string $namespace
+ * @param string $name
+ * @param string $value
+ * @return DOMAttr
+ */
+ public function create_attribute_ns($namespace, $name, $value = null) {
+ $result = $this->doc->createAttributeNS($namespace, $name);
+ if (!empty($value)) {
+ $result->nodeValue = $value;
+ }
+ return $result;
+ }
+
+ /**
+ *
+ * Create new attribute
+ * @param string $name
+ * @param string $value
+ * @return DOMAttr
+ */
+ public function create_attribute($name, $value = null) {
+ $result = $this->doc->createAttribute($name);
+ if (!empty($value)) {
+ $result->nodeValue = $value;
+ }
+ return $result;
+ }
+
+ /**
+ *
+ * Adds new node
+ * @param DOMNode $parentnode
+ * @param string $namespace
+ * @param string $name
+ * @param string $value
+ * @return DOMNode
+ */
+ public function append_new_element_ns(DOMNode &$parentnode, $namespace, $name, $value = null) {
+ $newnode = null;
+ if (empty($value)) {
+ $newnode = $this->doc->createElementNS($namespace, $name);
+ } else {
+ $newnode = $this->doc->createElementNS($namespace, $name, $value);
+ }
+ return $parentnode->appendChild($newnode);
+ }
+
+ /**
+ *
+ * Adds new node
+ * @param DOMNode $parentnode
+ * @param string $name
+ * @param string $value
+ * @return DOMNode
+ */
+ public function append_new_element(DOMNode &$parentnode, $name, $value = null) {
+ $newnode = null;
+ if (empty($value)) {
+ $newnode = $this->doc->createElement($name);
+ } else {
+ $newnode = $this->doc->createElement($name, $value);
+ }
+ return $parentnode->appendChild($newnode);
+ }
+
+ /**
+ *
+ * Adds new attribute
+ * @param DOMNode $node
+ * @param string $name
+ * @param string $value
+ * @return DOMNode
+ */
+ public function append_new_attribute(DOMNode &$node, $name, $value = null) {
+ return $node->appendChild($this->create_attribute($name, $value));
+ }
+
+ /**
+ *
+ * Adds new attribute
+ * @param DOMNode $node
+ * @param string $namespace
+ * @param string $name
+ * @param string $value
+ * @return DOMNode
+ */
+ public function append_new_attribute_ns(DOMNode &$node, $namespace, $name, $value = null) {
+ return $node->appendChild($this->create_attribute_ns($namespace, $name, $value));
+ }
+
+ public function fileName() {return $this->filename;}
+ public function filePath() {return $this->filepath;}
+
+ protected function on_load() {return $this->isloaded;}
+ protected function on_save() {return true;}
+ protected function on_create() {return true;}
+
+ public function resetXpath() {
+ $this->dxpath = null;
+ $this->chkxpath();
+ }
+
+ private function chkxpath() {
+ if (!isset($this->dxpath) || is_null($this->dxpath)){
+ $this->dxpath = new DOMXPath($this->doc);
+ foreach ($this->arrayPrefixNS as $nskey => $nsuri) {
+ $this->dxpath->registerNamespace($nskey,$nsuri);
+ }
+ }
+ }
+
+ private function processPath(){
+ $path_parts = pathinfo($this->filename);
+ $this->filepath = array_key_exists('dirname',$path_parts) ? $path_parts['dirname']."/" : '';
+ }
+}
* @package moodlecore
* @subpackage backup-imscc
* @copyright 2009 Mauro Rondinelli (mauro.rondinelli [AT] uvcms.com)
+ * @copyright 2011 Darko Miletic (dmiletic@moodlerooms.com)
* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
*/
}
}
- private function get_all_files () {
+ protected function get_all_files () {
$all_files = array();
$xpath = cc2moodle::newx_path(cc2moodle::$manifest, cc2moodle::$namespaces);
- $types = array('associatedcontent/imscc_xmlv1p0/learning-application-resource',
- 'webcontent',
- );
-
- foreach ($types as $type) {
+ foreach (cc2moodle::$restypes as $type) {
$files = $xpath->query('/imscc:manifest/imscc:resources/imscc:resource[@type="' . $type . '"]/imscc:file/@href');
- if (!empty($files)) {
+ if (!empty($files) && ($files->length > 0)) {
foreach ($files as $file) {
$all_files[] = $file;
}
--- /dev/null
+<?php
+// This file is part of Moodle - http://moodle.org/
+//
+// Moodle is free software: you can redistribute it and/or modify
+// it under the terms of the GNU General Public License as published by
+// the Free Software Foundation, either version 3 of the License, or
+// (at your option) any later version.
+//
+// Moodle is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+// GNU General Public License for more details.
+//
+// You should have received a copy of the GNU General Public License
+// along with Moodle. If not, see <http://www.gnu.org/licenses/>.
+/**
+ * @package moodlecore
+ * @subpackage backup-imscc
+ * @copyright 2011 Darko Miletic (dmiletic@moodlerooms.com)
+ * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
+ */
+
+defined('MOODLE_INTERNAL') or die('Direct access to this script is forbidden.');
+
+require_once($CFG->dirroot . '/backup/cc/entities.class.php');
+
+class entities11 extends entities {
+
+ public function get_external_xml($identifier) {
+ $xpath = cc2moodle::newx_path(cc112moodle::$manifest, cc112moodle::$namespaces);
+ $files = $xpath->query('/imscc:manifest/imscc:resources/imscc:resource[@identifier="' .
+ $identifier . '"]/imscc:file/@href');
+ $response = empty($files) || ($files->length == 0) ? '' : $files->item(0)->nodeValue;
+ return $response;
+ }
+
+ protected function get_all_files () {
+ $all_files = array();
+ $xpath = cc2moodle::newx_path(cc112moodle::$manifest, cc112moodle::$namespaces);
+ foreach (cc112moodle::$restypes as $type) {
+ $files = $xpath->query('/imscc:manifest/imscc:resources/imscc:resource[@type="' .
+ $type . '"]/imscc:file/@href');
+ if (empty($files) || ($files->length == 0)) {
+ continue;
+ }
+ foreach ($files as $file) {
+ $all_files[] = $file;
+ }
+ unset($files);
+ }
+
+ $all_files = empty($all_files) ? '' : $all_files;
+
+ return $all_files;
+ }
+
+}
+
* @package moodlecore
* @subpackage backup-imscc
* @copyright 2009 Mauro Rondinelli (mauro.rondinelli [AT] uvcms.com)
+ * @copyright 2011 Darko Miletic (dmiletic@moodlerooms.com)
* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
*/
defined('MOODLE_INTERNAL') or die('Direct access to this script is forbidden.');
-class forum extends entities {
+class cc_forum extends entities {
+
+ public function full_path ($path, $dir_sep = DIRECTORY_SEPARATOR) {
+
+ $token = '$IMS-CC-FILEBASE$';
+ $path = str_replace($token, '', $path);
+
+ if (is_string($path) && ($path != '')) {
+ $dir_sep;
+ $dot_dir = '.';
+ $up_dir = '..';
+ $length = strlen($path);
+ $rtemp = trim($path);
+ $start = strrpos($path, $dir_sep);
+ $can_continue = ($start !== false);
+ $result = $can_continue ? '' : $path;
+ $rcount = 0;
+
+ while ($can_continue) {
+
+ $dir_part = ($start !== false) ? substr($rtemp, $start + 1, $length - $start) : $rtemp;
+ $can_continue = ($dir_part !== false);
+
+ if ($can_continue) {
+ if ($dir_part != $dot_dir) {
+ if ($dir_part == $up_dir) {
+ $rcount++;
+ } else {
+ if ($rcount > 0) {
+ $rcount --;
+ } else {
+ $result = ($result == '') ? $dir_part : $dir_part . $dir_sep . $result;
+ }
+ }
+ }
+ $rtemp = substr($path, 0, $start);
+ $start = strrpos($rtemp, $dir_sep);
+ $can_continue = (($start !== false) || (strlen($rtemp) > 0));
+ }
+ }
+ }
+
+ return $result;
+ }
public function generate_node () {
$topic_data = $this->get_topic_data($instance);
+ $result = '';
if (!empty($topic_data)) {
$find_tags = array('[#mod_instance#]',
'[#date_now#]');
$replace_values = array($instance['instance'],
- $instance['title'] . ' - ' . $topic_data['title'],
- $topic_data['description'],
+ //To be more true to the actual forum name we use only forum title
+ htmlentities($topic_data['title']),
+ htmlentities($topic_data['description']),
time());
- return str_replace($find_tags, $replace_values, $sheet_mod_forum);
+ $result = str_replace($find_tags, $replace_values, $sheet_mod_forum);
- } else {
- return '';
}
+
+ return $result;
}
public function get_topic_data ($instance) {
$topic_data = '';
- $namespaces = array('dt' => 'http://www.imsglobal.org/xsd/imsdt_v1p0');
-
$topic_file = $this->get_external_xml($instance['resource_indentifier']);
if (!empty($topic_file)) {
- $topic = $this->load_xml_resource(cc2moodle::$path_to_manifest_folder . DIRECTORY_SEPARATOR . $topic_file);
+ $topic_file_path = cc2moodle::$path_to_manifest_folder . DIRECTORY_SEPARATOR . $topic_file;
+ $topic_file_dir = dirname($topic_file_path);
+ $topic = $this->load_xml_resource($topic_file_path);
if (!empty($topic)) {
- $xpath = cc2moodle::newx_path($topic, $namespaces);
+ $xpath = cc2moodle::newx_path($topic, cc2moodle::getforumns());
$topic_title = $xpath->query('/dt:topic/title');
- $topic_title = !empty($topic_title->item(0)->nodeValue) ? $topic_title->item(0)->nodeValue : '';
+ $topic_title = !empty($topic_title->item(0)->nodeValue) ? $topic_title->item(0)->nodeValue : 'Untitled Topic';
$topic_text = $xpath->query('/dt:topic/text');
$topic_text = !empty($topic_text->item(0)->nodeValue) ? $this->update_sources($topic_text->item(0)->nodeValue, dirname($topic_file)) : '';
$attachment_html = '';
foreach ($topic_attachments as $file) {
- $attachment_html .= $this->generate_attachment_html($file->nodeValue);
+ $attachment_html .= $this->generate_attachment_html($this->full_path($file->nodeValue,'/'));
}
$topic_data['description'] = !empty($attachment_html) ? $topic_text . '<p>Attachments:</p>' . $attachment_html : $topic_text;
defined('MOODLE_INTERNAL') or die('Direct access to this script is forbidden.');
-class label extends entities {
+class cc_label extends entities {
public function generate_node () {
'[#mod_name#]',
'[#mod_content#]',
'[#date_now#]');
-
+ //$instance['title']
$replace_values = array($instance['instance'],
- $instance['title'],
- $instance['title'],
+ 'Untitled',
+ 'Untitled',
time());
return str_replace($find_tags, $replace_values, $sheet_mod_label);
* @package moodlecore
* @subpackage backup-imscc
* @copyright 2009 Mauro Rondinelli (mauro.rondinelli [AT] uvcms.com)
+ * @copyright 2011 Darko Miletic (dmiletic@moodlerooms.com)
* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
*/
defined('MOODLE_INTERNAL') or die('Direct access to this script is forbidden.');
-class quiz extends entities {
-
- private $namespaces = array('xmlns' => 'http://www.imsglobal.org/xsd/ims_qtiasiv1p2');
+class cc_quiz extends entities {
public function generate_node_question_categories () {
'[#node_questions_feedback#]');
$replace_values = array($instance['id'],
- $instance['title'],
- $instance['title'],
- $quiz_stamp,
- $questions_strings,
+ htmlentities($instance['title']),
+ htmlentities($instance['title']),
+ htmlentities($quiz_stamp),
+ htmlentities($questions_strings),
time(),
$instance['options']['max_attempts'],
$instance['options']['timelimit'],
$node_course_modules_quiz_question_instances,
- $node_course_modules_quiz_feedback);
+ $node_course_modules_quiz_feedback); //this one has tags
$node_question_mod = str_replace($find_tags, $replace_values, $sheet_question_mod);
private function get_global_config ($assessment, $option, $default_value, $replace_values = '') {
- $xpath = cc2moodle::newx_path($assessment, $this->namespaces);
+ $xpath = cc2moodle::newx_path($assessment, cc2moodle::getquizns());
$metadata = $xpath->query('/xmlns:questestinterop/xmlns:assessment/xmlns:qtimetadata/xmlns:qtimetadatafield');
foreach ($metadata as $field) {
$quiz_stamp = 'localhost+' . time() . '+' . $this->generate_random_string(6);
$replace_values = array($instance['id'],
- $instance['title'],
+ htmlentities($instance['title']),
$quiz_stamp,
$node_course_question_categories_questions);
$question_type_node = ($question_moodle_type == MOODLE_QUIZ_SHORTANSWER) ? $this->create_node_course_question_categories_question_category_question_shortanswer($question) : $question_type_node;
$replace_values = array($question['id'],
- $this->truncate_text($question['title'], 255, true),
- $question['title'],
+ htmlentities($this->truncate_text($question['title'], 255, true)),
+ htmlentities($question['title']),
$question_moodle_type,
- $question['feedback'],
+ htmlentities($question['feedback']),
time(),
$question_type_node,
$quiz_stamp,
$questions = array();
- $xpath = cc2moodle::newx_path($assessment, $this->namespaces);
+ $xpath = cc2moodle::newx_path($assessment, cc2moodle::getquizns());
if (!$is_question_bank) {
$questions_items = $xpath->query('/xmlns:questestinterop/xmlns:assessment/xmlns:section/xmlns:item');
private function get_general_feedback ($assessment, $question_identifier) {
- $xpath = cc2moodle::newx_path($assessment, $this->namespaces);
+ $xpath = cc2moodle::newx_path($assessment, cc2moodle::getquizns());
$respconditions = $xpath->query('//xmlns:item[@ident="' . $question_identifier . '"]/xmlns:resprocessing/xmlns:respcondition');
private function get_feedback ($assessment, $identifier, $item_identifier, $question_type) {
- $xpath = cc2moodle::newx_path($assessment, $this->namespaces);
+ $xpath = cc2moodle::newx_path($assessment, cc2moodle::getquizns());
$resource_processing = $xpath->query('//xmlns:item[@ident="' . $item_identifier . '"]/xmlns:resprocessing/xmlns:respcondition');
private function get_answers_fib ($question_identifier, $identifier, $assessment, &$last_answer_id) {
- $xpath = cc2moodle::newx_path($assessment, $this->namespaces);
+ $xpath = cc2moodle::newx_path($assessment, cc2moodle::getquizns());
$answers_fib = array();
private function get_answers_pattern_match ($question_identifier, $identifier, $assessment, &$last_answer_id) {
- $xpath = cc2moodle::newx_path($assessment, $this->namespaces);
+ $xpath = cc2moodle::newx_path($assessment, cc2moodle::getquizns());
$answers_fib = array();
private function get_answers ($identifier, $assessment, &$last_answer_id) {
- $xpath = cc2moodle::newx_path($assessment, $this->namespaces);
+ $xpath = cc2moodle::newx_path($assessment, cc2moodle::getquizns());
$answers = array();
private function get_score ($assessment, $identifier, $question_identifier) {
- $xpath = cc2moodle::newx_path($assessment, $this->namespaces);
+ $xpath = cc2moodle::newx_path($assessment, cc2moodle::getquizns());
$resource_processing = $xpath->query('//xmlns:item[@ident="' . $question_identifier . '"]/xmlns:resprocessing/xmlns:respcondition');
'[#is_single#]');
$replace_values = array($node_course_question_categories_question_answer,
- $answer_string,
+ htmlentities($answer_string),
$is_single);
$node_question_categories_question = str_replace($find_tags, $replace_values, $sheet_question_categories_question);
'[#use_case#]',
'[#node_course_question_categories_question_category_question_answer#]');
- $replace_values = array($answers_string,
- $use_case,
+ $replace_values = array(htmlentities($answers_string),
+ htmlentities($use_case),
$node_course_question_categories_question_answer);
'[#false_answer_id#]');
$replace_values = array($node_course_question_categories_question_answer,
- $true_answer_id,
+ htmlentities($true_answer_id),
$false_answer_id);
$node_question_categories_question = str_replace($find_tags, $replace_values, $sheet_question_categories_question);
'[#answer_feedback#]');
$replace_values = array($answer['id'],
- $answer['title'],
+ htmlentities($answer['title']),
$answer['score'],
$answer['feedback']);
private function get_question_type ($identifier, $assessment) {
- $xpath = cc2moodle::newx_path($assessment, $this->namespaces);
+ $xpath = cc2moodle::newx_path($assessment, cc2moodle::getquizns());
$metadata = $xpath->query('//xmlns:item[@ident="' . $identifier . '"]/xmlns:itemmetadata/xmlns:qtimetadata/xmlns:qtimetadatafield');
* @package moodlecore
* @subpackage backup-imscc
* @copyright 2009 Mauro Rondinelli (mauro.rondinelli [AT] uvcms.com)
+ * @copyright 2011 Darko Miletic (dmiletic@moodlerooms.com)
* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
*/
defined('MOODLE_INTERNAL') or die('Direct access to this script is forbidden.');
-class resource extends entities {
-
- private $namespaces = array('wl' => 'http://www.imsglobal.org/xsd/imswl_v1p0');
+class cc_resource extends entities {
public function generate_node () {
private function create_node_course_modules_mod_resource ($sheet_mod_resource, $instance) {
$link = '';
- $xpath = cc2moodle::newx_path(CC2Moodle::$manifest, CC2Moodle::$namespaces);
+ $xpath = cc2moodle::newx_path(cc2moodle::$manifest, cc2moodle::$namespaces);
- if ($instance['common_cartriedge_type'] == CC_TYPE_WEBCONTENT || $instance['common_cartriedge_type'] == CC_TYPE_ASSOCIATED_CONTENT) {
+ if ($instance['common_cartriedge_type'] == cc2moodle::CC_TYPE_WEBCONTENT || $instance['common_cartriedge_type'] == cc2moodle::CC_TYPE_ASSOCIATED_CONTENT) {
$resource = $xpath->query('/imscc:manifest/imscc:resources/imscc:resource[@identifier="' . $instance['resource_indentifier'] . '"]/@href');
$resource = !empty($resource->item(0)->nodeValue) ? $resource->item(0)->nodeValue : '';
}
}
- if ($instance['common_cartriedge_type'] == CC_TYPE_WEBLINK) {
+ if ($instance['common_cartriedge_type'] == cc2moodle::CC_TYPE_WEBLINK) {
$external_resource = $xpath->query('/imscc:manifest/imscc:resources/imscc:resource[@identifier="' . $instance['resource_indentifier'] . '"]/imscc:file/@href')->item(0)->nodeValue;
$resource = $this->load_xml_resource(cc2moodle::$path_to_manifest_folder . DIRECTORY_SEPARATOR . $external_resource);
if (!empty($resource)) {
- $xpath = cc2moodle::newx_path($resource, $this->namespaces);
- $resource = $xpath->query('/wl:webLink/url/@href');
- $link = $resource->item(0)->nodeValue;
+ $xpath = cc2moodle::newx_path($resource, cc2moodle::getresourcens());
+ $resource = $xpath->query('/wl:webLink/wl:url/@href');
+ if ($resource->length > 0) {
+ $link = $resource->item(0)->nodeValue;
+ }
}
}
}
'[#date_now#]');
$replace_values = array($instance['instance'],
- $instance['title'],
+ htmlentities($instance['title']),
'file',
- $link,
+ htmlentities($link),
'',
'',
time());
--- /dev/null
+<?php
+
+// This file is part of Moodle - http://moodle.org/
+//
+// Moodle is free software: you can redistribute it and/or modify
+// it under the terms of the GNU General Public License as published by
+// the Free Software Foundation, either version 3 of the License, or
+// (at your option) any later version.
+//
+// Moodle is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+// GNU General Public License for more details.
+//
+// You should have received a copy of the GNU General Public License
+// along with Moodle. If not, see <http://www.gnu.org/licenses/>.
+/**
+ * @package moodlecore
+ * @subpackage backup-imscc
+ * @copyright 2011 Darko Miletic (dmiletic@moodlerooms.com)
+ * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
+ */
+
+defined('MOODLE_INTERNAL') or die('Direct access to this script is forbidden.');
+
+class cc11_basiclti extends entities11 {
+
+ public function generate_node () {
+
+ cc2moodle::log_action('Creating BasicLTI mods');
+
+ $response = '';
+
+ if (!empty(cc2moodle::$instances['instances'][MOODLE_TYPE_BASICLTI])) {
+ foreach (cc2moodle::$instances['instances'][MOODLE_TYPE_BASICLTI] as $instance) {
+ $response .= $this->create_node_course_modules_mod_basiclti($instance);
+ }
+ }
+
+ return $response;
+ }
+
+ private function create_node_course_modules_mod_basiclti ($instance) {
+
+ $sheet_mod_basiclti = cc112moodle::loadsheet(SHEET_COURSE_SECTIONS_SECTION_MODS_MOD_BASICLTI);
+
+ $topic_data = $this->get_basiclti_data($instance);
+
+ $result = '';
+ if (!empty($topic_data)) {
+
+ $find_tags = array('[#mod_instance#]' ,
+ '[#mod_basiclti_name#]' ,
+ '[#mod_basiclti_intro#]' ,
+ '[#mod_basiclti_timec#]' ,
+ '[#mod_basiclti_timem#]' ,
+ '[#mod_basiclti_toolurl#]',
+ '[#mod_basiclti_orgid#]' ,
+ '[#mod_basiclti_orgurl#]' ,
+ '[#mod_basiclti_orgdesc#]'
+ );
+
+ $replace_values = array($instance['instance'],
+ $topic_data['title'],
+ $topic_data['description'],
+ time(),time(),
+ $topic_data['launchurl'],
+ $topic_data['orgid'],
+ $topic_data['orgurl'],
+ $topic_data['orgdesc']
+ );
+
+ $result = str_replace($find_tags, $replace_values, $sheet_mod_basiclti);
+
+ }
+
+ return $result;
+ }
+
+ protected function getValue($node, $default = '') {
+ $result = $default;
+ if (is_object($node) && ($node->length > 0) && !empty($node->item(0)->nodeValue)) {
+ $result = htmlentities(trim($node->item(0)->nodeValue));
+ }
+ return $result;
+ }
+
+ public function get_basiclti_data($instance) {
+
+ $topic_data = '';
+
+ $basiclti_file = $this->get_external_xml($instance['resource_indentifier']);
+
+ if (!empty($basiclti_file)) {
+ $basiclti_file_path = cc2moodle::$path_to_manifest_folder . DIRECTORY_SEPARATOR . $basiclti_file;
+ $basiclti_file_dir = dirname($basiclti_file_path);
+ $basiclti = $this->load_xml_resource($basiclti_file_path);
+ if (!empty($basiclti)) {
+ $xpath = cc2moodle::newx_path($basiclti, cc112moodle::$basicltins);
+ $topic_title = $this->getValue($xpath->query('/xmlns:cartridge_basiclti_link/blti:title'),'Untitled');
+ $blti_description = $this->getValue($xpath->query('/xmlns:cartridge_basiclti_link/blti:description'));
+ $launch_url = $this->getValue($xpath->query('/xmlns:cartridge_basiclti_link/blti:launch_url'));
+ $tool_raw = $this->getValue($xpath->query('/xmlns:cartridge_basiclti_link/blti:vendor/lticp:code'),null);
+ $tool_url = $this->getValue($xpath->query('/xmlns:cartridge_basiclti_link/blti:vendor/lticp:url'),null);
+ $tool_desc = $this->getValue($xpath->query('/xmlns:cartridge_basiclti_link/blti:vendor/lticp:description'),null);
+ $topic_data['title' ] = $topic_title;
+ $topic_data['description'] = $blti_description;
+ $topic_data['launchurl' ] = $launch_url;
+ $topic_data['orgid' ] = $tool_raw;
+ $topic_data['orgurl' ] = $tool_url;
+ $topic_data['orgdesc' ] = $tool_desc;
+ }
+ }
+
+ return $topic_data;
+ }
+
+}
+
--- /dev/null
+<?php
+// This file is part of Moodle - http://moodle.org/
+//
+// Moodle is free software: you can redistribute it and/or modify
+// it under the terms of the GNU General Public License as published by
+// the Free Software Foundation, either version 3 of the License, or
+// (at your option) any later version.
+//
+// Moodle is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+// GNU General Public License for more details.
+//
+// You should have received a copy of the GNU General Public License
+// along with Moodle. If not, see <http://www.gnu.org/licenses/>.
+/**
+ * @package moodlecore
+ * @subpackage backup-imscc
+ * @copyright 2011 Darko Miletic (dmiletic@moodlerooms.com)
+ * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
+ */
+
+defined('MOODLE_INTERNAL') or die('Direct access to this script is forbidden.');
+
+class cc11_forum extends entities11 {
+
+ public function full_path ($path, $dir_sep = DIRECTORY_SEPARATOR) {
+
+ $token = '$IMS-CC-FILEBASE$';
+ $path = str_replace($token, '', $path);
+
+ if (is_string($path) && ($path != '')) {
+ $dir_sep;
+ $dot_dir = '.';
+ $up_dir = '..';
+ $length = strlen($path);
+ $rtemp = trim($path);
+ $start = strrpos($path, $dir_sep);
+ $can_continue = ($start !== false);
+ $result = $can_continue ? '' : $path;
+ $rcount = 0;
+
+ while ($can_continue) {
+
+ $dir_part = ($start !== false) ? substr($rtemp, $start + 1, $length - $start) : $rtemp;
+ $can_continue = ($dir_part !== false);
+
+ if ($can_continue) {
+ if ($dir_part != $dot_dir) {
+ if ($dir_part == $up_dir) {
+ $rcount++;
+ } else {
+ if ($rcount > 0) {
+ $rcount --;
+ } else {
+ $result = ($result == '') ? $dir_part : $dir_part . $dir_sep . $result;
+ }
+ }
+ }
+ $rtemp = substr($path, 0, $start);
+ $start = strrpos($rtemp, $dir_sep);
+ $can_continue = (($start !== false) || (strlen($rtemp) > 0));
+ }
+ }
+ }
+
+ return $result;
+ }
+
+ public function generate_node () {
+
+ cc2moodle::log_action('Creating Forum mods');
+
+ $response = '';
+
+ if (!empty(cc2moodle::$instances['instances'][MOODLE_TYPE_FORUM])) {
+ foreach (cc2moodle::$instances['instances'][MOODLE_TYPE_FORUM] as $instance) {
+ $response .= $this->create_node_course_modules_mod_forum($instance);
+ }
+ }
+
+ return $response;
+ }
+
+ private function create_node_course_modules_mod_forum ($instance) {
+
+ $sheet_mod_forum = cc112moodle::loadsheet(SHEET_COURSE_SECTIONS_SECTION_MODS_MOD_FORUM);
+
+ $topic_data = $this->get_topic_data($instance);
+
+ $result = '';
+ if (!empty($topic_data)) {
+
+ $find_tags = array('[#mod_instance#]',
+ '[#mod_forum_title#]',
+ '[#mod_forum_intro#]',
+ '[#date_now#]');
+
+ $replace_values = array($instance['instance'],
+ //To be more true to the actual forum name we use only forum title
+ htmlentities($topic_data['title']),
+ htmlentities($topic_data['description']),
+ time());
+
+ $result = str_replace($find_tags, $replace_values, $sheet_mod_forum);
+
+ }
+
+ return $result;
+ }
+
+ public function get_topic_data ($instance) {
+
+ $topic_data = '';
+
+ $topic_file = $this->get_external_xml($instance['resource_indentifier']);
+
+ if (!empty($topic_file)) {
+
+ $topic_file_path = cc2moodle::$path_to_manifest_folder . DIRECTORY_SEPARATOR . $topic_file;
+ $topic_file_dir = dirname($topic_file_path);
+ $topic = $this->load_xml_resource($topic_file_path);
+
+ if (!empty($topic)) {
+
+ $xpath = cc2moodle::newx_path($topic, cc112moodle::$forumns);
+
+ $topic_title = $xpath->query('/dt:topic/dt:title');
+ if ($topic_title->length > 0 && !empty($topic_title->item(0)->nodeValue)) {
+ $topic_title = $topic_title->item(0)->nodeValue;
+ } else {
+ $topic_title = 'Untitled Topic';
+ }
+
+ $topic_text = $xpath->query('/dt:topic/dt:text');
+ $topic_text = !empty($topic_text->item(0)->nodeValue) ? $this->update_sources($topic_text->item(0)->nodeValue, dirname($topic_file)) : '';
+ $topic_text = !empty($topic_text) ? str_replace("%24", "\$", $this->include_titles($topic_text)) : '';
+
+ if (!empty($topic_title)) {
+ $topic_data['title'] = $topic_title;
+ $topic_data['description'] = $topic_text;
+ }
+ }
+
+ $topic_attachments = $xpath->query('/dt:topic/dt:attachments/dt:attachment/@href');
+
+ if ($topic_attachments->length > 0) {
+
+ $attachment_html = '';
+
+ foreach ($topic_attachments as $file) {
+ $attachment_html .= $this->generate_attachment_html($this->full_path($file->nodeValue,'/'));
+ }
+
+ $topic_data['description'] = !empty($attachment_html) ? $topic_text . '<p>Attachments:</p>' . $attachment_html : $topic_text;
+ }
+ }
+
+ return $topic_data;
+ }
+
+ private function generate_attachment_html ($filename) {
+
+ $images_extensions = array('gif' , 'jpeg' , 'jpg' , 'jif' , 'jfif' , 'png' , 'bmp');
+
+ $fileinfo = pathinfo($filename);
+
+ if (in_array($fileinfo['extension'], $images_extensions)) {
+ return '<img src="$@FILEPHP@$/' . $filename . '" title="' . $fileinfo['basename'] . '" alt="' . $fileinfo['basename'] . '" /><br />';
+ } else {
+ return '<a href="$@FILEPHP@$/' . $filename . '" title="' . $fileinfo['basename'] . '" alt="' . $fileinfo['basename'] . '">' . $fileinfo['basename'] . '</a><br />';
+ }
+
+ return '';
+ }
+}
+
--- /dev/null
+<?php
+// This file is part of Moodle - http://moodle.org/
+//
+// Moodle is free software: you can redistribute it and/or modify
+// it under the terms of the GNU General Public License as published by
+// the Free Software Foundation, either version 3 of the License, or
+// (at your option) any later version.
+//
+// Moodle is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+// GNU General Public License for more details.
+//
+// You should have received a copy of the GNU General Public License
+// along with Moodle. If not, see <http://www.gnu.org/licenses/>.
+/**
+ * @package moodlecore
+ * @subpackage backup-imscc
+ * @copyright 2011 Darko Miletic (dmiletic@moodlerooms.com)
+ * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
+ */
+
+defined('MOODLE_INTERNAL') or die('Direct access to this script is forbidden.');
+
+class cc11_lti extends entities11 {
+
+ public function generate_node () {
+
+ cc2moodle::log_action('Creating BasicLTI mods');
+
+ $response = '';
+
+ if (!empty(cc2moodle::$instances['instances'][MOODLE_TYPE_LTI])) {
+ foreach (cc2moodle::$instances['instances'][MOODLE_TYPE_LTI] as $instance) {
+ $response .= $this->create_node_course_modules_mod_basiclti($instance);
+ }
+ }
+
+ return $response;
+ }
+
+ private function create_node_course_modules_mod_basiclti ($instance) {
+
+ $sheet_mod_basiclti = cc112moodle::loadsheet(SHEET_COURSE_SECTIONS_SECTION_MODS_MOD_LTI);
+
+ $topic_data = $this->get_basiclti_data($instance);
+
+ $result = '';
+ if (!empty($topic_data)) {
+
+ $find_tags = array('[#mod_instance#]' ,
+ '[#mod_basiclti_name#]' ,
+ '[#mod_basiclti_intro#]' ,
+ '[#mod_basiclti_timec#]' ,
+ '[#mod_basiclti_timem#]' ,
+ '[#mod_basiclti_toolurl#]'
+ );
+
+ $replace_values = array($instance['instance'],
+ $topic_data['title'],
+ $topic_data['description'],
+ time(),time(),
+ $topic_data['launchurl']
+ );
+
+ $result = str_replace($find_tags, $replace_values, $sheet_mod_basiclti);
+
+ }
+
+ return $result;
+ }
+
+ protected function getValue($node, $default = '') {
+ $result = $default;
+ if (is_object($node) && ($node->length > 0) && !empty($node->item(0)->nodeValue)) {
+ $result = htmlentities(trim($node->item(0)->nodeValue));
+ }
+ return $result;
+ }
+
+ public function get_basiclti_data($instance) {
+
+ $topic_data = '';
+
+ $basiclti_file = $this->get_external_xml($instance['resource_indentifier']);
+
+ if (!empty($basiclti_file)) {
+ $basiclti_file_path = cc2moodle::$path_to_manifest_folder . DIRECTORY_SEPARATOR . $basiclti_file;
+ $basiclti_file_dir = dirname($basiclti_file_path);
+ $basiclti = $this->load_xml_resource($basiclti_file_path);
+ if (!empty($basiclti)) {
+ $xpath = cc2moodle::newx_path($basiclti, cc112moodle::$basicltins);
+ $topic_title = $this->getValue($xpath->query('/xmlns:cartridge_basiclti_link/blti:title'),'Untitled');
+ $blti_description = $this->getValue($xpath->query('/xmlns:cartridge_basiclti_link/blti:description'));
+ $launch_url = $this->getValue($xpath->query('/xmlns:cartridge_basiclti_link/blti:launch_url'));
+ $tool_raw = $this->getValue($xpath->query('/xmlns:cartridge_basiclti_link/blti:vendor/lticp:code'),null);
+ $tool_url = $this->getValue($xpath->query('/xmlns:cartridge_basiclti_link/blti:vendor/lticp:url'),null);
+ $tool_desc = $this->getValue($xpath->query('/xmlns:cartridge_basiclti_link/blti:vendor/lticp:description'),null);
+ $topic_data['title' ] = $topic_title;
+ $topic_data['description'] = $blti_description;
+ $topic_data['launchurl' ] = $launch_url;
+ $topic_data['orgid' ] = $tool_raw;
+ $topic_data['orgurl' ] = $tool_url;
+ $topic_data['orgdesc' ] = $tool_desc;
+ }
+ }
+
+ return $topic_data;
+ }
+
+}
+
--- /dev/null
+<?php
+// This file is part of Moodle - http://moodle.org/
+//
+// Moodle is free software: you can redistribute it and/or modify
+// it under the terms of the GNU General Public License as published by
+// the Free Software Foundation, either version 3 of the License, or
+// (at your option) any later version.
+//
+// Moodle is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+// GNU General Public License for more details.
+//
+// You should have received a copy of the GNU General Public License
+// along with Moodle. If not, see <http://www.gnu.org/licenses/>.
+/**
+ * @package moodlecore
+ * @subpackage backup-imscc
+ * @copyright 2009 Mauro Rondinelli (mauro.rondinelli [AT] uvcms.com)
+ * @copyright 2011 Darko Miletic <dmiletic@moodlerooms.com>
+ * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
+ */
+
+defined('MOODLE_INTERNAL') or die('Direct access to this script is forbidden.');
+
+class cc11_quiz extends entities11 {
+
+ public function generate_node_question_categories () {
+
+ $instances = $this->generate_instances();
+
+ $node_course_question_categories = $this->create_node_course_question_categories($instances);
+ $node_course_question_categories = empty($node_course_question_categories) ? '' : $node_course_question_categories;
+
+ return $node_course_question_categories;
+
+ }
+
+ public function generate_node_course_modules_mod () {
+
+ cc112moodle::log_action('Creating Quiz mods');
+
+ $node_course_modules_mod = '';
+ $instances = $this->generate_instances();
+
+ if (!empty($instances)) {
+ foreach ($instances as $instance) {
+ if ($instance['is_question_bank'] == 0) {
+ $node_course_modules_mod .= $this->create_node_course_modules_mod($instance);
+ }
+ }
+ }
+
+ return $node_course_modules_mod;
+
+ }
+
+ private function create_node_course_modules_mod_quiz_feedback () {
+
+ $sheet_question_mod_feedback = cc112moodle::loadsheet(SHEET_COURSE_SECTIONS_SECTION_MODS_MOD_QUIZ_FEEDBACK);
+
+ return $sheet_question_mod_feedback;
+ }
+
+ private function generate_instances () {
+
+ $last_instance_id = 0;
+ $last_question_id = 0;
+ $last_answer_id = 0;
+
+ $instances = '';
+
+ $types = array(MOODLE_TYPE_QUIZ, MOODLE_TYPE_QUESTION_BANK);
+
+ foreach ($types as $type) {
+
+ if (!empty(cc112moodle::$instances['instances'][$type])) {
+
+ foreach (cc112moodle::$instances['instances'][$type] as $instance) {
+
+ if ($type == MOODLE_TYPE_QUIZ) {
+ $is_question_bank = 0;
+ } else {
+ $is_question_bank = 1;
+ }
+
+ $assessment_file = $this->get_external_xml($instance['resource_indentifier']);
+
+ if (!empty($assessment_file)) {
+
+ $assessment = $this->load_xml_resource(cc112moodle::$path_to_manifest_folder . DIRECTORY_SEPARATOR . $assessment_file);
+
+ if (!empty($assessment)) {
+
+ $replace_values = array('unlimited' => 0);
+
+ $questions = $this->get_questions($assessment, $last_question_id, $last_answer_id, dirname($assessment_file), $is_question_bank);
+ $question_count = count($questions);
+
+ if (!empty($question_count)) {
+
+ $last_instance_id++;
+
+ $instances[$instance['resource_indentifier']]['questions'] = $questions;
+ $instances[$instance['resource_indentifier']]['id'] = $last_instance_id;
+ $instances[$instance['resource_indentifier']]['title'] = $instance['title'];
+ $instances[$instance['resource_indentifier']]['is_question_bank'] = $is_question_bank;
+ $instances[$instance['resource_indentifier']]['options']['timelimit'] = $this->get_global_config($assessment, 'qmd_timelimit', 0);
+ $instances[$instance['resource_indentifier']]['options']['max_attempts'] = $this->get_global_config($assessment, 'cc_maxattempts', 0, $replace_values);
+ }
+ }
+ }
+ }
+ }
+ }
+
+ return $instances;
+ }
+
+
+ private function create_node_course_modules_mod ($instance) {
+
+ $sheet_question_mod = cc112moodle::loadsheet(SHEET_COURSE_SECTIONS_SECTION_MODS_MOD_QUIZ);
+
+ $node_course_modules_quiz_question_instances = $this->create_node_course_modules_mod_quiz_question_instances($instance);
+ $node_course_modules_quiz_feedback = $this->create_node_course_modules_mod_quiz_feedback($instance);
+
+ $questions_strings = $this->get_questions_string($instance);
+ $quiz_stamp = 'localhost+' . time() . '+' . $this->generate_random_string(6);
+
+ $find_tags = array('[#mod_id#]',
+ '[#mod_name#]',
+ '[#mod_intro#]',
+ '[#mod_stamp#]',
+ '[#question_string#]',
+ '[#date_now#]',
+ '[#mod_max_attempts#]',
+ '[#mod_timelimit#]',
+ '[#node_question_instance#]',
+ '[#node_questions_feedback#]');
+
+ $replace_values = array($instance['id'],
+ htmlentities($instance['title']),
+ htmlentities($instance['title']),
+ htmlentities($quiz_stamp),
+ htmlentities($questions_strings),
+ time(),
+ $instance['options']['max_attempts'],
+ $instance['options']['timelimit'],
+ $node_course_modules_quiz_question_instances,
+ $node_course_modules_quiz_feedback); //this one has tags
+
+ $node_question_mod = str_replace($find_tags, $replace_values, $sheet_question_mod);
+
+ return $node_question_mod;
+ }
+
+ private function get_global_config ($assessment, $option, $default_value, $replace_values = '') {
+
+ $xpath = cc112moodle::newx_path($assessment, cc112moodle::getquizns());
+ $metadata = $xpath->query('/xmlns:questestinterop/xmlns:assessment/xmlns:qtimetadata/xmlns:qtimetadatafield');
+
+ foreach ($metadata as $field) {
+ $field_label = $xpath->query('xmlns:fieldlabel', $field);
+ $field_label = !empty($field_label->item(0)->nodeValue) ? $field_label->item(0)->nodeValue : '';
+
+ if (strtolower($field_label) == strtolower($option)) {
+ $field_entry = $xpath->query('xmlns:fieldentry', $field);
+ $response = !empty($field_entry->item(0)->nodeValue) ? $field_entry->item(0)->nodeValue : '';
+ }
+ }
+
+ $response = !empty($response) ? trim($response) : '';
+
+ if (!empty($replace_values)) {
+ foreach ($replace_values as $key => $value) {
+ $response = ($key == $response) ? $value : $response;
+ }
+ }
+
+ $response = empty($response) ? $default_value : $response;
+
+ return $response;
+ }
+
+ private function create_node_course_modules_mod_quiz_question_instances ($instance) {
+
+ $node_course_module_mod_quiz_questions_instances = '';
+ $sheet_question_mod_instance = cc112moodle::loadsheet(SHEET_COURSE_SECTIONS_SECTION_MODS_MOD_QUIZ_QUESTION_INSTANCE);
+
+ $find_tags = array('[#question_id#]' , '[#instance_id#]');
+
+ if (!empty($instance['questions'])) {
+
+ foreach ($instance['questions'] as $question) {
+ $replace_values = array($question['id'] , $question['id']);
+ $node_course_module_mod_quiz_questions_instances .= str_replace($find_tags, $replace_values, $sheet_question_mod_instance);
+ }
+
+ $node_course_module_mod_quiz_questions_instances = str_replace($find_tags, $replace_values, $node_course_module_mod_quiz_questions_instances);
+ }
+
+ return $node_course_module_mod_quiz_questions_instances;
+ }
+
+ private function get_questions_string ($instance) {
+
+ $questions_string = '';
+
+ if (!empty($instance['questions'])) {
+ foreach ($instance['questions'] as $question) {
+ $questions_string .= $question['id'] . ',';
+ }
+ }
+
+ $questions_string = !empty($questions_string) ? substr($questions_string, 0, strlen($questions_string) - 1) : '';
+
+ return $questions_string;
+ }
+
+ private function create_node_course_question_categories ($instances) {
+
+ $sheet_question_categories = cc112moodle::loadsheet(SHEET_COURSE_QUESTION_CATEGORIES);
+
+ if (!empty($instances)) {
+
+ $node_course_question_categories_question_category = '';
+
+ foreach ($instances as $instance) {
+ $node_course_question_categories_question_category .= $this->create_node_course_question_categories_question_category($instance);
+ }
+
+ $find_tags = array('[#node_course_question_categories_question_category#]');
+ $replace_values = array($node_course_question_categories_question_category);
+
+ $node_course_question_categories = str_replace($find_tags, $replace_values, $sheet_question_categories);
+ }
+
+ $node_course_question_categories = empty($node_course_question_categories) ? '' : $node_course_question_categories;
+
+ return $node_course_question_categories;
+ }
+
+ private function create_node_course_question_categories_question_category ($instance) {
+
+ $sheet_question_categories_quetion_category = cc112moodle::loadsheet(SHEET_COURSE_QUESTION_CATEGORIES_QUESTION_CATEGORY);
+
+ $find_tags = array('[#quiz_id#]',
+ '[#quiz_name#]',
+ '[#quiz_stamp#]',
+ '[#node_course_question_categories_question_category_questions#]');
+
+ $node_course_question_categories_questions = $this->create_node_course_question_categories_question_category_question($instance);
+ $node_course_question_categories_questions = empty($node_course_question_categories_questions) ? '' : $node_course_question_categories_questions;
+
+ $quiz_stamp = 'localhost+' . time() . '+' . $this->generate_random_string(6);
+
+ $replace_values = array($instance['id'],
+ htmlentities($instance['title']),
+ $quiz_stamp,
+ $node_course_question_categories_questions);
+
+ $node_question_categories = str_replace($find_tags, $replace_values, $sheet_question_categories_quetion_category);
+
+ return $node_question_categories;
+ }
+
+ private function create_node_course_question_categories_question_category_question ($instance) {
+
+ global $USER;
+
+ $node_course_question_categories_question = '';
+
+ $find_tags = array('[#question_id#]',
+ '[#question_title#]',
+ '[#question_text#]',
+ '[#question_type#]',
+ '[#question_general_feedback#]',
+ '[#date_now#]',
+ '[#question_type_nodes#]',
+ '[#question_stamp#]',
+ '[#question_version#]',
+ '[#logged_user#]');
+
+ $sheet_question_categories_question = cc112moodle::loadsheet(SHEET_COURSE_QUESTION_CATEGORIES_QUESTION_CATEGORY_QUESTION);
+
+ $questions = $instance['questions'];
+
+ if (!empty($questions)) {
+
+ foreach ($questions as $question) {
+
+ $quiz_stamp = 'localhost+' . time() . '+' . $this->generate_random_string(6);
+ $quiz_version = 'localhost+' . time() . '+' . $this->generate_random_string(6);
+
+ $question_moodle_type = $question['moodle_type'];
+ $question_cc_type = $question['cc_type'];
+
+ $question_type_node = '';
+
+ $question_type_node = ($question_moodle_type == MOODLE_QUIZ_MULTIPLE_CHOICE) ? $this->create_node_course_question_categories_question_category_question_multiple_choice($question) : $question_type_node;
+ $question_type_node = ($question_moodle_type == MOODLE_QUIZ_TRUE_FALSE) ? $this->create_node_course_question_categories_question_category_question_true_false($question) : $question_type_node;
+ $question_type_node = ($question_moodle_type == MOODLE_QUIZ_ESSAY) ? $this->create_node_course_question_categories_question_category_question_eesay($question) : $question_type_node;
+ $question_type_node = ($question_moodle_type == MOODLE_QUIZ_SHORTANSWER) ? $this->create_node_course_question_categories_question_category_question_shortanswer($question) : $question_type_node;
+
+ $replace_values = array($question['id'],
+ htmlentities($this->truncate_text($question['title'], 255, true)),
+ htmlentities($question['title']),
+ $question_moodle_type,
+ htmlentities($question['feedback']),
+ time(),
+ $question_type_node,
+ $quiz_stamp,
+ $quiz_version,
+ $USER->id);
+
+ $node_course_question_categories_question .= str_replace($find_tags, $replace_values, $sheet_question_categories_question);
+ }
+ }
+
+ $node_course_question_categories_question = empty($node_course_question_categories_question) ? '' : $node_course_question_categories_question;
+
+ return $node_course_question_categories_question;
+ }
+
+ private function get_questions ($assessment, &$last_question_id, &$last_answer_id, $root_path, $is_question_bank) {
+
+ $questions = array();
+
+ $xpath = cc112moodle::newx_path($assessment, cc112moodle::getquizns());
+
+ if (!$is_question_bank) {
+ $questions_items = $xpath->query('/xmlns:questestinterop/xmlns:assessment/xmlns:section/xmlns:item');
+ } else {
+ $questions_items = $xpath->query('/xmlns:questestinterop/xmlns:objectbank/xmlns:item');
+ }
+
+ foreach ($questions_items as $question_item) {
+
+ $count_questions = $xpath->evaluate('count(xmlns:presentation/xmlns:flow/xmlns:material/xmlns:mattext)', $question_item);
+
+ if ($count_questions == 0) {
+ $question_title = $xpath->query('xmlns:presentation/xmlns:material/xmlns:mattext', $question_item);
+ } else {
+ $question_title = $xpath->query('xmlns:presentation/xmlns:flow/xmlns:material/xmlns:mattext', $question_item);
+ }
+
+ $question_title = !empty($question_title->item(0)->nodeValue) ? $question_title->item(0)->nodeValue : '';
+
+ $question_identifier = $xpath->query('@ident', $question_item);
+ $question_identifier = !empty($question_identifier->item(0)->nodeValue) ? $question_identifier->item(0)->nodeValue : '';
+
+ if (!empty($question_identifier)) {
+
+ $question_type = $this->get_question_type($question_identifier, $assessment);
+
+ if (!empty($question_type['moodle'])) {
+
+ $last_question_id++;
+
+ $questions[$question_identifier]['id'] = $last_question_id;
+
+ $question_title = $this->update_sources($question_title, $root_path);
+ $question_title = !empty($question_title) ? str_replace("%24", "\$", $this->include_titles($question_title)) : '';
+
+ $questions[$question_identifier]['title'] = $question_title;
+ $questions[$question_identifier]['identifier'] = $question_identifier;
+ $questions[$question_identifier]['moodle_type'] = $question_type['moodle'];
+ $questions[$question_identifier]['cc_type'] = $question_type['cc'];
+ $questions[$question_identifier]['feedback'] = $this->get_general_feedback($assessment, $question_identifier);
+ $questions[$question_identifier]['answers'] = $this->get_answers($question_identifier, $assessment, $last_answer_id);
+
+ }
+ }
+ }
+
+ $questions = !empty($questions) ? $questions : '';
+
+ return $questions;
+ }
+
+ private function str_replace_once ($search, $replace, $subject) {
+
+ $first_char = strpos($subject, $search);
+
+ if ($first_char !== false) {
+
+ $before_str = substr($subject, 0, $first_char);
+ $after_str = substr($subject, $first_char + strlen($search));
+
+ return $before_str . $replace . $after_str;
+
+ } else {
+ return $subject;
+ }
+ }
+
+ private function get_general_feedback ($assessment, $question_identifier) {
+
+ $xpath = cc112moodle::newx_path($assessment, cc112moodle::getquizns());
+
+ $respconditions = $xpath->query('//xmlns:item[@ident="' . $question_identifier . '"]/xmlns:resprocessing/xmlns:respcondition');
+
+ if (!empty($respconditions)) {
+
+ foreach ($respconditions as $respcondition) {
+
+ $continue = $respcondition->getAttributeNode('continue');
+ $continue = !empty($continue->nodeValue) ? strtolower($continue->nodeValue) : '';
+
+ if ($continue == 'yes') {
+
+ $display_feedback = $xpath->query('xmlns:displayfeedback', $respcondition);
+
+ if (!empty($display_feedback)) {
+ foreach ($display_feedback as $feedback) {
+
+ $feedback_identifier = $feedback->getAttributeNode('linkrefid');
+ $feedback_identifier = !empty($feedback_identifier->nodeValue) ? $feedback_identifier->nodeValue : '';
+
+ if (!empty($feedback_identifier)) {
+ $feedbacks_identifiers[] = $feedback_identifier;
+ }
+ }
+ }
+ }
+ }
+ }
+
+ $feedback = '';
+ $feedbacks_identifiers = empty($feedbacks_identifiers) ? '' : $feedbacks_identifiers;
+
+ if (!empty($feedbacks_identifiers)) {
+ foreach ($feedbacks_identifiers as $feedback_identifier) {
+ $feedbacks = $xpath->query('//xmlns:item[@ident="' . $question_identifier . '"]/xmlns:itemfeedback[@ident="' . $feedback_identifier . '"]/xmlns:flow_mat/xmlns:material/xmlns:mattext');
+ $feedback .= !empty($feedbacks->item(0)->nodeValue) ? $feedbacks->item(0)->nodeValue . ' ' : '';
+ }
+ }
+
+ return $feedback;
+ }
+
+ private function get_feedback ($assessment, $identifier, $item_identifier, $question_type) {
+
+ $xpath = cc112moodle::newx_path($assessment, cc112moodle::getquizns());
+
+ $resource_processing = $xpath->query('//xmlns:item[@ident="' . $item_identifier . '"]/xmlns:resprocessing/xmlns:respcondition');
+
+ if (!empty($resource_processing)) {
+
+ foreach ($resource_processing as $response) {
+
+ $varequal = $xpath->query('xmlns:conditionvar/xmlns:varequal', $response);
+ $varequal = !empty($varequal->item(0)->nodeValue) ? $varequal->item(0)->nodeValue : '';
+
+ if (strtolower($varequal) == strtolower($identifier) || ($question_type == CC_QUIZ_ESSAY)) {
+
+ $display_feedback = $xpath->query('xmlns:displayfeedback', $response);
+
+ if (!empty($display_feedback)) {
+ foreach ($display_feedback as $feedback) {
+
+ $feedback_identifier = $feedback->getAttributeNode('linkrefid');
+ $feedback_identifier = !empty($feedback_identifier->nodeValue) ? $feedback_identifier->nodeValue : '';
+
+ if (!empty($feedback_identifier)) {
+ $feedbacks_identifiers[] = $feedback_identifier;
+ }
+ }
+ }
+ }
+ }
+ }
+
+ $feedback = '';
+ $feedbacks_identifiers = empty($feedbacks_identifiers) ? '' : $feedbacks_identifiers;
+
+ if (!empty($feedbacks_identifiers)) {
+ foreach ($feedbacks_identifiers as $feedback_identifier) {
+ $feedbacks = $xpath->query('//xmlns:item[@ident="' . $item_identifier . '"]/xmlns:itemfeedback[@ident="' . $feedback_identifier . '"]/xmlns:flow_mat/xmlns:material/xmlns:mattext');
+ $feedback .= !empty($feedbacks->item(0)->nodeValue) ? $feedbacks->item(0)->nodeValue . ' ' : '';
+ }
+ }
+
+ return $feedback;
+ }
+
+ private function get_answers_fib ($question_identifier, $identifier, $assessment, &$last_answer_id) {
+
+ $xpath = cc112moodle::newx_path($assessment, cc112moodle::getquizns());
+
+ $answers_fib = array();
+
+ $response_items = $xpath->query('//xmlns:item[@ident="' . $question_identifier . '"]/xmlns:resprocessing/xmlns:respcondition');
+
+ foreach ($response_items as $response_item) {
+
+ $setvar = $xpath->query('xmlns:setvar', $response_item);
+ $setvar = is_object($setvar->item(0)) ? $setvar->item(0)->nodeValue : '';
+
+ if ($setvar != '') {
+
+ $last_answer_id++;
+
+ $answer_title = $xpath->query('xmlns:conditionvar/xmlns:varequal[@respident="' . $identifier . '"]', $response_item);
+ $answer_title = !empty($answer_title->item(0)->nodeValue) ? $answer_title->item(0)->nodeValue : '';
+
+ $case = $xpath->query('xmlns:conditionvar/xmlns:varequal/@case', $response_item);
+ $case = is_object($case->item(0)) ? $case->item(0)->nodeValue : 'no'
+ ;
+ $case = strtolower($case) == 'yes' ? 1 :
+ 0;
+
+ $display_feedback = $xpath->query('xmlns:displayfeedback', $response_item);
+
+ unset($feedbacks_identifiers);
+
+ if (!empty($display_feedback)) {
+
+ foreach ($display_feedback as $feedback) {
+
+ $feedback_identifier = $feedback->getAttributeNode('linkrefid');
+ $feedback_identifier = !empty($feedback_identifier->nodeValue) ? $feedback_identifier->nodeValue : '';
+
+ if (!empty($feedback_identifier)) {
+ $feedbacks_identifiers[] = $feedback_identifier;
+ }
+ }
+ }
+
+ $feedback = '';
+ $feedbacks_identifiers = empty($feedbacks_identifiers) ? '' : $feedbacks_identifiers;
+
+ if (!empty($feedbacks_identifiers)) {
+ foreach ($feedbacks_identifiers as $feedback_identifier) {
+ $feedbacks = $xpath->query('//xmlns:item[@ident="' . $question_identifier . '"]/xmlns:itemfeedback[@ident="' . $feedback_identifier . '"]/xmlns:flow_mat/xmlns:material/xmlns:mattext');
+ $feedback .= !empty($feedbacks->item(0)->nodeValue) ? $feedbacks->item(0)->nodeValue . ' ' : '';
+ }
+ }
+
+ $answers_fib[] = array('id' => $last_answer_id,
+ 'title' => $answer_title,
+ 'score' => $setvar,
+ 'feedback' => $feedback,
+ 'case' => $case);
+ }
+ }
+
+ $answers_fib = empty($answers_fib) ? '' : $answers_fib;
+
+ return $answers_fib;
+ }
+
+ private function get_answers_pattern_match ($question_identifier, $identifier, $assessment, &$last_answer_id) {
+
+ $xpath = cc112moodle::newx_path($assessment, cc112moodle::getquizns());
+
+ $answers_fib = array();
+
+ $response_items = $xpath->query('//xmlns:item[@ident="' . $question_identifier . '"]/xmlns:resprocessing/xmlns:respcondition');
+
+ foreach ($response_items as $response_item) {
+
+ $setvar = $xpath->query('xmlns:setvar', $response_item);
+ $setvar = is_object($setvar->item(0)) ? $setvar->item(0)->nodeValue : '';
+
+ if ($setvar != '') {
+
+ $last_answer_id++;
+
+ $answer_title = $xpath->query('xmlns:conditionvar/xmlns:varequal[@respident="' . $identifier . '"]', $response_item);
+ $answer_title = !empty($answer_title->item(0)->nodeValue) ? $answer_title->item(0)->nodeValue : '';
+
+ if (empty($answer_title)) {
+ $answer_title = $xpath->query('xmlns:conditionvar/xmlns:varsubstring[@respident="' . $identifier . '"]', $response_item);
+ $answer_title = !empty($answer_title->item(0)->nodeValue) ? '*' . $answer_title->item(0)->nodeValue . '*' : '';
+ }
+
+ if (empty($answer_title)) {
+ $answer_title = '*';
+ }
+
+ $case = $xpath->query('xmlns:conditionvar/xmlns:varequal/@case', $response_item);
+ $case = is_object($case->item(0)) ? $case->item(0)->nodeValue : 'no'
+ ;
+ $case = strtolower($case) == 'yes' ? 1 :
+ 0;
+
+ $display_feedback = $xpath->query('xmlns:displayfeedback', $response_item);
+
+ unset($feedbacks_identifiers);
+
+ if (!empty($display_feedback)) {
+
+ foreach ($display_feedback as $feedback) {
+
+ $feedback_identifier = $feedback->getAttributeNode('linkrefid');
+ $feedback_identifier = !empty($feedback_identifier->nodeValue) ? $feedback_identifier->nodeValue : '';
+
+ if (!empty($feedback_identifier)) {
+ $feedbacks_identifiers[] = $feedback_identifier;
+ }
+ }
+ }
+
+ $feedback = '';
+ $feedbacks_identifiers = empty($feedbacks_identifiers) ? '' : $feedbacks_identifiers;
+
+ if (!empty($feedbacks_identifiers)) {
+ foreach ($feedbacks_identifiers as $feedback_identifier) {
+ $feedbacks = $xpath->query('//xmlns:item[@ident="' . $question_identifier . '"]/xmlns:itemfeedback[@ident="' . $feedback_identifier . '"]/xmlns:flow_mat/xmlns:material/xmlns:mattext');
+ $feedback .= !empty($feedbacks->item(0)->nodeValue) ? $feedbacks->item(0)->nodeValue . ' ' : '';
+ }
+ }
+
+ $answers_fib[] = array('id' => $last_answer_id,
+ 'title' => $answer_title,
+ 'score' => $setvar,
+ 'feedback' => $feedback,
+ 'case' => $case);
+ }
+ }
+
+ $answers_fib = empty($answers_fib) ? '' : $answers_fib;
+
+ return $answers_fib;
+ }
+
+
+ private function get_answers ($identifier, $assessment, &$last_answer_id) {
+
+ $xpath = cc112moodle::newx_path($assessment, cc112moodle::getquizns());
+
+ $answers = array();
+
+ $question_cc_type = $this->get_question_type($identifier, $assessment);
+ $question_cc_type = $question_cc_type['cc'];
+
+ if ($question_cc_type == CC_QUIZ_MULTIPLE_CHOICE || $question_cc_type == CC_QUIZ_MULTIPLE_RESPONSE || $question_cc_type == CC_QUIZ_TRUE_FALSE) {
+
+ $query_answers = '//xmlns:item[@ident="' . $identifier . '"]/xmlns:presentation/xmlns:response_lid/xmlns:render_choice/xmlns:response_label';
+ $query_answers_with_flow = '//xmlns:item[@ident="' . $identifier . '"]/xmlns:presentation/xmlns:flow/xmlns:response_lid/xmlns:render_choice/xmlns:response_label';
+
+ $query_indentifer = '@ident';
+ $query_title = 'xmlns:material/xmlns:mattext';
+ }
+
+ if ($question_cc_type == CC_QUIZ_ESSAY) {
+
+ $query_answers = '//xmlns:item[@ident="' . $identifier . '"]/xmlns:presentation/xmlns:response_str';
+ $query_answers_with_flow = '//xmlns:item[@ident="' . $identifier . '"]/xmlns:presentation/xmlns:flow/xmlns:response_str';
+
+ $query_indentifer = '@ident';
+ $query_title = 'xmlns:render_fib';
+ }
+
+ if ($question_cc_type == CC_QUIZ_FIB || $question_cc_type == CC_QUIZ_PATTERN_MACHT) {
+
+ $xpath_query = '//xmlns:item[@ident="' . $identifier . '"]/xmlns:presentation/xmlns:response_str/@ident';
+ $xpath_query_with_flow = '//xmlns:item[@ident="' . $identifier . '"]/xmlns:presentation/xmlns:flow/xmlns:response_str/@ident';
+
+ $count_response = $xpath->evaluate('count(' . $xpath_query_with_flow . ')');
+
+ if ($count_response == 0) {
+ $answer_identifier = $xpath->query($xpath_query);
+ } else {
+ $answer_identifier = $xpath->query($xpath_query_with_flow);
+ }
+
+ $answer_identifier = !empty($answer_identifier->item(0)->nodeValue) ? $answer_identifier->item(0)->nodeValue : '';
+
+ if ($question_cc_type == CC_QUIZ_FIB) {
+ $answers = $this->get_answers_fib ($identifier, $answer_identifier, $assessment, $last_answer_id);
+ } else {
+ $answers = $this->get_answers_pattern_match ($identifier, $answer_identifier, $assessment, $last_answer_id);
+ }
+
+ } else {
+
+ $count_response = $xpath->evaluate('count(' . $query_answers_with_flow . ')');
+
+ if ($count_response == 0) {
+ $response_items = $xpath->query($query_answers);
+ } else {
+ $response_items = $xpath->query($query_answers_with_flow);
+ }
+
+ if (!empty($response_items)) {
+
+ foreach ($response_items as $response_item) {
+
+ $last_answer_id++;
+
+ $answer_identifier = $xpath->query($query_indentifer, $response_item);
+ $answer_identifier = !empty($answer_identifier->item(0)->nodeValue) ? $answer_identifier->item(0)->nodeValue : '';
+
+ $answer_title = $xpath->query($query_title, $response_item);
+ $answer_title = !empty($answer_title->item(0)->nodeValue) ? $answer_title->item(0)->nodeValue : '';
+
+ $answer_feedback = $this->get_feedback($assessment, $answer_identifier, $identifier, $question_cc_type);
+
+ $answer_score = $this->get_score($assessment, $answer_identifier, $identifier);
+
+ $answers[] = array('id' => $last_answer_id,
+ 'title' => $answer_title,
+ 'score' => $answer_score,
+ 'identifier' => $answer_identifier,
+ 'feedback' => $answer_feedback);
+ }
+ }
+ }
+
+ $answers = empty($answers) ? '' : $answers;
+
+ return $answers;
+
+ }
+
+ private function get_score ($assessment, $identifier, $question_identifier) {
+
+ $xpath = cc112moodle::newx_path($assessment, cc112moodle::getquizns());
+
+ $resource_processing = $xpath->query('//xmlns:item[@ident="' . $question_identifier . '"]/xmlns:resprocessing/xmlns:respcondition');
+
+ if (!empty($resource_processing)) {
+
+ foreach ($resource_processing as $response) {
+
+ $question_cc_type = $this->get_question_type($question_identifier, $assessment);
+ $question_cc_type = $question_cc_type['cc'];
+
+ $varequal = $xpath->query('xmlns:conditionvar/xmlns:varequal', $response);
+ $varequal = !empty($varequal->item(0)->nodeValue) ? $varequal->item(0)->nodeValue : '';
+
+ if (strtolower($varequal) == strtolower($identifier)) {
+ $score = $xpath->query('xmlns:setvar', $response);
+ $score = !empty($score->item(0)->nodeValue) ? $score->item(0)->nodeValue : '';
+ }
+ }
+ }
+
+ $score = empty($score) ? 0 : $score;
+
+ return $score;
+ }
+
+ private function create_node_course_question_categories_question_category_question_multiple_choice ($question) {
+
+ $node_course_question_categories_question_answer = '';
+ $sheet_question_categories_question = cc112moodle::loadsheet(SHEET_COURSE_QUESTION_CATEGORIES_QUESTION_CATEGORY_QUESTION_MULTIPLE_CHOICE);
+
+ if (!empty($question['answers'])) {
+ foreach ($question['answers'] as $answer) {
+ $node_course_question_categories_question_answer .= $this->create_node_course_question_categories_question_category_question_answer($answer);
+