* @access public * * @package dokeos.scorm * ============================================================================== */ /** * Sets the href string value of the element whose identifierref field equals the given identifier. * Modifies the $items array. * @param string Identifier seeked * @param string href link to set in the $items array * @return void Nothing */ function put_it_to_items($ident,$href) { //from the resources array, it puts the href to the appropriate place in items array global $items; $i=1; while ($items[$i]) { if ($items[$i]['identifierref']==$ident) { $items[$i]['href']=$href; } $i++; } } /** * This handles the start tags. Modifies the $items array. * name is the name of the tag, if more attributes than $attribs is an array * @param resource Parser handler * @param string Name of the tag * @param mixed String or array of attributes * @return void Nothing */ function startElement($parser, $name, $attribs) { global $xml_parser, $defaultorgref, $defaultorgtitle, $inorg, $initem, $intitle, $inmeta, $items, $itemindex, $tabledraw, $inversion, $prereq, $previouslevel, $clusterinfo, $ingeneral; if ($tabledraw) { echo ""; echo xml_get_current_line_number($xml_parser); echo "$inorg$initem"; } if ($name=='ORGANIZATIONS') { list($key, $value) = each($attribs); $defaultorgref=$value; } if (($name=='ORGANIZATION') or ($name=='tableofcontents')) { $inorg=true; } if ($name=='SCHEMAVERSION') { $inversion=true; } if ($name=='ADLCP:PREREQUISITES') { $prereq=true; } if ($name=='METADATA') { $inmeta=true; } if ($name=='GENERAL') { $ingeneral=true; } if ($name=='ITEM') { $initem++; $itemindex++; while (list($key, $value) = each($attribs)) { if ($key=='IDENTIFIERREF') { $items[$itemindex]['identifierref']=$value; } if ($key=='IDENTIFIER') { $items[$itemindex]['identifier']=$value; } if ($key=='PARAMETERS') { $items[$itemindex]['parameters']=$value; } if ($key=='TITLE') { $items[$itemindex]['title']=$value; } } $items[$itemindex]['index']=$itemindex; $items[$itemindex]['level']=$initem; if ($initem==$previouslevel) { $clusterinfo++; } if ($initem>$previouslevel) { $clusterinfo=$clusterinfo*10+1; $previouslevel=$initem; } if ($initem<$previouslevel) { $clusterinfo=floor($clusterinfo/10)+1; $previouslevel=$initem; } $items[$itemindex]['clusterinfo']=$clusterinfo; } if ($name=='TITLE') { $intitle=true; } if ($name=='RESOURCE') { //by the time it gets there, all the items are already read (overpassed) while (list($key, $value) = each($attribs)) { if ($key=='HREF') { $href=$value; } if ($key=='IDENTIFIER') { $ident=$value; } } put_it_to_items($ident,$href); } reset($attribs); //drawing the table if ($tabledraw) { echo "$name"; if (sizeof($attribs)) { while (list($k, $v) = each($attribs)) { echo "$k=$v"; } } } } /** * Handles the end tags * @param resource Parser handler * @param string Name of the closing tag * @return void Nothing */ function endElement($parser, $name) { global $inorg,$initem,$inmeta,$ingeneral,$intitle,$inversion,$prereq; if (($name=='ORGANIZATION') or ($name=='tableofcontents')) { $inorg=false; } if ($name=='ITEM') { $initem--; } if ($name=='METADATA') { $inmeta==false; } if ($name=='GENERAL') { $ingeneral==false; } if ($name=='TITLE') { $intitle=false; } if ($name=='SCHEMAVERSION') { $inversion=false; } if ($name=='ADLCP:PREREQUISITES') { //this is only good for scorm 1.2 $prereq=false; } } /** * handles the data between start and and tags. Modifies the $items array. * note : if f.ex. Steering & sailing is the data, then this function is called 3 times !!! * @param resource Parser handler * @param string The data between start and stop tags * @return void Nothing */ function characterData($parser, $data) { global $defaultorgtitle, $initem, $intitle, $inmeta, $inorg, $items, $itemindex, $inversion, $version, $prereq, $ingeneral; //echo "int:$intitle ino:$inorg ini:$initem inm:$inmeta"; if (($intitle==true) and ($inorg==true) and ($initem==false) and ($ingeneral==false)) { $defaultorgtitle.=$data; return; } if (($intitle==true) and ($initem==true)) { $items[$itemindex]['title'].=$data; return; } if ($inversion==true) { $version=$data; //this will provide the last schemaversion tag version number only ! return; } if ($prereq==true) { $items[$itemindex]['prereq']=$data; } } /** * Creates a new xml parser and returns an array containing the parser resource and the xml file resource. * @param string Path to the XML file we want to parse * @return mixed Array containing the parser handler and the XML file handler. */ function new_xml_parser($request_file) { global $parser_file; $xml_parser = xml_parser_create(); xml_parser_set_option($xml_parser, XML_OPTION_CASE_FOLDING, 1); xml_set_element_handler($xml_parser, "startElement", "endElement"); //telling which function will handle start and end tags xml_set_character_data_handler($xml_parser, "characterData"); if (!($fp = @fopen($request_file, "r"))) { return false; } if (!is_array($parser_file)) { settype($parser_file, "array"); } $parser_file[$xml_parser] = $request_file; return array($xml_parser, $fp); } ?>