Go to the documentation of this file.00001 <?php
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024 require_once("content/classes/SCORM/class.ilSCORMManifest.php");
00025 require_once("content/classes/SCORM/class.ilSCORMOrganizations.php");
00026 require_once("content/classes/SCORM/class.ilSCORMOrganization.php");
00027 require_once("content/classes/SCORM/class.ilSCORMItem.php");
00028 require_once("content/classes/SCORM/class.ilSCORMResources.php");
00029 require_once("content/classes/SCORM/class.ilSCORMResource.php");
00030 require_once("content/classes/SCORM/class.ilSCORMResourceFile.php");
00031 require_once("content/classes/SCORM/class.ilSCORMResourceDependency.php");
00032 require_once("content/classes/SCORM/class.ilSCORMTree.php");
00033
00043 class ilSCORMPackageParser extends ilSaxParser
00044 {
00045 var $cnt;
00046 var $current_element;
00047 var $slm_object;
00048 var $parent_stack;
00049 var $tree_created;
00050 var $scorm_tree;
00051 var $current_organization;
00052 var $current_resource;
00053 var $item_stack;
00054 var $package_title = "";
00055
00056
00064 function ilSCORMPackageParser(&$a_slm_object, $a_xml_file)
00065 {
00066 parent::ilSaxParser($a_xml_file);
00067 $this->cnt = array();
00068 $this->current_element = array();
00069 $this->slm_object =& $a_slm_object;
00070 $this->tree_created = false;
00071 $this->parent_stack = array();
00072 $this->item_stack = array();
00073 }
00074
00080 function setHandlers($a_xml_parser)
00081 {
00082 xml_set_object($a_xml_parser,$this);
00083 xml_set_element_handler($a_xml_parser,'handlerBeginTag','handlerEndTag');
00084 xml_set_character_data_handler($a_xml_parser,'handlerCharacterData');
00085 }
00086
00087 function startParsing()
00088 {
00089 parent::startParsing();
00090 }
00091
00092 function getPackageTitle()
00093 {
00094 return $this->package_title;
00095 }
00096
00097
00098
00099
00100 function beginElement($a_name)
00101 {
00102 if(!isset($this->status["$a_name"]))
00103 {
00104 $this->cnt[$a_name] == 1;
00105 }
00106 else
00107 {
00108 $this->cnt[$a_name]++;
00109 }
00110 $this->current_element[count($this->current_element)] = $a_name;
00111 }
00112
00113
00114
00115
00116 function endElement($a_name)
00117 {
00118 $this->cnt[$a_name]--;
00119 unset ($this->current_element[count($this->current_element) - 1]);
00120 }
00121
00122
00123
00124
00125 function getCurrentElement()
00126 {
00127 return ($this->current_element[count($this->current_element) - 1]);
00128 }
00129
00130
00131
00132
00133 function getAncestorElement($nr = 1)
00134 {
00135 return ($this->current_element[count($this->current_element) - 1 - $nr]);
00136 }
00137
00138
00139
00140
00141 function getOpenCount($a_name)
00142 {
00143 if (isset($this->cnt[$a_name]))
00144 {
00145 return $this->cnt[$a_name];
00146 }
00147 else
00148 {
00149 return 0;
00150 }
00151
00152 }
00153
00161 function buildTag ($type, $name, $attr="")
00162 {
00163 $tag = "<";
00164
00165 if ($type == "end")
00166 $tag.= "/";
00167
00168 $tag.= $name;
00169
00170 if (is_array($attr))
00171 {
00172 while (list($k,$v) = each($attr))
00173 $tag.= " ".$k."=\"$v\"";
00174 }
00175
00176 $tag.= ">";
00177
00178 return $tag;
00179 }
00180
00181 function getCurrentParent()
00182 {
00183 return $this->parent_stack[count($this->parent_stack) - 1];
00184 }
00185
00189 function handlerBeginTag($a_xml_parser,$a_name,$a_attribs)
00190 {
00191
00192 switch($a_name)
00193 {
00194 case "manifest":
00195 $manifest =& new ilSCORMManifest();
00196 $manifest->setSLMId($this->slm_object->getId());
00197 $manifest->setImportId($a_attribs["identifier"]);
00198 $manifest->setVersion($a_attribs["version"]);
00199 $manifest->setXmlBase($a_attribs["xml:base"]);
00200 $manifest->create();
00201 if (!$this->tree_created)
00202 {
00203 $this->sc_tree =& new ilSCORMTree($this->slm_object->getId());
00204 $this->sc_tree->addTree($this->slm_object->getId(), $manifest->getId());
00205 }
00206 else
00207 {
00208 $this->sc_tree->insertNode($manifest->getId(), $this->getCurrentParent());
00209 }
00210 array_push($this->parent_stack, $manifest->getId());
00211 break;
00212
00213 case "organizations":
00214 $organizations =& new ilSCORMOrganizations();
00215 $organizations->setSLMId($this->slm_object->getId());
00216 $organizations->setDefaultOrganization($a_attribs["default"]);
00217 $organizations->create();
00218 $this->sc_tree->insertNode($organizations->getId(), $this->getCurrentParent());
00219 array_push($this->parent_stack, $organizations->getId());
00220 break;
00221
00222 case "organization":
00223 $organization =& new ilSCORMOrganization();
00224 $organization->setSLMId($this->slm_object->getId());
00225 $organization->setImportId($a_attribs["identifier"]);
00226 $organization->setStructure($a_attribs["structure"]);
00227 $organization->create();
00228 $this->current_organization =& $organization;
00229 $this->sc_tree->insertNode($organization->getId(), $this->getCurrentParent());
00230 array_push($this->parent_stack, $organization->getId());
00231 break;
00232
00233 case "item":
00234 $item =& new ilSCORMItem();
00235 $item->setSLMId($this->slm_object->getId());
00236 $item->setImportId($a_attribs["identifier"]);
00237 $item->setIdentifierRef($a_attribs["identifierref"]);
00238 if (strtolower($a_attribs["isvisible"]) != "false")
00239 {
00240 $item->setVisible(true);
00241 }
00242 else
00243 {
00244 $item->setVisible(false);
00245 }
00246 $item->setParameters($a_attribs["parameters"]);
00247 $item->create();
00248 $this->sc_tree->insertNode($item->getId(), $this->getCurrentParent());
00249 array_push($this->parent_stack, $item->getId());
00250 $this->item_stack[count($this->item_stack)] =& $item;
00251 break;
00252
00253 case "adlcp:prerequisites":
00254 $this->item_stack[count($this->item_stack) - 1]->setPrereqType($a_attribs["type"]);
00255 break;
00256
00257 case "resources":
00258 $resources =& new ilSCORMResources();
00259 $resources->setSLMId($this->slm_object->getId());
00260 $resources->setXmlBase($a_attribs["xml:base"]);
00261 $resources->create();
00262 $this->sc_tree->insertNode($resources->getId(), $this->getCurrentParent());
00263 array_push($this->parent_stack, $resources->getId());
00264 break;
00265
00266 case "resource":
00267 $resource =& new ilSCORMResource();
00268 $resource->setSLMId($this->slm_object->getId());
00269 $resource->setImportId($a_attribs["identifier"]);
00270 $resource->setResourceType($a_attribs["type"]);
00271 $resource->setScormType($a_attribs["adlcp:scormtype"]);
00272 $resource->setXmlBase($a_attribs["xml:base"]);
00273 $resource->setHRef($a_attribs["href"]);
00274 $resource->create();
00275 $this->current_resource =& $resource;
00276 $this->sc_tree->insertNode($resource->getId(), $this->getCurrentParent());
00277 array_push($this->parent_stack, $resource->getId());
00278 break;
00279
00280 case "file":
00281 $file =& new ilSCORMResourceFile();
00282 $file->setHRef($a_attribs["href"]);
00283 $this->current_resource->addFile($file);
00284 break;
00285
00286 case "dependency":
00287 $dependency =& new ilSCORMResourceDependency();
00288 $dependency->setIdentifierRef($a_attribs["identifierref"]);
00289 $this->current_resource->addDependency($dependency);
00290 break;
00291
00292 }
00293 $this->beginElement($a_name);
00294 }
00295
00299 function handlerEndTag($a_xml_parser,$a_name)
00300 {
00301
00302
00303 switch($a_name)
00304 {
00305 case "manifest":
00306 case "organizations":
00307 case "resources":
00308 array_pop($this->parent_stack);
00309 break;
00310
00311 case "organization":
00312 $this->current_organization->update();
00313 array_pop($this->parent_stack);
00314 break;
00315
00316 case "item":
00317 $this->item_stack[count($this->item_stack) - 1]->update();
00318 unset($this->item_stack[count($this->item_stack) - 1]);
00319 array_pop($this->parent_stack);
00320 break;
00321
00322 case "resource":
00323 $this->current_resource->update();
00324 array_pop($this->parent_stack);
00325 break;
00326
00327 }
00328 $this->endElement($a_name);
00329
00330 }
00331
00335 function handlerCharacterData($a_xml_parser,$a_data)
00336 {
00337
00338
00339 $a_data = preg_replace("/\n/","",$a_data);
00340 $a_data = preg_replace("/\t+/","",$a_data);
00341 if(!empty($a_data))
00342 {
00343 switch($this->getCurrentElement())
00344 {
00345 case "title":
00346 switch ($this->getAncestorElement(1))
00347 {
00348 case "organization":
00349 $this->current_organization->setTitle(
00350 $this->current_organization->getTitle() . $a_data
00351 );
00352 $this->package_title = $this->current_organization->getTitle();
00353 break;
00354
00355 case "item":
00356 $this->item_stack[count($this->item_stack) - 1]->setTitle(
00357 $this->item_stack[count($this->item_stack) - 1]->getTitle() . $a_data
00358 );
00359 break;
00360 }
00361 break;
00362
00363 case "adlcp:prerequisites":
00364 $this->item_stack[count($this->item_stack) - 1]->setPrerequisites($a_data);
00365 break;
00366
00367 case "adlcp:maxtimeallowed":
00368 $this->item_stack[count($this->item_stack) - 1]->setMaxTimeAllowed($a_data);
00369 break;
00370
00371 case "adlcp:timelimitaction":
00372 $this->item_stack[count($this->item_stack) - 1]->setTimeLimitAction($a_data);
00373 break;
00374
00375 case "adlcp:datafromlms":
00376 $this->item_stack[count($this->item_stack) - 1]->setDataFromLms($a_data);
00377 break;
00378
00379 case "adlcp:masteryscore":
00380 $this->item_stack[count($this->item_stack) - 1]->setMasteryScore($a_data);
00381 break;
00382
00383 }
00384 }
00385 }
00386 }
00387 ?>