ILIAS  release_5-2 Revision v5.2.25-18-g3f80b828510
class.ilSCORM13MDImporter.php
Go to the documentation of this file.
1 <?php
2 
3 /* Copyright (c) 1998-2014 ILIAS open source, Extended GPL, see docs/LICENSE */
4 
5 include_once 'Services/MetaData/classes/class.ilMDXMLCopier.php';
6 
15 {
16  protected $manifest_dom;
17  protected $metadata_found = false;
18  protected $path = array();
19  protected $title = ""; // overall title extracted from manifest
20  protected $description = ""; // overall description extracted from manifest
21 
28  function __construct($a_manifest_dom, $a_obj_id)
29  {
30  $this->manifest_dom = $a_manifest_dom;
31  $path = new DOMXpath($a_manifest_dom);
32  $path->registerNamespace("ims","http://www.imsproject.org/xsd/imscp_rootv1p1p2");
33  $items = $path->query("//ims:manifest/ims:metadata");
34  if($items->length == 1)
35  {
36  foreach($items as $i)
37  {
38  //echo htmlentities($a_manifest_dom->saveXML($i)); exit;
39  parent::__construct($a_manifest_dom->saveXML($i), $a_obj_id,$a_obj_id,ilObject::_lookupType($a_obj_id));
40  $this->metadata_found = true;
41  }
42  }
43  }
44 
50  function setTitle($a_val)
51  {
52  $this->title = $a_val;
53  }
54 
60  function getTitle()
61  {
62  return $this->title;
63  }
64 
70  function setDescription($a_val)
71  {
72  $this->description = $a_val;
73  }
74 
80  function getDescription()
81  {
82  return $this->description;
83  }
84 
91  function import()
92  {
93  if ($this->metadata_found)
94  {
95  $this->startParsing();
96  $this->getMDObject()->update();
97  }
98  }
99 
103  function handlerBeginTag($a_xml_parser,$a_name,$a_attribs)
104  {
105  include_once 'Services/MetaData/classes/class.ilMDLanguageItem.php';
106 //echo "<br>BEGIN:".$a_name;
107  $this->path[count($this->path)] = $a_name;
108 
109  if(!$this->getMDParsingStatus())
110  {
111  return;
112  }
113 
114  switch($a_name)
115  {
116  case 'metadata':
117  $this->md_in_md = true;
118  $this->in_meta_data = true;
119  $this->__pushParent($this->md);
120  break;
121 
122  case 'general':
123  $this->md_gen = $this->md->addGeneral();
124  $this->md_gen->save();
125  $this->__pushParent($this->md_gen);
126  break;
127 
128  case 'identifier':
129  if ($this->in("general"))
130  {
131  $par = $this->__getParent();
132  $this->md_ide = $par->addIdentifier();
133  $this->md_ide->save();
134  $this->__pushParent($this->md_ide);
135  }
136  break;
137 
138  case 'title':
139  // nothing to do here
140  break;
141 
142  case 'language':
143  if ($this->in("general"))
144  {
145  $par = $this->__getParent();
146  $this->md_lan = $par->addLanguage();
147  $this->md_lan->save();
148  $this->__pushParent($this->md_lan);
149  }
150  break;
151 
152  case 'description':
153  $par = $this->__getParent();
154 
155  if(strtolower(get_class($par)) == 'ilmdrights' or
156  strtolower(get_class($par)) == 'ilmdannotation' or
157  strtolower(get_class($par)) == 'ilmdclassification')
158  {
159  // todo
160 // $par->setDescriptionLanguage(new ilMDLanguageItem($a_attribs['Language']));
161  }
162  else if ($this->in("general"))
163  {
164  $this->md_des = $par->addDescription();
165  $this->md_des->save();
166  $this->__pushParent($this->md_des);
167  }
168  break;
169 
170  case 'keyword':
171  if ($this->in("general"))
172  {
173  $par = $this->__getParent();
174  $this->md_key = $par->addKeyword();
175  $this->md_key->save();
176  $this->__pushParent($this->md_key);
177  }
178  break;
179 
180  // todo
181  /*case 'Coverage':
182  $par =& $this->__getParent();
183  $par->setCoverageLanguage(new ilMDLanguageItem($a_attribs['Language']));
184  break;*/
185 
186  case 'lifeCycle':
187  $par = $this->__getParent();
188  $this->md_lif = $par->addLifecycle();
189  //$this->md_lif->setStatus($a_attribs['Status']);
190  $this->md_lif->save();
191  $this->__pushParent($this->md_lif);
192  break;
193 
194  case 'version':
195  // nothing to do here
196  break;
197 
198  /*case 'metaMetadata':
199  $par = $this->__getParent();
200  $this->md_met = $par->addMetaMetadata();
201  $this->md_met->setMetaDataScheme($a_attribs['MetadataScheme']);
202  $this->md_met->setLanguage(new ilMDLanguageItem($a_attribs['Language']));
203  $this->md_met->save();
204  $this->__pushParent($this->md_met);
205  break;*/
206 
207  // todo
208  /*case 'Contribute':
209  $par =& $this->__getParent();
210  $this->md_con =& $par->addContribute();
211  $this->md_con->setRole($a_attribs['Role']);
212  $this->md_con->save();
213  $this->__pushParent($this->md_con);
214  break;
215 
216  case 'Entity':
217  $par =& $this->__getParent();
218 
219  if(strtolower(get_class($par)) == 'ilmdcontribute')
220  {
221  $this->md_ent =& $par->addEntity();
222  $this->md_ent->save();
223  $this->__pushParent($this->md_ent);
224  break;
225  }
226  else
227  {
228  // single element in 'Annotation'
229  break;
230  }
231  case 'Date':
232  break;
233 
234 
235  case 'Technical':
236  $par =& $this->__getParent();
237  $this->md_tec =& $par->addTechnical();
238  $this->md_tec->save();
239  $this->__pushParent($this->md_tec);
240  break;
241 
242  case 'Format':
243  $par =& $this->__getParent();
244  $this->md_for =& $par->addFormat();
245  $this->md_for->save();
246  $this->__pushParent($this->md_for);
247  break;
248 
249  case 'Size':
250  break;
251 
252  case 'Location':
253  $par =& $this->__getParent();
254  $this->md_loc =& $par->addLocation();
255  $this->md_loc->setLocationType($a_attribs['Type']);
256  $this->md_loc->save();
257  $this->__pushParent($this->md_loc);
258  break;
259 
260  case 'Requirement':
261  $par =& $this->__getParent();
262  $this->md_req =& $par->addRequirement();
263  $this->md_req->save();
264  $this->__pushParent($this->md_req);
265  break;
266 
267  case 'OrComposite':
268  $par =& $this->__getParent();
269  $this->md_orc =& $par->addOrComposite();
270  $this->__pushParent($this->md_orc);
271  break;
272 
273  case 'Type':
274  break;
275 
276  case 'OperatingSystem':
277  $par =& $this->__getParent();
278  $par->setOperatingSystemName($a_attribs['Name']);
279  $par->setOperatingSystemMinimumVersion($a_attribs['MinimumVersion']);
280  $par->setOperatingSystemMaximumVersion($a_attribs['MaximumVersion']);
281  break;
282 
283  case 'Browser':
284  $par =& $this->__getParent();
285  $par->setBrowserName($a_attribs['Name']);
286  $par->setBrowserMinimumVersion($a_attribs['MinimumVersion']);
287  $par->setBrowserMaximumVersion($a_attribs['MaximumVersion']);
288  break;
289 
290  case 'InstallationRemarks':
291  $par =& $this->__getParent();
292  $par->setInstallationRemarksLanguage(new ilMDLanguageItem($a_attribs['Language']));
293  break;
294 
295  case 'OtherPlatformRequirements':
296  $par =& $this->__getParent();
297  $par->setOtherPlatformRequirementsLanguage(new ilMDLanguageItem($a_attribs['Language']));
298  break;
299 
300  case 'Duration':
301  break;
302 
303  case 'Educational':
304  $par =& $this->__getParent();
305  $this->md_edu =& $par->addEducational();
306  $this->md_edu->setInteractivityType($a_attribs['InteractivityType']);
307  $this->md_edu->setLearningResourceType($a_attribs['LearningResourceType']);
308  $this->md_edu->setInteractivityLevel($a_attribs['InteractivityLevel']);
309  $this->md_edu->setSemanticDensity($a_attribs['SemanticDensity']);
310  $this->md_edu->setIntendedEndUserRole($a_attribs['IntendedEndUserRole']);
311  $this->md_edu->setContext($a_attribs['Context']);
312  $this->md_edu->setDifficulty($a_attribs['Difficulty']);
313  $this->md_edu->save();
314  $this->__pushParent($this->md_edu);
315  break;
316 
317  case 'TypicalAgeRange':
318  $par =& $this->__getParent();
319  $this->md_typ =& $par->addTypicalAgeRange();
320  $this->md_typ->setTypicalAgeRangeLanguage(new ilMDLanguageItem($a_attribs['Language']));
321  $this->md_typ->save();
322  $this->__pushParent($this->md_typ);
323  break;
324 
325  case 'TypicalLearningTime':
326  break;
327 
328  case 'Rights':
329  $par =& $this->__getParent();
330  $this->md_rig =& $par->addRights();
331  $this->md_rig->setCosts($a_attribs['Cost']);
332  $this->md_rig->setCopyrightAndOtherRestrictions($a_attribs['CopyrightAndOtherRestrictions']);
333  $this->md_rig->save();
334  $this->__pushParent($this->md_rig);
335  break;
336 
337  case 'Relation':
338  $par =& $this->__getParent();
339  $this->md_rel =& $par->addRelation();
340  $this->md_rel->setKind($a_attribs['Kind']);
341  $this->md_rel->save();
342  $this->__pushParent($this->md_rel);
343  break;
344 
345  case 'Resource':
346  break;
347 
348  case 'Identifier_':
349  $par =& $this->__getParent();
350  $this->md_ide_ =& $par->addIdentifier_();
351  $this->md_ide_->setCatalog($a_attribs['Catalog']);
352  $this->md_ide_->setEntry($a_attribs['Entry']);
353  $this->md_ide_->save();
354  $this->__pushParent($this->md_ide_);
355  break;
356 
357  case 'Annotation':
358  $par =& $this->__getParent();
359  $this->md_ann =& $par->addAnnotation();
360  $this->md_ann->save();
361  $this->__pushParent($this->md_ann);
362  break;
363 
364  case 'Classification':
365  $par =& $this->__getParent();
366  $this->md_cla =& $par->addClassification();
367  $this->md_cla->setPurpose($a_attribs['Purpose']);
368  $this->md_cla->save();
369  $this->__pushParent($this->md_cla);
370  break;
371 
372  case 'TaxonPath':
373  $par =& $this->__getParent();
374  $this->md_taxp =& $par->addTaxonPath();
375  $this->md_taxp->save();
376  $this->__pushParent($this->md_taxp);
377  break;
378 
379  case 'Source':
380  $par =& $this->__getParent();
381  $par->setSourceLanguage(new ilMDLanguageItem($a_attribs['Language']));
382  break;
383 
384  case 'Taxon':
385  $par =& $this->__getParent();
386  $this->md_tax =& $par->addTaxon();
387  $this->md_tax->setTaxonLanguage(new ilMDLanguageItem($a_attribs['Language']));
388  $this->md_tax->setTaxonId($a_attribs['Id']);
389  $this->md_tax->save();
390  $this->__pushParent($this->md_tax);
391  break;
392  */
393 
394  case 'string':
395  $par = $this->__getParent();
396  if ($this->in("general"))
397  {
398  if ($this->in("title"))
399  {
400  $par->setTitleLanguage(new ilMDLanguageItem($a_attribs['language']));
401  $par->update();
402  }
403  else if ($this->in("description"))
404  {
405  $this->md_des->setDescriptionLanguage(new ilMDLanguageItem($a_attribs['language']));
406  $this->md_des->update();
407  }
408  else if ($this->in("keyword"))
409  {
410  $this->md_key->setKeywordLanguage(new ilMDLanguageItem($a_attribs['language']));
411  $this->md_key->update();
412  }
413  }
414  if ($this->in("lifeCycle"))
415  {
416  if ($this->in("version"))
417  {
418  $par->setVersionLanguage(new ilMDLanguageItem($a_attribs['language']));
419  }
420  }
421 
422  break;
423 
424  }
425  }
426 
430  function handlerEndTag($a_xml_parser,$a_name)
431  {
432 //echo "<br>End TAG: ".$a_name;
433  unset($this->path[count($this->path) - 1]);
434 
435  if(!$this->getMDParsingStatus())
436  {
437  return;
438  }
439  switch($a_name)
440  {
441  case 'metadata':
442  $this->md_parent = array();
443  $this->md_in_md = false;
444  $this->in_meta_data = false;
445  break;
446 
447  case 'general':
448  $par = $this->__getParent();
449  $par->update();
450  $this->__popParent();
451  break;
452 
453  case 'identifier':
454  if ($this->in("general"))
455  {
456  $par = $this->__getParent();
457  $par->update();
458  $this->__popParent();
459  }
460  break;
461 
462  case 'title':
463  // nothing to do here
464  break;
465 
466  case 'language':
467  if ($this->in("general"))
468  {
469  $par = $this->__getParent();
470  $par->setLanguage(new ilMDLanguageItem($this->__getCharacterData()));
471  $par->update();
472  $this->__popParent();
473  }
474  break;
475 
476  case 'description':
477  $par = $this->__getParent();
478  if(strtolower(get_class($par)) == 'ilmddescription')
479  {
480  $this->__popParent();
481  break;
482  }
483  else
484  {
485  // todo
486 // $par->setDescription($this->__getCharacterData());
487  break;
488  }
489 
490  case 'keyword':
491  if ($this->in("general"))
492  {
493  $this->__popParent();
494  }
495  break;
496 
497  // todo
498  /*case 'Coverage':
499  $par =& $this->__getParent();
500  $par->setCoverage($this->__getCharacterData());
501  break;*/
502 
503  case 'lifeCycle':
504  $par = $this->__getParent();
505  $par->update();
506  $this->__popParent();
507  break;
508 
509  case 'version':
510  // nothing to do here
511  break;
512 
513 
514  // todo
515  /*case 'Contribute':
516  $par =& $this->__getParent();
517  $par->update();
518  $this->__popParent();
519  break;
520 
521  case 'Entity':
522  $par =& $this->__getParent();
523 
524  if(strtolower(get_class($par)) == 'ilmdentity')
525  {
526  $par->setEntity($this->__getCharacterData());
527  $par->update();
528  $this->__popParent();
529  }
530  else
531  {
532  // Single element in 'Annotation'
533  $par->setEntity($this->__getCharacterData());
534  }
535  break;
536 
537  case 'Date':
538  $par =& $this->__getParent();
539  $par->setDate($this->__getCharacterData());
540  break;
541 
542  case 'Meta-Metadata':
543  $par =& $this->__getParent();
544  $par->update();
545  $this->__popParent();
546  break;
547 
548  case 'Technical':
549  $par =& $this->__getParent();
550  $par->update();
551  $this->__popParent();
552  break;
553 
554  case 'Format':
555  $par =& $this->__getParent();
556  $par->setFormat($this->__getCharacterData());
557  $par->update();
558  $this->__popParent();
559  break;
560 
561  case 'Size':
562  $par =& $this->__getParent();
563  $par->setSize($this->__getCharacterData());
564  break;
565 
566  case 'Location':
567  $par =& $this->__getParent();
568  $par->setLocation($this->__getCharacterData());
569  $par->update();
570  $this->__popParent();
571  break;
572 
573  case 'Requirement':
574  $par =& $this->__getParent();
575  $par->update();
576  $this->__popParent();
577  break;
578 
579  case 'OrComposite':
580  $this->__popParent();
581  break;
582 
583  case 'Type':
584  break;
585 
586  case 'OperatingSystem':
587  break;
588 
589  case 'Browser':
590  break;
591 
592  case 'InstallationRemarks':
593  $par =& $this->__getParent();
594  $par->setInstallationRemarks($this->__getCharacterData());
595  break;
596 
597  case 'OtherPlatformRequirements':
598  $par =& $this->__getParent();
599  $par->setOtherPlatformRequirements($this->__getCharacterData());
600  break;
601 
602  case 'Duration':
603  $par =& $this->__getParent();
604  $par->setDuration($this->__getCharacterData());
605  break;
606 
607  case 'Educational':
608  $par =& $this->__getParent();
609  $par->update();
610  $this->__popParent();
611  break;
612 
613  case 'TypicalAgeRange':
614  $par =& $this->__getParent();
615  $par->setTypicalAgeRange($this->__getCharacterData());
616  $par->update();
617  $this->__popParent();
618  break;
619 
620  case 'TypicalLearningTime':
621  $par =& $this->__getParent();
622  $par->setTypicalLearningTime($this->__getCharacterData());
623  break;
624 
625  case 'Rights':
626  $par =& $this->__getParent();
627  $par->update();
628  $this->__popParent();
629  break;
630 
631  case 'Relation':
632  $par =& $this->__getParent();
633  $par->update();
634  $this->__popParent();
635  break;
636 
637  case 'Resource':
638  break;
639 
640  case 'Identifier_':
641  $par =& $this->__getParent();
642  $par->update();
643  $this->__popParent();
644  break;
645 
646  case 'Annotation':
647  $par =& $this->__getParent();
648  $par->update();
649  $this->__popParent();
650  break;
651 
652  case 'Classification':
653  $par =& $this->__getParent();
654  $par->update();
655  $this->__popParent();
656  break;
657 
658  case 'TaxonPath':
659  $par =& $this->__getParent();
660  $par->update();
661  $this->__popParent();
662  break;
663 
664  case 'Taxon':
665  $par =& $this->__getParent();
666  $par->setTaxon($this->__getCharacterData());
667  $par->update();
668  $this->__popParent();
669  break;
670 
671  case 'Source':
672  $par =& $this->__getParent();
673  $par->setSource($this->__getCharacterData());
674  break;
675  */
676 
677  case 'string':
678  $par = $this->__getParent();
679  if ($this->in("general"))
680  {
681  if ($this->in("title"))
682  {
683  // set packaget title to first title
684  if ($this->getTitle() == "")
685  {
686  $this->setTitle($this->__getCharacterData());
687  }
688 
689  // parent is General here
690  $par->setTitle($this->__getCharacterData());
691  $par->update();
692  //echo "<br>setTitle (".get_class($par)."): ".$this->__getCharacterData();
693  }
694  if ($this->in("description"))
695  {
696  // set packaget title to first title
697  if ($this->getDescription() == "")
698  {
699  $this->setDescription($this->__getCharacterData());
700  }
701 
702  $this->md_des->setDescription($this->__getCharacterData());
703  $this->md_des->update();
704  }
705  if ($this->in("keyword"))
706  {
707  $par->setKeyword($this->__getCharacterData());
708  $par->update();
709  }
710  }
711  if ($this->in("lifeCycle"))
712  {
713  if ($this->in("version"))
714  {
715  $par->setVersion($this->__getCharacterData());
716  }
717  }
718  break;
719 
720  case 'value':
721  $par = $this->__getParent();
722  if ($this->in("general"))
723  {
724  if ($this->in("structure"))
725  {
726  $map = array (
727  "atomic" => "Atomic",
728  "collection" => "Collection",
729  "networked" => "Networked",
730  "linear" => "Linear",
731  "hierarchical" => "Hierarchical"
732  );
733  if (isset($map[$this->__getCharacterData()]))
734  {
735  // parent is General here
736  $par->setStructure($map[$this->__getCharacterData()]);
737  $par->update();
738  }
739  }
740  }
741  if ($this->in("lifeCycle"))
742  {
743  if ($this->in("status"))
744  {
745  $map = array (
746  "draft" => "Draft",
747  "revised" => "Revised",
748  "unavailable" => "Unavailable",
749  "final" => "Final"
750  );
751  if (isset($map[$this->__getCharacterData()]))
752  {
753  $this->md_lif->setStatus($map[$this->__getCharacterData()]);
754  $this->md_lif->update();
755  }
756  }
757  }
758  break;
759 
760  case 'catalog':
761  if ($this->in("identifier"))
762  {
763  $this->md_ide->setCatalog($this->__getCharacterData());
764  $this->md_ide->update();
765  }
766  break;
767 
768  case 'entry':
769  if ($this->in("identifier"))
770  {
771  $this->md_ide->setEntry($this->__getCharacterData());
772  $this->md_ide->update();
773  }
774  break;
775 
776  }
777  $this->md_chr_data = '';
778  }
779 
786  function in($a_name)
787  {
788 // echo "<br>"; var_dump($this->path);
789  if (in_array($a_name, $this->path))
790  {
791  return true;
792  }
793  return false;
794  }
795 
796 }
797 
798 ?>
setDescription($a_val)
Set description.
__construct($a_manifest_dom, $a_obj_id)
Constructor.
startParsing()
stores xml data in array
SCORM 13 Metadata importer.
handlerEndTag($a_xml_parser, $a_name)
handler for end of element
Create styles array
The data for the language used.
static _lookupType($a_id, $a_reference=false)
lookup object type
handlerBeginTag($a_xml_parser, $a_name, $a_attribs)
handler for begin of element
getDescription()
Get description.