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