. /** * @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_resource extends entities11 { public function generate_node () { cc112moodle::log_action('Creating Resource mods'); $response = ''; $sheet_mod_resource = cc112moodle::loadsheet(SHEET_COURSE_SECTIONS_SECTION_MODS_MOD_RESOURCE); if (!empty(cc112moodle::$instances['instances'][MOODLE_TYPE_RESOURCE])) { foreach (cc112moodle::$instances['instances'][MOODLE_TYPE_RESOURCE] as $instance) { $response .= $this->create_node_course_modules_mod_resource($sheet_mod_resource, $instance); } } return $response; } private function create_node_course_modules_mod_resource ($sheet_mod_resource, $instance) { global $CFG; require_once($CFG->libdir.'/validateurlsyntax.php'); $link = ''; $mod_alltext = ''; $mod_summary = ''; $xpath = cc112moodle::newx_path(cc112moodle::$manifest, cc112moodle::$namespaces); if ($instance['common_cartriedge_type'] == cc112moodle::CC_TYPE_WEBCONTENT || $instance['common_cartriedge_type'] == cc112moodle::CC_TYPE_ASSOCIATED_CONTENT) { $resource = $xpath->query('/imscc:manifest/imscc:resources/imscc:resource[@identifier="' . $instance['resource_indentifier'] . '"]/@href'); if ($resource->length > 0) { $resource = !empty($resource->item(0)->nodeValue) ? $resource->item(0)->nodeValue : ''; } else { $resource = ''; } if (empty($resource)) { unset($resource); $resource = $xpath->query('/imscc:manifest/imscc:resources/imscc:resource[@identifier="' . $instance['resource_indentifier'] . '"]/imscc:file/@href'); if ($resource->length > 0) { $resource = !empty($resource->item(0)->nodeValue) ? $resource->item(0)->nodeValue : ''; } else { $resource = ''; } } if (!empty($resource)) { $link = $resource; } } if ($instance['common_cartriedge_type'] == cc112moodle::CC_TYPE_WEBLINK) { $external_resource = $xpath->query('/imscc:manifest/imscc:resources/imscc:resource[@identifier="' . $instance['resource_indentifier'] . '"]/imscc:file/@href')->item(0)->nodeValue; if ($external_resource) { $resource = $this->load_xml_resource(cc112moodle::$path_to_manifest_folder . DIRECTORY_SEPARATOR . $external_resource); if (!empty($resource)) { $xpath = cc112moodle::newx_path($resource, cc112moodle::$resourcens); $resource = $xpath->query('/wl:webLink/wl:url/@href'); if ($resource->length > 0) { $rawlink = $resource->item(0)->nodeValue; if (!validateUrlSyntax($rawlink, 's+')) { $changed = rawurldecode($rawlink); if (validateUrlSyntax($changed, 's+')) { $link = $changed; } else { $link = 'http://invalidurldetected/'; } } else { $link = htmlspecialchars(trim($rawlink), ENT_COMPAT, 'UTF-8', false); } } } } } $find_tags = array('[#mod_instance#]', '[#mod_name#]', '[#mod_type#]', '[#mod_reference#]', '[#mod_summary#]', '[#mod_alltext#]', '[#mod_options#]', '[#date_now#]'); $mod_type = 'file'; $mod_options = 'objectframe'; $mod_reference = $link; //detected if we are dealing with html file if (!empty($link) && ($instance['common_cartriedge_type'] == cc112moodle::CC_TYPE_WEBCONTENT)) { $ext = strtolower(pathinfo($link, PATHINFO_EXTENSION)); if (in_array($ext, array('html', 'htm', 'xhtml'))) { $mod_type = 'html'; //extract the content of the file $rootpath = realpath(cc112moodle::$path_to_manifest_folder); $htmlpath = realpath($rootpath . DIRECTORY_SEPARATOR . $link); $dirpath = dirname($htmlpath); if (file_exists($htmlpath)) { $fcontent = file_get_contents($htmlpath); $mod_alltext = clean_param($this->prepare_content($fcontent), PARAM_CLEANHTML); $mod_reference = ''; $mod_options = ''; /** * try to handle embedded resources * images, linked static resources, applets, videos */ $doc = new DOMDocument(); $cdir = getcwd(); chdir($dirpath); try { $doc->loadHTML($mod_alltext); $xpath = new DOMXPath($doc); $attributes = array('href', 'src', 'background', 'archive', 'code'); $qtemplate = "//*[@##][not(contains(@##,'://'))]/@##"; $query = ''; foreach ($attributes as $attrname) { if (!empty($query)) { $query .= " | "; } $query .= str_replace('##', $attrname, $qtemplate); } $list = $xpath->query($query); $searches = array(); $replaces = array(); foreach ($list as $resrc) { $rpath = $resrc->nodeValue; $rtp = realpath($rpath); if (($rtp !== false) && is_file($rtp)) { //file is there - we are in business $strip = str_replace("\\", "/", str_ireplace($rootpath, '', $rtp)); $encoded_file = '$@FILEPHP@$'.str_replace('/', '$@SLASH@$', $strip); $searches[] = $resrc->nodeValue; $replaces[] = $encoded_file; } } $mod_alltext = str_replace($searches, $replaces, $mod_alltext); } catch (Exception $e) { //silence the complaints } chdir($cdir); $mod_alltext = self::safexml($mod_alltext); } } } $replace_values = array($instance['instance'], self::safexml($instance['title']), $mod_type, $mod_reference, '', $mod_alltext, $mod_options, time()); return str_replace($find_tags, $replace_values, $sheet_mod_resource); } }