@ -77,57 +77,59 @@ class scorm extends learnpath {
if (empty($file)) {
// Get the path of the imsmanifest file.
}
if (is_file($file) and is_readable($file)) {
$v = substr(phpversion(), 0, 1);
if ($v == 4) {
if ($this->debug > 0) { error_log('In scorm::parse_manifest() - Parsing using PHP4 method', 0); }
$var = file_get_contents($file);
// Quick ugly hack to remove xml:id attributes from the file (break the system if xslt not installed).
$var = preg_replace('/xml:id=["\']id_\d{1,4}["\']/i', '', $var );
$doc = xmldoc($var);
//error_reporting(E_ALL);
//$doc = xmldocfile($file);
if (!empty($doc->encoding)) {
$this->manifest_encoding = strtoupper($doc->encoding);
}
if ($this->debug > 1) { error_log('New LP - Called xmldoc() (encoding:'.strtoupper($doc->encoding).' - saved: '.$this->manifest_encoding.')', 0); }
if (!$doc) {
if ($this->debug > 1) { error_log('New LP - File '.$file.' is not an XML file', 0); }
//$this->set_error_msg("File $file is not an XML file");
return null;
} else {
if ($this->debug > 1) { error_log('New LP - File '.$file.' is XML', 0); }
$root = $doc->root() ;
$attributes = $root->attributes();
for ($a = 0; $a < sizeof ( $ attributes ) ; $ a + + ) {
if (is_file($file) & & is_readable($file)) {
// Parsing using PHP5 DOMXML methods.
if ($this->debug > 0) { error_log('In scorm::parse_manifest() - Parsing using PHP5 method', 0); }
$doc = new DOMDocument();
$res = $doc->load($file );
if ($res === false) {
if ($this->debug > 0) { error_log('New LP - In scorm::parse_manifest() - Exception thrown when loading '.$file.' in DOMDocument', 0); }
// Throw exception?
return null;
}
if (!empty($doc->xmlEncoding)) {
$this->manifest_encoding = strtoupper($doc->xmlEncoding);
}
if ($this->debug > 1) { error_log('New LP - Called (encoding:'.$doc->xmlEncoding.' - saved: '.$this->manifest_encoding.')', 0); }
$root = $doc->documentElement;
if ($root->hasAttributes()) {
$attributes = $root->attributes ;
if ($attributes->length !== 0) {
foreach ($attributes as $attrib) {
// < manifest > element attributes
if ($attributes[$a]->type == XML_ATTRIBUTE_NODE) {
$this->manifest[$attributes[$a]->name] = $attributes[$a]->value;
}
$this->manifest[$attrib->name] = $attrib->value;
}
$this->manifest['name'] = $root->name;
$children = $root->children();
for($b = 0; $b < sizeof ( $ children ) ; $ b + + ) {
}
}
$this->manifest['name'] = $root->tagName;
if ($root->hasChildNodes()) {
$children = $root->childNodes;
if ($children->length !== 0) {
foreach ($children as $child) {
// < manifest > element children (can be < metadata > , < organizations > or < resources > )
if ($children[$b]->type == XML_ELEMENT_NODE) {
switch($children[$b]->tagname) {
if ($child->nodeT ype == XML_ELEMENT_NODE) {
switch($child->tagN ame) {
case 'metadata':
// Parse items from inside the < metadata > element.
$this->metadata = new scormMetadata('manifest',$children[$b] );
$this->metadata = new scormMetadata('manifest',$child);
break;
case 'organizations':
// Contains the course structure - this element appears 1 and only 1 time in a package imsmanifest. It contains at least one 'organization' sub-element.
$orgs_attribs = $children[$b] ->attributes() ;
for($c = 0; $c < sizeof ( $ orgs_attribs ) ; $ c + + ) {
$orgs_attribs = $child->attributes;
foreach ($orgs_attribs as $orgs_attrib) {
// Attributes of the < organizations > element.
if ($orgs_attribs[$c]->t ype == XML_ATTRIBUTE_NODE) {
$this->manifest['organizations'][$orgs_attribs[$c] ->name] = $orgs_attribs[$c] ->value;
if ($orgs_attrib->nodeT ype == XML_ATTRIBUTE_NODE) {
$this->manifest['organizations'][$orgs_attrib->name] = $orgs_attrib->value;
}
}
$orgs_nodes = $children[$b]->children() ;
$orgs_nodes = $child->childNodes ;
$i = 0;
$found_an_org = false;
foreach ($orgs_nodes as $c => $dummy ) {
foreach ($orgs_nodes as $orgnode ) {
// < organization > elements - can contain < item > , < metadata > and < title >
// Here we are at the 'organization' level. There might be several organization tags but
// there is generally only one.
@ -136,24 +138,21 @@ class scorm extends learnpath {
// -item (may contain other item tags or may appear several times inside organization)
// -metadata (relative to the organization)
$found_an_org = false;
$orgnode =& $orgs_nodes[$c];
switch ($orgnode->type) {
switch ($orgnode->nodeType) {
case XML_TEXT_NODE:
// Ignore here.
break;
case XML_ATTRIBUTE_NODE:
// just in case ther would be interesting attributes inside the organization tag. There shouldn't
// Just in case there would be interesting attributes inside the organization tag. There shouldn't
// as this is a node-level, not a data level.
//$manifest['organizations'][$i][$orgnode->name] = $orgnode->value;
//$found_an_org = true;
break;
case XML_ELEMENT_NODE:
// < item > , < metadata > or < title > (or attributes)
$organizations_attributes = $orgnode->attributes();
foreach($organizations_attributes as $d1 => $dummy) {
//$manifest['organizations'][$i]['attributes'][$organizations_attributes[$d1]->name] = $organizations_attributes[$d1]->value;
//$found_an_org = true;
$this->organizations_att[$organizations_attributes[$d1]->name] = $organizations_attributes[$d1]->value;
$organizations_attributes = $orgnode->attributes;
foreach ($organizations_attributes as $orgs_attr) {
$this->organizations_att[$orgs_attr->name] = $orgs_attr->value;
}
$oOrganization = new scormOrganization('manifest', $orgnode, $this->manifest_encoding);
if ($oOrganization->identifier != '') {
@ -174,26 +173,23 @@ class scorm extends learnpath {
}
break;
case 'resources':
$resources_attribs = $children[$b]->attributes();
for ($c = 0; $c < sizeof ( $ resources_attribs ) ; $ c + + ) {
if ($resources_attribs[$c]->type == XML_ATTRIBUTE_NODE) {
$this->manifest['resources'][$resources_attribs[$c]->name] = $resources_attribs[$c]->value;
if ($child->hasAttributes()) {
$resources_attribs = $child->attributes;
foreach ($resources_attribs as $res_attr) {
if ($res_attr->type == XML_ATTRIBUTE_NODE) {
$this->manifest['resources'][$res_attr->name] = $res_attr->value;
}
}
}
$resources_nodes = $children[$b]->children();
$i = 0;
foreach ($resources_nodes as $c => $dummy) {
/*
$my_res = scorm::parse_items($resources_nodes[$c]);
scorm::parse_items_get_refurls($resources_nodes[$c], $refurls);
if (count($my_res) > 0) {
$manifest['resources'][$i] = $my_res;
}
*/
$oResource = new scormResource('manifest', $resources_nodes[$c]);
if ($oResource->identifier != '') {
$this->resources[$oResource->identifier] = $oResource;
$i++;
if ($child->hasChildNodes()) {
$resources_nodes = $child->childNodes;
$i = 0;
foreach ($resources_nodes as $res_node) {
$oResource = new scormResource('manifest', $res_node);
if ($oResource->identifier != '') {
$this->resources[$oResource->identifier] = $oResource;
$i++;
}
}
}
// Contains links to physical resources.
@ -205,141 +201,17 @@ class scorm extends learnpath {
}
}
}
unset($doc);
} elseif ($v==5) {
if ($this->debug > 0) { error_log('In scorm::parse_manifest() - Parsing using PHP5 method', 0); }
$doc = new DOMDocument();
$res = $doc->load($file);
if ($res === false) {
if ($this->debug > 0) { error_log('New LP - In scorm::parse_manifest() - Exception thrown when loading '.$file.' in DOMDocument', 0); }
// Throw exception?
return null;
}
if (!empty($doc->xmlEncoding)) {
$this->manifest_encoding = strtoupper($doc->xmlEncoding);
}
if ($this->debug > 1) { error_log('New LP - Called (encoding:'.$doc->xmlEncoding.' - saved: '.$this->manifest_encoding.')', 0); }
$root = $doc->documentElement;
if ($root->hasAttributes()) {
$attributes = $root->attributes;
if ($attributes->length !== 0) {
foreach($attributes as $attrib) {
// < manifest > element attributes
$this->manifest[$attrib->name] = $attrib->value;
}
}
}
$this->manifest['name'] = $root->tagName;
if ($root->hasChildNodes()) {
$children = $root->childNodes;
if ($children->length !== 0) {
foreach($children as $child) {
// < manifest > element children (can be < metadata > , < organizations > or < resources > )
if ($child->nodeType == XML_ELEMENT_NODE) {
switch($child->tagName) {
case 'metadata':
// Parse items from inside the < metadata > element.
$this->metadata = new scormMetadata('manifest',$child);
break;
case 'organizations':
// Contains the course structure - this element appears 1 and only 1 time in a package imsmanifest. It contains at least one 'organization' sub-element.
$orgs_attribs = $child->attributes;
foreach($orgs_attribs as $orgs_attrib) {
// Attributes of the < organizations > element.
if ($orgs_attrib->nodeType == XML_ATTRIBUTE_NODE) {
$this->manifest['organizations'][$orgs_attrib->name] = $orgs_attrib->value;
}
}
$orgs_nodes = $child->childNodes;
$i = 0;
$found_an_org = false;
foreach ($orgs_nodes as $orgnode) {
// < organization > elements - can contain < item > , < metadata > and < title >
// Here we are at the 'organization' level. There might be several organization tags but
// there is generally only one.
// There are generally three children nodes we are looking for inside and organization:
// -title
// -item (may contain other item tags or may appear several times inside organization)
// -metadata (relative to the organization)
$found_an_org = false;
switch($orgnode->nodeType) {
case XML_TEXT_NODE:
// Ignore here.
break;
case XML_ATTRIBUTE_NODE:
// Just in case there would be interesting attributes inside the organization tag. There shouldn't
// as this is a node-level, not a data level.
//$manifest['organizations'][$i][$orgnode->name] = $orgnode->value;
//$found_an_org = true;
break;
case XML_ELEMENT_NODE:
// < item > , < metadata > or < title > (or attributes)
$organizations_attributes = $orgnode->attributes;
foreach ($organizations_attributes as $orgs_attr) {
$this->organizations_att[$orgs_attr->name] = $orgs_attr->value;
}
$oOrganization = new scormOrganization('manifest',$orgnode,$this->manifest_encoding);
if ($oOrganization->identifier != '') {
$name = $oOrganization->get_name();
if (empty($name)) {
// If the org title is empty, use zip file name.
$myname = $this->zipname;
if ($this->lastzipnameindex != 0) {
$myname = $myname + $this->lastzipnameindex;
$this->lastzipnameindex++;
}
$oOrganization->set_name($this->zipname);
}
$this->organizations[$oOrganization->identifier] = $oOrganization;
}
break;
}
}
break;
case 'resources':
if ($child->hasAttributes()) {
$resources_attribs = $child->attributes;
foreach ($resources_attribs as $res_attr) {
if ($res_attr->type == XML_ATTRIBUTE_NODE) {
$this->manifest['resources'][$res_attr->name] = $res_attr->value;
}
}
}
if ($child->hasChildNodes()) {
$resources_nodes = $child->childNodes;
$i = 0;
foreach ($resources_nodes as $res_node) {
$oResource = new scormResource('manifest', $res_node);
if ($oResource->identifier != '') {
$this->resources[$oResource->identifier] = $oResource;
$i++;
}
}
}
// Contains links to physical resources.
break;
case 'manifest':
// Only for sub-manifests.
break;
}
}
}
}
}
unset($doc);
} else {
if ($this->debug > 0) { error_log('In scorm::parse_manifest() - PHP version is not 4 nor 5, cannot parse', 0); }
$this->set_error_msg("Parsing impossible because PHP version is not 4 nor 5");
return null;
}
unset($doc);
// End parsing using PHP5 DOMXML methods.
} else {
if ($this->debug > 1) { error_log('New LP - Could not open/read file '.$file, 0); }
$this->set_error_msg("File $file could not be read");
return null;
}
// TODO: close the DOM handler
// TODO: Close the DOM handler.
return $this->manifest;
}