ILIAS  release_5-4 Revision v5.4.26-12-gabc799a52e6
class.ilObjMediaObject.php
Go to the documentation of this file.
1<?php
2/* Copyright (c) 1998-2009 ILIAS open source, Extended GPL, see docs/LICENSE */
3
4define("IL_MODE_ALIAS", 1);
5define("IL_MODE_OUTPUT", 2);
6define("IL_MODE_FULL", 3);
7
8require_once("./Services/MediaObjects/classes/class.ilMediaItem.php");
9include_once "./Services/Object/classes/class.ilObject.php";
10
27{
31 protected $user;
32
37
38 public $is_alias;
39 public $origin_id;
40 public $id;
43
48 public function __construct($a_id = 0)
49 {
50 global $DIC;
51
52 $this->user = $DIC->user();
53 $this->app_event_handler = $DIC["ilAppEventHandler"];
54 $this->lng = $DIC->language();
55 $this->is_alias = false;
56 $this->media_items = array();
57 $this->contains_int_link = false;
58 $this->type = "mob";
59 parent::__construct($a_id, false);
60 }
61
62 public function setRefId($a_id)
63 {
64 $this->ilias->raiseError("Operation ilObjMedia::setRefId() not allowed.", $this->ilias->error_obj->FATAL);
65 }
66
67 public function getRefId()
68 {
69 return false;
70 }
71
72 public function putInTree($a_parent_ref)
73 {
74 $this->ilias->raiseError("Operation ilObjMedia::putInTree() not allowed.", $this->ilias->error_obj->FATAL);
75 }
76
77 public function createReference()
78 {
79 $this->ilias->raiseError("Operation ilObjMedia::createReference() not allowed.", $this->ilias->error_obj->FATAL);
80 }
81
82 public function setTitle($a_title)
83 {
84 parent::setTitle($a_title);
85 }
86
87 public function getTitle()
88 {
89 return parent::getTitle();
90 }
91
99 public static function _exists($a_id, $a_reference = false, $a_type = null)
100 {
101 global $DIC;
102
103 $ilDB = $DIC->database();
104
105 include_once("./Services/Link/classes/class.ilInternalLink.php");
106 if (is_int(strpos($a_id, "_"))) {
108 }
109
110 if (parent::_exists($a_id, false) && ilObject::_lookupType($a_id) == "mob") {
111 return true;
112 }
113 return false;
114 }
115
119 public function delete()
120 {
121 $mob_logger = ilLoggerFactory::getLogger('mob');
122 $mob_logger->debug("ilObjMediaObject: Delete called for media object ID '" . $this->getId() . "'.");
123
124 if (!($this->getId() > 0)) {
125 return;
126 }
127
128 $usages = $this->getUsages();
129
130 $mob_logger->debug("ilObjMediaObject: ... Found " . count($usages) . " usages.");
131
132 if (count($usages) == 0) {
133 // remove directory
135
136 // remove thumbnail directory
138
139 // delete meta data of mob
140 $this->deleteMetaData();
141
142 // delete media items
144
145 // this is just to make sure, there should be no entries left at
146 // this point as they depend on the usage
148
149 // delete object
150 parent::delete();
151
152 $mob_logger->debug("ilObjMediaObject: ... deleted.");
153 } else {
154 foreach ($usages as $u) {
155 $mob_logger->debug("ilObjMediaObject: ... usage type:" . $u["type"] .
156 ", id:" . $u["id"] .
157 ", lang:" . $u["lang"] .
158 ", hist_nr:" . $u["hist_nr"] . ".");
159 }
160 $mob_logger->debug("ilObjMediaObject: ... not deleted.");
161 }
162 }
163
169 public function getDescription()
170 {
171 return parent::getDescription();
172 }
173
177 public function setDescription($a_description)
178 {
179 parent::setDescription($a_description);
180 }
181
193 public function MDUpdateListener($a_element)
194 {
195 include_once 'Services/MetaData/classes/class.ilMD.php';
196
197 switch ($a_element) {
198 case 'General':
199
200 // Update Title and description
201 $md = new ilMD(0, $this->getId(), $this->getType());
202 $md_gen = $md->getGeneral();
203
204 if (is_object($md_gen)) {
205 ilObject::_writeTitle($this->getId(), $md_gen->getTitle());
206 $this->setTitle($md_gen->getTitle());
207
208 foreach ($md_gen->getDescriptionIds() as $id) {
209 $md_des = $md_gen->getDescription($id);
210 ilObject::_writeDescription($this->getId(), $md_des->getDescription());
211 $this->setDescription($md_des->getDescription());
212 break;
213 }
214 }
215
216 break;
217
218 default:
219 }
220 return true;
221 }
222
226 public function createMetaData()
227 {
228 include_once 'Services/MetaData/classes/class.ilMDCreator.php';
229
231
232 $md_creator = new ilMDCreator(0, $this->getId(), $this->getType());
233 $md_creator->setTitle($this->getTitle());
234 $md_creator->setTitleLanguage($ilUser->getPref('language'));
235 $md_creator->setDescription($this->getDescription());
236 $md_creator->setDescriptionLanguage($ilUser->getPref('language'));
237 $md_creator->setKeywordLanguage($ilUser->getPref('language'));
238 $md_creator->setLanguage($ilUser->getPref('language'));
239 $md_creator->create();
240
241 return true;
242 }
243
247 public function updateMetaData()
248 {
249 include_once("Services/MetaData/classes/class.ilMD.php");
250 include_once("Services/MetaData/classes/class.ilMDGeneral.php");
251 include_once("Services/MetaData/classes/class.ilMDDescription.php");
252
253 $md = new ilMD(0, $this->getId(), $this->getType());
254 $md_gen = $md->getGeneral();
255 $md_gen->setTitle($this->getTitle());
256
257 // sets first description (maybe not appropriate)
258 $md_des_ids = $md_gen->getDescriptionIds();
259 if (count($md_des_ids) > 0) {
260 $md_des = $md_gen->getDescription($md_des_ids[0]);
261 $md_des->setDescription($this->getDescription());
262 $md_des->update();
263 }
264 $md_gen->update();
265 }
266
270 public function deleteMetaData()
271 {
272 // Delete meta data
273 include_once('Services/MetaData/classes/class.ilMD.php');
274 $md = new ilMD(0, $this->getId(), $this->getType());
275 $md->deleteAll();
276 }
277
278
284 public function addMediaItem($a_item)
285 {
286 $this->media_items[] = $a_item;
287 }
288
289
295 public function &getMediaItems()
296 {
297 return $this->media_items;
298 }
299
306 public function &getMediaItem($a_purpose)
307 {
308 foreach ($this->media_items as $media_item) {
309 if ($media_item->getPurpose() == $a_purpose) {
310 return $media_item;
311 }
312 }
313 return false;
314 }
315
316
320 public function removeMediaItem($a_purpose)
321 {
322 foreach ($this->media_items as $key => $media_item) {
323 if ($media_item->getPurpose() == $a_purpose) {
324 unset($this->media_items[$key]);
325 }
326 }
327 // update numbers and keys
328 $i = 1;
329 $media_items = array();
330 foreach ($this->media_items as $media_item) {
331 $media_items [$i] = $media_item;
332 $media_item->setMobId($this->getId());
333 $media_item->setNr($i);
334 $i++;
335 }
336 $this->media_items = $media_items;
337 }
338
342 public function removeAllMediaItems()
343 {
344 $this->media_items = array();
345 }
346
347
348 public function getMediaItemNr($a_purpose)
349 {
350 for ($i = 0; $i < count($this->media_items); $i++) {
351 if ($this->media_items[$i]->getPurpose() == $a_purpose) {
352 return $i + 1;
353 }
354 }
355 return false;
356 }
357
358
359 public function hasFullscreenItem()
360 {
361 return $this->hasPurposeItem("Fullscreen");
362 }
363
370 public function hasPurposeItem($purpose)
371 {
372 if (is_object($this->getMediaItem($purpose))) {
373 return true;
374 } else {
375 return false;
376 }
377 }
378
379
380
384 public function read()
385 {
386 //echo "<br>ilObjMediaObject:read";
387 parent::read();
388
389 // get media items
391 }
392
396 public function setId($a_id)
397 {
398 $this->id = $a_id;
399 }
400
401 public function getId()
402 {
403 return $this->id;
404 }
405
409 public function setAlias($a_is_alias)
410 {
411 $this->is_alias = $a_is_alias;
412 }
413
414 public function isAlias()
415 {
416 return $this->is_alias;
417 }
418
419 public function setOriginID($a_id)
420 {
421 return $this->origin_id = $a_id;
422 }
423
424 public function getOriginID()
425 {
426 return $this->origin_id;
427 }
428
429 /*
430 function getimportId()
431 {
432 return $this->meta_data->getImportIdentifierEntryID();
433 }*/
434
435
439 public function getImportId()
440 {
441 return $this->import_id;
442 }
443
444 public function setImportId($a_id)
445 {
446 $this->import_id = $a_id;
447 }
448
452 public function create($a_create_meta_data = false, $a_save_media_items = true)
453 {
454 parent::create();
455
456 if (!$a_create_meta_data) {
457 $this->createMetaData();
458 }
459
460 if ($a_save_media_items) {
461 $media_items = $this->getMediaItems();
462 for ($i = 0; $i < count($media_items); $i++) {
463 $item = $media_items[$i];
464 $item->setMobId($this->getId());
465 $item->setNr($i + 1);
466 $item->create();
467 }
468 }
469
471
472 $ilAppEventHandler = $this->app_event_handler;
473 $ilAppEventHandler->raise(
474 'Services/MediaObjects',
475 'create',
476 array('object' => $this,
477 'obj_type' => 'mob',
478 'obj_id' => $this->getId())
479 );
480 }
481
482
486 public function update($a_upload = false)
487 {
489
490 if (!$a_upload) {
491 $this->updateMetaData();
492 }
493
495
496 // iterate all items
497 $media_items = $this->getMediaItems();
498 $j = 1;
499 foreach ($media_items as $key => $val) {
500 $item = $media_items[$key];
501 if (is_object($item)) {
502 $item->setMobId($this->getId());
503 $item->setNr($j);
504 if ($item->getLocationType() == "Reference") {
505 $item->extractUrlParameters();
506 }
507 $item->create();
508 $j++;
509 }
510 }
511
513 $ilAppEventHandler = $this->app_event_handler;
514 $ilAppEventHandler->raise(
515 'Services/MediaObjects',
516 'update',
517 array('object' => $this,
518 'obj_type' => 'mob',
519 'obj_id' => $this->getId())
520 );
521 }
522
523 protected static function handleQuotaUpdate(ilObjMediaObject $a_mob)
524 {
525 global $DIC;
526
527 $ilSetting = $DIC->settings();
528
529 // if neither workspace nor portfolios are activated, we skip
530 // the quota update here. this due to performance reasons on installations
531 // that do not use workspace/portfolios, but heavily copy content.
532 // in extreme cases (media object in pool and personal blog, deactivate workspace, change media object,
533 // this may lead to incorrect data in the quota calculation)
534 if ($ilSetting->get("disable_personal_workspace") && !$ilSetting->get('user_portfolios')) {
535 return;
536 }
537
538 $parent_obj_ids = array();
539 foreach ($a_mob->getUsages() as $item) {
540 $parent_obj_id = $a_mob->getParentObjectIdForUsage($item);
541 if ($parent_obj_id &&
542 !in_array($parent_obj_id, $parent_obj_ids)) {
543 $parent_obj_ids[] = $parent_obj_id;
544 }
545 }
546
547 // we could suppress this if object is present in a (repository) media pool
548 // but this would lead to "quota-breaches" when the pool item is deleted
549 // and "suddenly" all workspace owners get filesize added to their
550 // respective quotas, regardless of current status
551
552 include_once "Services/DiskQuota/classes/class.ilDiskQuotaHandler.php";
554 $a_mob->getType(),
555 $a_mob->getId(),
556 ilUtil::dirSize($a_mob->getDataDirectory()),
557 $parent_obj_ids
558 );
559 }
560
567 public static function _getDirectory($a_mob_id)
568 {
569 return ilUtil::getWebspaceDir() . "/" . self::_getRelativeDirectory($a_mob_id);
570 }
571
578 public static function _getRelativeDirectory($a_mob_id)
579 {
580 return "mobs/mm_" . $a_mob_id;
581 }
582
583
589 public static function _getURL($a_mob_id)
590 {
591 return ilUtil::getHtmlPath(ilUtil::getWebspaceDir() . "/mobs/mm_" . $a_mob_id);
592 }
593
599 public static function _getThumbnailDirectory($a_mob_id, $a_mode = "filesystem")
600 {
601 return ilUtil::getWebspaceDir($a_mode) . "/thumbs/mm_" . $a_mob_id;
602 }
603
609 public static function _lookupStandardItemPath(
610 $a_mob_id,
611 $a_url_encode = false,
612 $a_web = true
613 ) {
614 return ilObjMediaObject::_lookupItemPath($a_mob_id, $a_url_encode, $a_web, "Standard");
615 }
616
622 public static function _lookupItemPath(
623 $a_mob_id,
624 $a_url_encode = false,
625 $a_web = true,
626 $a_purpose = ""
627 ) {
628 if ($a_purpose == "") {
629 $a_purpose = "Standard";
630 }
631 $location = ilMediaItem::_lookupLocationForMobId($a_mob_id, $a_purpose);
632 if (preg_match("/https?\:/i", $location)) {
633 return $location;
634 }
635
636 if ($a_url_encode) {
637 $location = rawurlencode($location);
638 }
639
640 $path = ($a_web)
641 ? ILIAS_HTTP_PATH
642 : ".";
643
644 return $path . "/data/" . CLIENT_ID . "/mobs/mm_" . $a_mob_id . "/" . $location;
645 }
646
650 public function createDirectory()
651 {
654 if (!is_dir($path)) {
655 $this->ilias->raiseError("Failed to create directory $path.", $this->ilias->error_obj->FATAL);
656 }
657 }
658
662 public static function _createThumbnailDirectory($a_obj_id)
663 {
665 ilUtil::createDirectory(ilUtil::getWebspaceDir() . "/thumbs/mm_" . $a_obj_id);
666 }
667
674 public function getFilesOfDirectory($a_subdir = "")
675 {
676 $a_subdir = str_replace("..", "", $a_subdir);
677 $dir = ilObjMediaObject::_getDirectory($this->getId());
678 if ($a_subdir != "") {
679 $dir .= "/" . $a_subdir;
680 }
681
682 $files = array();
683 if (is_dir($dir)) {
684 $entries = ilUtil::getDir($dir);
685 foreach ($entries as $e) {
686 if (is_file($dir . "/" . $e["entry"]) && $e["entry"] != "." && $e["entry"] != "..") {
687 $files[] = $e["entry"];
688 }
689 }
690 }
691
692 return $files;
693 }
694
695
700 public function getXML($a_mode = IL_MODE_FULL, $a_inst = 0, $a_sign_locals = false)
701 {
703
704 // TODO: full implementation of all parameters
705 //echo "-".$a_mode."-";
706 switch ($a_mode) {
707 case IL_MODE_ALIAS:
708 $xml = "<MediaObject>";
709 $xml .= "<MediaAlias OriginId=\"il__mob_" . $this->getId() . "\"/>";
710 $media_items = $this->getMediaItems();
711 for ($i = 0; $i < count($media_items); $i++) {
712 $item = $media_items[$i];
713 $xml .= "<MediaAliasItem Purpose=\"" . $item->getPurpose() . "\">";
714
715 // Layout
716 $width = ($item->getWidth() != "")
717 ? "Width=\"" . $item->getWidth() . "\""
718 : "";
719 $height = ($item->getHeight() != "")
720 ? "Height=\"" . $item->getHeight() . "\""
721 : "";
722 $halign = ($item->getHAlign() != "")
723 ? "HorizontalAlign=\"" . $item->getHAlign() . "\""
724 : "";
725 $xml .= "<Layout $width $height $halign />";
726
727 // Caption
728 if ($item->getCaption() != "") {
729 $xml .= "<Caption Align=\"bottom\">" .
730 $this->escapeProperty($item->getCaption()) . "</Caption>";
731 }
732
733 // Text Representation
734 if ($item->getTextRepresentation() != "") {
735 $xml .= "<TextRepresentation>" .
736 $this->escapeProperty($item->getTextRepresentation()) . "</TextRepresentation>";
737 }
738
739 // Parameter
740 $parameters = $item->getParameters();
741 foreach ($parameters as $name => $value) {
742 $xml .= "<Parameter Name=\"$name\" Value=\"$value\"/>";
743 }
744 $xml .= $item->getMapAreasXML();
745 $xml .= "</MediaAliasItem>";
746 }
747 break;
748
749 // for output we need technical sections of meta data
750 case IL_MODE_OUTPUT:
751
752 // get first technical section
753// $meta = $this->getMetaData();
754 $xml = "<MediaObject Id=\"il__mob_" . $this->getId() . "\">";
755
756 $media_items = $this->getMediaItems();
757 for ($i = 0; $i < count($media_items); $i++) {
758 $item = $media_items[$i];
759
760 $xml .= "<MediaItem Purpose=\"" . $item->getPurpose() . "\">";
761
762 if ($a_sign_locals && $item->getLocationType() == "LocalFile") {
763 require_once 'Services/WebAccessChecker/classes/class.ilWACSignedPath.php';
764 $location = ilWACSignedPath::signFile($this->getDataDirectory() . "/" . $item->getLocation());
765 $location = substr($location, strrpos($location, "/") + 1);
766 } else {
767 $location = $item->getLocation();
768 if ($item->getLocationType() != "LocalFile") { //#25941
770 }
771 }
772
773 $xml .= "<Location Type=\"" . $item->getLocationType() . "\">" .
774 $this->handleAmps($location) . "</Location>";
775
776 // Format
777 $xml .= "<Format>" . $item->getFormat() . "</Format>";
778
779 // Layout
780 $width = ($item->getWidth() != "")
781 ? "Width=\"" . $item->getWidth() . "\""
782 : "";
783 $height = ($item->getHeight() != "")
784 ? "Height=\"" . $item->getHeight() . "\""
785 : "";
786 $halign = ($item->getHAlign() != "")
787 ? "HorizontalAlign=\"" . $item->getHAlign() . "\""
788 : "";
789 $xml .= "<Layout $width $height $halign />";
790
791 // Caption
792 if ($item->getCaption() != "") {
793 $xml .= "<Caption Align=\"bottom\">" .
794 $this->escapeProperty($item->getCaption()) . "</Caption>";
795 }
796
797 // Text Representation
798 if ($item->getTextRepresentation() != "") {
799 $xml .= "<TextRepresentation>" .
800 $this->escapeProperty($item->getTextRepresentation()) . "</TextRepresentation>";
801 }
802
803 // Title
804 if ($this->getTitle() != "") {
805 $xml .= "<Title>" .
806 $this->escapeProperty($this->getTitle()) . "</Title>";
807 }
808
809 // Parameter
810 $parameters = $item->getParameters();
811 foreach ($parameters as $name => $value) {
812 $xml .= "<Parameter Name=\"$name\" Value=\"$value\"/>";
813 }
814 $xml .= $item->getMapAreasXML();
815
816 // Subtitles
817 if ($item->getPurpose() == "Standard") {
818 $srts = $this->getSrtFiles();
819 foreach ($srts as $srt) {
820 $def = "";
821 $meta_lang = "";
822 if ($ilUser->getLanguage() != $meta_lang &&
823 $ilUser->getLanguage() == $srt["language"]) {
824 $def = ' Default="true" ';
825 }
826 $xml .= "<Subtitle File=\"" . $srt["full_path"] .
827 "\" Language=\"" . $srt["language"] . "\" " . $def . "/>";
828 }
829 }
830 $xml .= "</MediaItem>";
831 }
832 break;
833
834 // full xml for export
835 case IL_MODE_FULL:
836
837// $meta = $this->getMetaData();
838 $xml = "<MediaObject>";
839
840 // meta data
841 include_once("Services/MetaData/classes/class.ilMD2XML.php");
842 $md2xml = new ilMD2XML(0, $this->getId(), $this->getType());
843 $md2xml->setExportMode(true);
844 $md2xml->startExport();
845 $xml .= $md2xml->getXML();
846
847 $media_items = $this->getMediaItems();
848 for ($i = 0; $i < count($media_items); $i++) {
849 $item = $media_items[$i];
850
851 // highlight mode
852 $xml .= "<MediaItem Purpose=\"" . $item->getPurpose() . "\">";
853
854 // Location
855 $xml .= "<Location Type=\"" . $item->getLocationType() . "\">" .
856 $this->handleAmps($item->getLocation()) . "</Location>";
857
858 // Format
859 $xml .= "<Format>" . $item->getFormat() . "</Format>";
860
861 // Layout
862 $width = ($item->getWidth() != "")
863 ? "Width=\"" . $item->getWidth() . "\""
864 : "";
865 $height = ($item->getHeight() != "")
866 ? "Height=\"" . $item->getHeight() . "\""
867 : "";
868 $halign = ($item->getHAlign() != "")
869 ? "HorizontalAlign=\"" . $item->getHAlign() . "\""
870 : "";
871 $xml .= "<Layout $width $height $halign />";
872
873 // Caption
874 if ($item->getCaption() != "") {
875 $xml .= "<Caption Align=\"bottom\">" .
876 str_replace("&", "&amp;", $item->getCaption()) . "</Caption>";
877 }
878
879 // Text Representation
880 if ($item->getTextRepresentation() != "") {
881 $xml .= "<TextRepresentation>" .
882 str_replace("&", "&amp;", $item->getTextRepresentation()) . "</TextRepresentation>";
883 }
884
885 // Parameter
886 $parameters = $item->getParameters();
887 foreach ($parameters as $name => $value) {
888 $xml .= "<Parameter Name=\"$name\" Value=\"$value\"/>";
889 }
890 $xml .= $item->getMapAreasXML(true, $a_inst);
891 $xml .= "</MediaItem>";
892 }
893 break;
894 }
895 $xml .= "</MediaObject>";
896 return $xml;
897 }
898
905 protected function escapeProperty($a_value)
906 {
907 return htmlspecialchars($a_value);
908 }
909
910
914 public function handleAmps($a_str)
915 {
916 $a_str = str_replace("&amp;", "&", $a_str);
917 $a_str = str_replace("&", "&amp;", $a_str);
918 return $a_str;
919 }
920
924 public function exportXML(&$a_xml_writer, $a_inst = 0)
925 {
926 $a_xml_writer->appendXML($this->getXML(IL_MODE_FULL, $a_inst));
927 }
928
929
937 public function exportFiles($a_target_dir)
938 {
939 $subdir = "il_" . IL_INST_ID . "_mob_" . $this->getId();
940 ilUtil::makeDir($a_target_dir . "/objects/" . $subdir);
941
942 $mobdir = ilUtil::getWebspaceDir() . "/mobs/mm_" . $this->getId();
943 ilUtil::rCopy($mobdir, $a_target_dir . "/objects/" . $subdir);
944 //echo "from:$mobdir:to:".$a_target_dir."/objects/".$subdir.":<br>";
945 }
946
947 public function exportMediaFullscreen($a_target_dir, $pg_obj)
948 {
949 $subdir = "il_" . IL_INST_ID . "_mob_" . $this->getId();
950 $a_target_dir = $a_target_dir . "/objects/" . $subdir;
951 ilUtil::makeDir($a_target_dir);
952 $tpl = new ilTemplate("tpl.fullscreen.html", true, true, "Modules/LearningModule");
953 $tpl->setCurrentBlock("ilMedia");
954
955 //$int_links = $page_object->getInternalLinks();
956 $med_links = ilMediaItem::_getMapAreasIntLinks($this->getId());
957
958 // @todo
959 //$link_xml = $this->getLinkXML($med_links, $this->getLayoutLinkTargets());
960
961 require_once("./Services/MediaObjects/classes/class.ilObjMediaObject.php");
962 //$media_obj = new ilObjMediaObject($_GET["mob_id"]);
963 require_once("./Services/COPage/classes/class.ilPageObject.php");
964
965 $xml = "<dummy>";
966 // todo: we get always the first alias now (problem if mob is used multiple
967 // times in page)
968 $xml .= $pg_obj->getMediaAliasElement($this->getId());
969 $xml .= $this->getXML(IL_MODE_OUTPUT);
970 //$xml.= $link_xml;
971 $xml .= "</dummy>";
972
973 //die(htmlspecialchars($xml));
974
975 $xsl = file_get_contents("./Services/COPage/xsl/page.xsl");
976 $args = array( '/_xml' => $xml, '/_xsl' => $xsl );
977 $xh = xslt_create();
978
979 //echo "<b>XML:</b>".htmlentities($xml);
980 // determine target frames for internal links
981 $wb_path = "";
982 $enlarge_path = "";
983 $params = array('mode' => "fullscreen", 'enlarge_path' => $enlarge_path,
984 'link_params' => "ref_id=" . $_GET["ref_id"],'fullscreen_link' => "",
985 'ref_id' => $_GET["ref_id"], 'webspace_path' => $wb_path);
986 $output = xslt_process($xh, "arg:/_xml", "arg:/_xsl", null, $args, $params);
987 //echo xslt_error($xh);
988 xslt_free($xh);
989
990 // unmask user html
991 include_once("./Services/MediaObjects/classes/class.ilPlayerUtil.php");
992 $tpl->setVariable("LOCATION_CONTENT_STYLESHEET", "../../css/style.css");
993 $tpl->setVariable("LOCATION_STYLESHEET", "../../css/system.css");
994 $tpl->setVariable("MEDIA_CONTENT", $output);
995 $output = $tpl->get();
996 //$output = preg_replace("/\/mobs\/mm_(\d+)\/([^\"]+)/i","$2",$output);
997 $output = preg_replace("/mobs\/mm_(\d+)\/([^\"]+)/i", "$2", $output);
998 $output = preg_replace("/\.\/Services\/MediaObjects\/flash_mp3_player/i", "../../players", $output);
999 $output = preg_replace("/\.\/" . str_replace("/", "\/", ilPlayerUtil::getFlashVideoPlayerDirectory()) . "/i", "../../players", $output);
1000 $output = preg_replace("/file=..\/..\/..\//i", "file=../objects/" . $subdir . "/", $output);
1001 //die(htmlspecialchars($output));
1002 fwrite(fopen($a_target_dir . '/fullscreen.html', 'w'), $output);
1003 }
1004
1005 public function modifyExportIdentifier($a_tag, $a_param, $a_value)
1006 {
1007 if ($a_tag == "Identifier" && $a_param == "Entry") {
1008 $a_value = ilUtil::insertInstIntoID($a_value);
1009 }
1010
1011 return $a_value;
1012 }
1013
1014
1016 // EDIT METHODS: these methods act on the media alias in the dom
1018
1025 public function setContainsIntLink($a_contains_link)
1026 {
1027 $this->contains_int_link = $a_contains_link;
1028 }
1029
1034 public function containsIntLink()
1035 {
1037 }
1038
1042 public static function _deleteAllUsages($a_type, $a_id, $a_usage_hist_nr = 0, $a_lang = "-")
1043 {
1044 global $DIC;
1045
1046 $ilDB = $DIC->database();
1047
1048 $and_hist = "";
1049 if ($a_usage_hist_nr !== false) {
1050 $and_hist = " AND usage_hist_nr = " . $ilDB->quote($a_usage_hist_nr, "integer");
1051 }
1052
1053 $mob_ids = array();
1054 $set = $ilDB->query("SELECT id FROM mob_usage" .
1055 " WHERE usage_type = " . $ilDB->quote($a_type, "text") .
1056 " AND usage_id = " . $ilDB->quote($a_id, "integer") .
1057 " AND usage_lang = " . $ilDB->quote($a_lang, "text") .
1058 $and_hist);
1059 while ($row = $ilDB->fetchAssoc($set)) {
1060 $mob_ids[] = $row["id"];
1061 }
1062
1063 $q = "DELETE FROM mob_usage WHERE usage_type = " .
1064 $ilDB->quote($a_type, "text") .
1065 " AND usage_id= " . $ilDB->quote($a_id, "integer") .
1066 " AND usage_lang = " . $ilDB->quote($a_lang, "text") .
1067 $and_hist;
1068 $ilDB->manipulate($q);
1069
1070 foreach ($mob_ids as $mob_id) {
1071 self::handleQuotaUpdate(new self($mob_id));
1072 }
1073 }
1074
1078 public static function _getMobsOfObject($a_type, $a_id, $a_usage_hist_nr = 0, $a_lang = "-")
1079 {
1080 global $DIC;
1081
1082 $ilDB = $DIC->database();
1083
1084 $lstr = "";
1085 if ($a_lang != "") {
1086 $lstr = " AND usage_lang = " . $ilDB->quote($a_lang, "text");
1087 }
1088 $hist_str = "";
1089 if ($a_usage_hist_nr !== false) {
1090 $hist_str = " AND usage_hist_nr = " . $ilDB->quote($a_usage_hist_nr, "integer");
1091 }
1092
1093 $q = "SELECT * FROM mob_usage WHERE " .
1094 "usage_type = " . $ilDB->quote($a_type, "text") . " AND " .
1095 "usage_id = " . $ilDB->quote($a_id, "integer") .
1096 $lstr . $hist_str;
1097 $mobs = array();
1098 $mob_set = $ilDB->query($q);
1099 while ($mob_rec = $ilDB->fetchAssoc($mob_set)) {
1100 if (ilObject::_lookupType($mob_rec["id"]) == "mob") {
1101 $mobs[$mob_rec["id"]] = $mob_rec["id"];
1102 }
1103 }
1104
1105 return $mobs;
1106 }
1107
1111 public static function _saveUsage($a_mob_id, $a_type, $a_id, $a_usage_hist_nr = 0, $a_lang = "-")
1112 {
1113 global $DIC;
1114
1115 $ilDB = $DIC->database();
1116
1117 $ilDB->replace(
1118 "mob_usage",
1119 array(
1120 "id" => array("integer", (int) $a_mob_id),
1121 "usage_type" => array("text", $a_type),
1122 "usage_id" => array("integer", $a_id),
1123 "usage_lang" => array("text", $a_lang),
1124 "usage_hist_nr" => array("integer", (int) $a_usage_hist_nr)
1125 ),
1126 array()
1127 );
1128
1129 self::handleQuotaUpdate(new self($a_mob_id));
1130 }
1131
1135 public static function _removeUsage($a_mob_id, $a_type, $a_id, $a_usage_hist_nr = 0, $a_lang = "-")
1136 {
1137 global $DIC;
1138
1139 $ilDB = $DIC->database();
1140
1141 $q = "DELETE FROM mob_usage WHERE " .
1142 " id = " . $ilDB->quote((int) $a_mob_id, "integer") . " AND " .
1143 " usage_type = " . $ilDB->quote($a_type, "text") . " AND " .
1144 " usage_id = " . $ilDB->quote((int) $a_id, "integer") . " AND " .
1145 " usage_lang = " . $ilDB->quote($a_lang, "text") . " AND " .
1146 " usage_hist_nr = " . $ilDB->quote((int) $a_usage_hist_nr, "integer");
1147 $ilDB->manipulate($q);
1148
1149 self::handleQuotaUpdate(new self($a_mob_id));
1150 }
1151
1155 public function getUsages($a_include_history = true)
1156 {
1157 return self::lookupUsages($this->getId(), $a_include_history);
1158 }
1159
1165 public static function lookupUsages($a_id, $a_include_history = true)
1166 {
1167 global $DIC;
1168
1169 $ilDB = $DIC->database();
1170
1171 $hist_str = "";
1172 if ($a_include_history) {
1173 $hist_str = ", usage_hist_nr";
1174 }
1175
1176 // get usages in pages
1177 $q = "SELECT DISTINCT usage_type, usage_id, usage_lang" . $hist_str . " FROM mob_usage WHERE id = " .
1178 $ilDB->quote($a_id, "integer");
1179
1180 if (!$a_include_history) {
1181 $q .= " AND usage_hist_nr = " . $ilDB->quote(0, "integer");
1182 }
1183
1184 $us_set = $ilDB->query($q);
1185 $ret = array();
1186 while ($us_rec = $ilDB->fetchAssoc($us_set)) {
1187 $ut = "";
1188 if (is_int(strpos($us_rec["usage_type"], ":"))) {
1189 $us_arr = explode(":", $us_rec["usage_type"]);
1190 $ut = $us_arr[1];
1191 $ct = $us_arr[0];
1192 }
1193
1194 // check whether page exists
1195 $skip = false;
1196 if ($ut == "pg") {
1197 include_once("./Services/COPage/classes/class.ilPageObject.php");
1198 if (!ilPageObject::_exists($ct, $us_rec["usage_id"])) {
1199 $skip = true;
1200 }
1201 }
1202
1203 if (!$skip) {
1204 $ret[] = array("type" => $us_rec["usage_type"],
1205 "id" => $us_rec["usage_id"],
1206 "lang" => $us_rec["usage_lang"],
1207 "hist_nr" => $us_rec["usage_hist_nr"]);
1208 }
1209 }
1210
1211 // get usages in media pools
1212 $q = "SELECT DISTINCT mep_id FROM mep_tree JOIN mep_item ON (child = obj_id) WHERE mep_item.foreign_id = " .
1213 $ilDB->quote($a_id, "integer") . " AND mep_item.type = " . $ilDB->quote("mob", "text");
1214 $us_set = $ilDB->query($q);
1215 while ($us_rec = $ilDB->fetchAssoc($us_set)) {
1216 $ret[] = array("type" => "mep",
1217 "id" => $us_rec["mep_id"]);
1218 }
1219
1220 // get usages in news items (media casts)
1221 include_once("./Services/News/classes/class.ilNewsItem.php");
1222 $news_usages = ilNewsItem::_lookupMediaObjectUsages($a_id);
1223 foreach ($news_usages as $nu) {
1224 $ret[] = $nu;
1225 }
1226
1227
1228 // get usages in map areas
1229 $q = "SELECT DISTINCT mob_id FROM media_item it, map_area area " .
1230 " WHERE area.item_id = it.id " .
1231 " AND area.link_type = " . $ilDB->quote("int", "text") . " " .
1232 " AND area.target = " . $ilDB->quote("il__mob_" . $a_id, "text");
1233 $us_set = $ilDB->query($q);
1234 while ($us_rec = $ilDB->fetchAssoc($us_set)) {
1235 $ret[] = array("type" => "map",
1236 "id" => $us_rec["mob_id"]);
1237 }
1238
1239 // get usages in personal clipboards
1241 foreach ($users as $user) {
1242 $ret[] = array("type" => "clip",
1243 "id" => $user);
1244 }
1245
1246 return $ret;
1247 }
1248
1254 public static function getParentObjectIdForUsage($a_usage, $a_include_all_access_obj_ids = false)
1255 {
1256 if (is_int(strpos($a_usage["type"], ":"))) {
1257 $us_arr = explode(":", $a_usage["type"]);
1258 $type = $us_arr[1];
1259 $cont_type = $us_arr[0];
1260 } else {
1261 $type = $a_usage["type"];
1262 }
1263
1264 $id = $a_usage["id"];
1265 $obj_id = false;
1266
1267 switch ($type) {
1268 // RTE / tiny mce
1269 case "html":
1270
1271 switch ($cont_type) {
1272 case "qpl":
1273 // Question Pool *Question* Text (Test)
1274 include_once("./Modules/TestQuestionPool/classes/class.assQuestion.php");
1276 if ($qinfo["original_id"] > 0) {
1277 include_once("./Modules/Test/classes/class.ilObjTest.php");
1278 $obj_id = ilObjTest::_lookupTestObjIdForQuestionId($id); // usage in test
1279 } else {
1280 $obj_id = $qinfo["obj_fi"]; // usage in pool
1281 }
1282 break;
1283
1284 case "spl":
1285 // Question Pool *Question* Text (Survey)
1286 include_once("./Modules/SurveyQuestionPool/classes/class.SurveyQuestion.php");
1288 if ($quest) {
1289 $parent_id = $quest->getObjId();
1290
1291 // pool question copy - find survey, do not use pool itself
1292 if ($quest->getOriginalId() &&
1293 ilObject::_lookupType($parent_id) == "spl") {
1295 }
1296 // original question (in pool or survey)
1297 else {
1298 $obj_id = $parent_id;
1299 }
1300
1301 unset($quest);
1302 }
1303 break;
1304
1305 case "exca":
1306 // Exercise assignment
1307 $returned_pk = $a_usage['id'];
1308 // #15995 - we are just checking against exercise object
1309 include_once 'Modules/Exercise/classes/class.ilExSubmission.php';
1310 $obj_id = ilExSubmission::lookupExerciseIdForReturnedId($returned_pk);
1311 break;
1312
1313 case "frm":
1314 // Forum
1315 $post_pk = $a_usage['id'];
1316 include_once 'Modules/Forum/classes/class.ilForumPost.php';
1317 include_once 'Modules/Forum/classes/class.ilForum.php';
1318 $oPost = new ilForumPost($post_pk);
1319 $frm_pk = $oPost->getForumId();
1320 $obj_id = ilForum::_lookupObjIdForForumId($frm_pk);
1321 break;
1322
1323
1324 case "frm~d":
1325 $draft_id = $a_usage['id'];
1326 include_once 'Modules/Forum/classes/class.ilForumPostDraft.php';
1327 include_once 'Modules/Forum/classes/class.ilForum.php';
1328 $oDraft = ilForumPostDraft::newInstanceByDraftId($draft_id);
1329
1330 $frm_pk = $oDraft->getForumId();
1331 $obj_id = ilForum::_lookupObjIdForForumId($frm_pk);
1332 break;
1333 case "frm~h":
1334 $history_id = $a_usage['id'];
1335 include_once 'Modules/Forum/classes/class.ilForumDraftsHistory.php';
1336 include_once 'Modules/Forum/classes/class.ilForumPostDraft.php';
1337 include_once 'Modules/Forum/classes/class.ilForum.php';
1338 $oHistoryDraft = new ilForumDraftsHistory($history_id);
1339 $oDraft = ilForumPostDraft::newInstanceByDraftId($oHistoryDraft->getDraftId());
1340
1341 $frm_pk = $oDraft->getForumId();
1342 $obj_id = ilForum::_lookupObjIdForForumId($frm_pk);
1343 break;
1344 // temporary items (per user)
1345 case "frm~":
1346 case "exca~":
1347 $obj_id = $a_usage['id'];
1348 break;
1349
1350 // "old" category pages
1351 case "cat":
1352 // InfoScreen Text
1353 case "tst":
1354 case "svy":
1355 // data collection
1356 case "dcl":
1357 $obj_id = $id;
1358 break;
1359 }
1360 break;
1361
1362 // page editor
1363 case "pg":
1364
1365 switch ($cont_type) {
1366 // question feedback // parent obj id is q id
1367 case "qfbg":
1368 include_once('./Services/COPage/classes/class.ilPageObject.php');
1370 // note: no break here, we only altered the $id to the question id
1371
1372 // no break
1373 case "qpl":
1374 // Question Pool Question Pages
1375 include_once("./Modules/TestQuestionPool/classes/class.assQuestion.php");
1377 if ($qinfo["original_id"] > 0) {
1378 include_once("./Modules/Test/classes/class.ilObjTest.php");
1379 $obj_id = ilObjTest::_lookupTestObjIdForQuestionId($id); // usage in test
1380 } else {
1381 $obj_id = $qinfo["obj_fi"]; // usage in pool
1382 }
1383 if ($obj_id == 0) { // this is the case, if question is in learning module -> get lm id
1384 include_once("./Services/COPage/classes/class.ilPCQuestion.php");
1386 if ($pinfo && $pinfo["parent_type"] == "lm") {
1387 include_once("./Modules/LearningModule/classes/class.ilLMObject.php");
1388 $obj_id = ilLMObject::_lookupContObjID($pinfo["page_id"]);
1389 }
1390 $pinfo = ilPCQuestion::_getPageForQuestionId($id, "sahs");
1391 if ($pinfo && $pinfo["parent_type"] == "sahs") {
1392 include_once("./Modules/Scorm2004/classes/class.ilSCORM2004Node.php");
1393 $obj_id = ilSCORM2004Node::_lookupSLMID($pinfo["page_id"]);
1394 }
1395 }
1396 break;
1397
1398 case "lm":
1399 // learning modules
1400 include_once("./Modules/LearningModule/classes/class.ilLMObject.php");
1402 break;
1403
1404 case "gdf":
1405 // glossary definition
1406 include_once("./Modules/Glossary/classes/class.ilGlossaryDefinition.php");
1407 include_once("./Modules/Glossary/classes/class.ilGlossaryTerm.php");
1409 $obj_id = ilGlossaryTerm::_lookGlossaryID($term_id);
1410 break;
1411
1412 case "wpg":
1413 // wiki page
1414 include_once 'Modules/Wiki/classes/class.ilWikiPage.php';
1416 break;
1417
1418 case "sahs":
1419 // sahs page
1420 // can this implementation be used for other content types, too?
1421 include_once('./Services/COPage/classes/class.ilPageObject.php');
1422 $obj_id = ilPageObject::lookupParentId($id, 'sahs');
1423 break;
1424
1425 case "prtf":
1426 // portfolio
1427 include_once "Modules/Portfolio/classes/class.ilPortfolioPage.php";
1429 break;
1430
1431 case "prtt":
1432 // portfolio template
1433 include_once "Modules/Portfolio/classes/class.ilPortfolioTemplatePage.php";
1435 break;
1436
1437 case "blp":
1438 // blog
1439 include_once('./Services/COPage/classes/class.ilPageObject.php');
1440 $obj_id = ilPageObject::lookupParentId($id, 'blp');
1441 break;
1442
1443 case "impr":
1444 // imprint page - always id 1
1445 // fallthrough
1446
1447 case "crs":
1448 case "grp":
1449 case "cat":
1450 case "fold":
1451 case "root":
1452 case "cont":
1453 case "copa":
1454 case "cstr":
1455 // repository pages
1456 $obj_id = $id;
1457 break;
1458 }
1459 break;
1460
1461 // Media Pool
1462 case "mep":
1463 $obj_id = $id;
1464 break;
1465
1466 // News Context Object (e.g. MediaCast)
1467 case "news":
1468 include_once("./Services/News/classes/class.ilNewsItem.php");
1470 break;
1471 }
1472
1473 return $obj_id;
1474 }
1475
1483 public static function _resizeImage($a_file, $a_width, $a_height, $a_constrain_prop = false)
1484 {
1485 $file_path = pathinfo($a_file);
1486 $location = substr($file_path["basename"], 0, strlen($file_path["basename"]) -
1487 strlen($file_path["extension"]) - 1) . "_" .
1488 $a_width . "_" .
1489 $a_height . "." . $file_path["extension"];
1490 $target_file = $file_path["dirname"] . "/" .
1491 $location;
1493 $a_file,
1494 $target_file,
1495 (int) $a_width,
1496 (int) $a_height,
1497 $a_constrain_prop
1498 );
1499
1500 return $location;
1501 }
1502
1510 public static function getMimeType($a_file, $a_external = null)
1511 {
1512 include_once("./Services/Utilities/classes/class.ilMimeTypeUtil.php");
1514 return $mime;
1515 }
1516
1520 public static function _determineWidthHeight(
1521 $a_format,
1522 $a_type,
1523 $a_file,
1524 $a_reference,
1525 $a_constrain_proportions,
1526 $a_use_original,
1527 $a_user_width,
1528 $a_user_height
1529 ) {
1530 global $DIC;
1531
1532 $lng = $DIC->language();
1533
1534 // determine width and height of known image types
1535 //$width = 640;
1536 //$height = 360;
1537 $info = "";
1538
1539 if ($a_format == "audio/mpeg") {
1540 $width = 300;
1541 $height = 20;
1542 }
1543
1544 if (ilUtil::deducibleSize($a_format)) {
1545 include_once("./Services/MediaObjects/classes/class.ilMediaImageUtil.php");
1546 if ($a_type == "File") {
1548 } else {
1549 $size = ilMediaImageUtil::getImageSize($a_reference);
1550 }
1551 }
1552
1553 if ($a_use_original) {
1554 if ($size[0] > 0 && $size[1] > 0) {
1555 //$width = $size[0];
1556 //$height = $size[1];
1557 $width = "";
1558 $height = "";
1559 } else {
1560 $info = $lng->txt("cont_could_not_determine_resource_size");
1561 }
1562 } else {
1563 $w = (int) $a_user_width;
1564 $h = (int) $a_user_height;
1565 $width = $w;
1566 $height = $h;
1567 //echo "<br>C-$width-$height-";
1568 if (ilUtil::deducibleSize($a_format) && $a_constrain_proportions) {
1569 if ($size[0] > 0 && $size[1] > 0) {
1570 if ($w > 0) {
1571 $wr = $size[0] / $w;
1572 }
1573 if ($h > 0) {
1574 $hr = $size[1] / $h;
1575 }
1576 //echo "<br>+".$wr."+".$size[0]."+".$w."+";
1577 //echo "<br>+".$hr."+".$size[1]."+".$h."+";
1578 $r = max($wr, $hr);
1579 if ($r > 0) {
1580 $width = (int) ($size[0] / $r);
1581 $height = (int) ($size[1] / $r);
1582 }
1583 }
1584 }
1585 //echo "<br>D-$width-$height-";
1586 }
1587 //echo "<br>E-$width-$height-";
1588
1589 if ($width == 0 && $a_user_width === "") {
1590 $width = "";
1591 }
1592 if ($height == 0 && $a_user_height === "") {
1593 $height = "";
1594 }
1595
1596 return array("width" => $width, "height" => $height, "info" => $info);
1597 }
1598
1603 public static function _getSimpleMimeTypes()
1604 {
1605 return array("image/x-ms-bmp", "image/gif", "image/jpeg", "image/x-portable-bitmap",
1606 "image/png", "image/psd", "image/tiff", "application/pdf");
1607 }
1608
1609 public function getDataDirectory()
1610 {
1611 return ilUtil::getWebspaceDir() . "/mobs/mm_" . $this->getId();
1612 }
1613
1620 public static function _useAutoStartParameterOnly($a_loc, $a_format)
1621 {
1622 $lpath = pathinfo($a_loc);
1623 if ($lpath["extension"] == "mp3" && $a_format == "audio/mpeg") {
1624 return true;
1625 }
1626 if ($lpath["extension"] == "flv") {
1627 return true;
1628 }
1629 if (in_array($a_format, array("video/mp4", "video/webm"))) {
1630 return true;
1631 }
1632 return false;
1633 }
1634
1638 public static function _saveTempFileAsMediaObject($name, $tmp_name, $upload = true)
1639 {
1640 // create dummy object in db (we need an id)
1641 $media_object = new ilObjMediaObject();
1642 $media_object->setTitle($name);
1643 $media_object->setDescription("");
1644 $media_object->create();
1645
1646 // determine and create mob directory, move uploaded file to directory
1647 $media_object->createDirectory();
1648 $mob_dir = ilObjMediaObject::_getDirectory($media_object->getId());
1649
1650 $media_item = new ilMediaItem();
1651 $media_object->addMediaItem($media_item);
1652 $media_item->setPurpose("Standard");
1653
1654 $file = $mob_dir . "/" . $name;
1655 if ($upload) {
1656 ilUtil::moveUploadedFile($tmp_name, $name, $file);
1657 } else {
1658 copy($tmp_name, $file);
1659 }
1660 // get mime type
1662 $location = $name;
1663 // set real meta and object data
1664 $media_item->setFormat($format);
1665 $media_item->setLocation($location);
1666 $media_item->setLocationType("LocalFile");
1667 $media_object->setTitle($name);
1668 $media_object->setDescription($format);
1669
1671 include_once("./Services/MediaObjects/classes/class.ilMediaImageUtil.php");
1673 $media_item->setWidth($size[0]);
1674 $media_item->setHeight($size[1]);
1675 }
1676 $media_item->setHAlign("Left");
1677
1678 self::renameExecutables($mob_dir);
1679 include_once("./Services/MediaObjects/classes/class.ilMediaSvgSanitizer.php");
1680 ilMediaSvgSanitizer::sanitizeDir($mob_dir); // see #20339
1681
1682 $media_object->update();
1683
1684 return $media_object;
1685 }
1686
1690 public function uploadAdditionalFile($a_name, $tmp_name, $a_subdir = "", $a_mode = "move_uploaded")
1691 {
1692 $a_subdir = str_replace("..", "", $a_subdir);
1693 $dir = $mob_dir = ilObjMediaObject::_getDirectory($this->getId());
1694 if ($a_subdir != "") {
1695 $dir .= "/" . $a_subdir;
1696 }
1698 if ($a_mode == "rename") {
1699 rename($tmp_name, $dir . "/" . $a_name);
1700 } else {
1701 ilUtil::moveUploadedFile($tmp_name, $a_name, $dir . "/" . $a_name, true, $a_mode);
1702 }
1703 self::renameExecutables($mob_dir);
1704 include_once("./Services/MediaObjects/classes/class.ilMediaSvgSanitizer.php");
1705 ilMediaSvgSanitizer::sanitizeDir($mob_dir); // see #20339
1706 }
1707
1714 public function uploadSrtFile($a_tmp_name, $a_language, $a_mode = "move_uploaded")
1715 {
1716 if (is_file($a_tmp_name) && $a_language != "") {
1717 $this->uploadAdditionalFile("subtitle_" . $a_language . ".srt", $a_tmp_name, "srt", $a_mode);
1718 return true;
1719 }
1720 return false;
1721 }
1722
1726 public function getSrtFiles()
1727 {
1728 $srt_dir = ilObjMediaObject::_getDirectory($this->getId()) . "/srt";
1729
1730 if (!is_dir($srt_dir)) {
1731 return array();
1732 }
1733
1734 $items = ilUtil::getDir($srt_dir);
1735
1736 $srt_files = array();
1737 foreach ($items as $i) {
1738 if (!in_array($i["entry"], array(".", "..")) && $i["type"] == "file") {
1739 $name = explode(".", $i["entry"]);
1740 if ($name[1] == "srt" && substr($name[0], 0, 9) == "subtitle_") {
1741 $srt_files[] = array("file" => $i["entry"],
1742 "full_path" => "srt/" . $i["entry"], "language" => substr($name[0], 9, 2));
1743 }
1744 }
1745 }
1746
1747 return $srt_files;
1748 }
1749
1753 public function makeThumbnail(
1754 $a_file,
1755 $a_thumbname,
1756 $a_format = "png",
1757 $a_size = "80"
1758 ) {
1759 $m_dir = ilObjMediaObject::_getDirectory($this->getId());
1763 $m_dir . "/" . $a_file,
1764 $t_dir . "/" . $a_thumbname,
1765 $a_format,
1766 $a_size
1767 );
1768 }
1769
1776 public static function getThumbnailPath($a_mob_id, $a_thumbname)
1777 {
1778 $t_dir = ilObjMediaObject::_getThumbnailDirectory($a_mob_id);
1779 return $t_dir . "/" . $a_thumbname;
1780 }
1781
1782
1786 public function removeAdditionalFile($a_file)
1787 {
1788 $file = str_replace("..", "", $a_file);
1789 $file = ilObjMediaObject::_getDirectory($this->getId()) . "/" . $file;
1790 if (is_file($file)) {
1791 unlink($file);
1792 }
1793 }
1794
1795
1799 public function getLinkedMediaObjects($a_ignore = "")
1800 {
1801 $linked = array();
1802
1803 if (!is_array($a_ignore)) {
1804 $a_ignore = array();
1805 }
1806
1807 // get linked media objects (map areas)
1808 $med_items = $this->getMediaItems();
1809
1810 foreach ($med_items as $med_item) {
1811 $int_links = ilMapArea::_getIntLinks($med_item->getId());
1812 foreach ($int_links as $k => $int_link) {
1813 if ($int_link["Type"] == "MediaObject") {
1814 include_once("./Services/Link/classes/class.ilInternalLink.php");
1815 $l_id = ilInternalLink::_extractObjIdOfTarget($int_link["Target"]);
1816 if (ilObject::_exists($l_id)) {
1817 if (!in_array($l_id, $linked) &&
1818 !in_array($l_id, $a_ignore)) {
1819 $linked[] = $l_id;
1820 }
1821 }
1822 }
1823 }
1824 }
1825 //var_dump($linked);
1826 return $linked;
1827 }
1828
1832 public static function getRestrictedFileTypes()
1833 {
1834 return array_filter(self::getAllowedFileTypes(), function ($v) {
1835 return !in_array($v, self::getForbiddenFileTypes());
1836 });
1837 }
1838
1844 public static function getForbiddenFileTypes()
1845 {
1846 $mset = new ilSetting("mobs");
1847 if (trim($mset->get("black_list_file_types")) == "") {
1848 return array();
1849 }
1850 return array_map(
1851 function ($v) {
1852 return strtolower(trim($v));
1853 },
1854 explode(",", $mset->get("black_list_file_types"))
1855 );
1856 }
1857
1863 public static function getAllowedFileTypes()
1864 {
1865 $mset = new ilSetting("mobs");
1866 if (trim($mset->get("restricted_file_types")) == "") {
1867 return array();
1868 }
1869 return array_map(
1870 function ($v) {
1871 return strtolower(trim($v));
1872 },
1873 explode(",", $mset->get("restricted_file_types"))
1874 );
1875 }
1876
1883 public static function isTypeAllowed($a_type)
1884 {
1885 if (in_array($a_type, self::getForbiddenFileTypes())) {
1886 return false;
1887 }
1888 if (count(self::getAllowedFileTypes()) == 0 || in_array($a_type, self::getAllowedFileTypes())) {
1889 return true;
1890 }
1891 return false;
1892 }
1893
1894
1898 public function duplicate()
1899 {
1900 $new_obj = new ilObjMediaObject();
1901 $new_obj->setTitle($this->getTitle());
1902 $new_obj->setDescription($this->getDescription());
1903
1904 // media items
1905 foreach ($this->getMediaItems() as $key => $val) {
1906 $new_obj->addMediaItem($val);
1907 }
1908
1909 $new_obj->create(false, true);
1910
1911 // files
1912 $new_obj->createDirectory();
1913 self::_createThumbnailDirectory($new_obj->getId());
1916 ilObjMediaObject::_getDirectory($new_obj->getId())
1917 );
1921 );
1922
1923 // meta data
1924 include_once("Services/MetaData/classes/class.ilMD.php");
1925 $md = new ilMD(0, $this->getId(), "mob");
1926 $new_md = $md->cloneMD(0, $new_obj->getId(), "mob");
1927
1928 return $new_obj;
1929 }
1930
1937 public function uploadVideoPreviewPic($a_prevpic)
1938 {
1939 // remove old one
1940 if ($this->getVideoPreviewPic(true) != "") {
1941 $this->removeAdditionalFile($this->getVideoPreviewPic(true));
1942 }
1943
1944 $pi = pathinfo($a_prevpic["name"]);
1945 $ext = $pi["extension"];
1946 if (in_array($ext, array("jpg", "jpeg", "png"))) {
1947 $this->uploadAdditionalFile("mob_vpreview." . $ext, $a_prevpic["tmp_name"]);
1948 }
1949 }
1950
1957 public function generatePreviewPic($a_width, $a_height)
1958 {
1959 $item = $this->getMediaItem("Standard");
1960
1961 if ($item->getLocationType() == "LocalFile" &&
1962 is_int(strpos($item->getFormat(), "image/"))) {
1963 $dir = ilObjMediaObject::_getDirectory($this->getId());
1964 $file = $dir . "/" .
1965 $item->getLocation();
1966 if (is_file($file)) {
1967 if (ilUtil::isConvertVersionAtLeast("6.3.8-3")) {
1968 ilUtil::execConvert(ilUtil::escapeShellArg($file) . "[0] -geometry " . $a_width . "x" . $a_height . "^ -gravity center -extent " . $a_width . "x" . $a_height . " PNG:" . $dir . "/mob_vpreview.png");
1969 } else {
1970 ilUtil::convertImage($file, $dir . "/mob_vpreview.png", "PNG", $a_width . "x" . $a_height);
1971 }
1972 }
1973 }
1974 }
1975
1982 public function getVideoPreviewPic($a_filename_only = false)
1983 {
1984 $dir = ilObjMediaObject::_getDirectory($this->getId());
1985 $ppics = array("mob_vpreview.jpg",
1986 "mob_vpreview.jpeg",
1987 "mob_vpreview.png");
1988 foreach ($ppics as $p) {
1989 if (is_file($dir . "/" . $p)) {
1990 if ($a_filename_only) {
1991 return $p;
1992 } else {
1993 return $dir . "/" . $p;
1994 }
1995 }
1996 }
1997 return "";
1998 }
1999
2006 public static function fixFilename($a_name)
2007 {
2008 $a_name = ilUtil::getASCIIFilename($a_name);
2009
2010 $rchars = array("`", "=", "$", "{", "}", "'", ";", " ", "(", ")");
2011 $a_name = str_replace($rchars, "_", $a_name);
2012 $a_name = str_replace("__", "_", $a_name);
2013 return $a_name;
2014 }
2015
2016
2023 public function getMultiSrtUploadDir()
2024 {
2025 return ilObjMediaObject::_getDirectory($this->getId() . "/srt/tmp");
2026 }
2027
2028
2035 public function uploadMultipleSubtitleFile($a_file)
2036 {
2037 $lng = $this->lng;
2039
2040 include_once("./Services/MediaObjects/exceptions/class.ilMediaObjectsException.php");
2041 if (!is_file($a_file["tmp_name"])) {
2042 throw new ilMediaObjectsException($lng->txt("mob_file_could_not_be_uploaded"));
2043 }
2044
2045 $dir = $this->getMultiSrtUploadDir();
2046 ilUtil::delDir($dir, true);
2048 ilUtil::moveUploadedFile($a_file["tmp_name"], "multi_srt.zip", $dir . "/" . "multi_srt.zip");
2049 ilUtil::unzip($dir . "/multi_srt.zip", true);
2050 }
2051
2055 public function clearMultiSrtDirectory()
2056 {
2058 }
2059
2063 public function getMultiSrtFiles()
2064 {
2065 $items = array();
2066
2067 include_once("./Services/MetaData/classes/class.ilMDLanguageItem.php");
2069
2070 $dir = $this->getMultiSrtUploadDir();
2071 $files = ilUtil::getDir($dir);
2072 foreach ($files as $k => $i) {
2073 // check directory
2074 if ($i["type"] == "file" && !in_array($k, array(".", ".."))) {
2075 if (pathinfo($k, PATHINFO_EXTENSION) == "srt") {
2076 $lang = "";
2077 if (substr($k, strlen($k) - 7, 1) == "_") {
2078 $lang = substr($k, strlen($k) - 6, 2);
2079 if (!in_array($lang, $lang_codes)) {
2080 $lang = "";
2081 }
2082 }
2083 $items[] = array("filename" => $k, "lang" => $lang);
2084 }
2085 }
2086 }
2087 return $items;
2088 }
2089
2095 public static function renameExecutables($a_dir)
2096 {
2098 if (!self::isTypeAllowed("html")) {
2099 ilUtil::rRenameSuffix($a_dir, "html", "sec"); // see #20187
2100 }
2101 }
2102}
user()
Definition: user.php:4
$size
Definition: RandomTest.php:84
$tpl
Definition: ilias.php:10
$path
Definition: aliased.php:25
$users
Definition: authpage.php:44
$location
Definition: buildRTE.php:44
$_GET["client_id"]
An exception for terminatinating execution or to throw for unit testing.
static _instanciateQuestion($question_id)
Creates an instance of a question with a given question id.
static _lookupSurveyObjId($a_question_id)
const IL_MODE_ALIAS
const IL_MODE_OUTPUT
const IL_MODE_FULL
static _getQuestionInfo($question_id)
Returns question information from the database.
static handleUpdatedSourceObject($a_src_obj_type, $a_src_obj_id, $a_src_filesize, $a_owner_obj_ids=null, $a_is_prtf=false)
Find and update/create all related entries for source object.
static lookupExerciseIdForReturnedId($a_returned_id)
Get exercise from submission id (used in ilObjMediaObject)
Class ilForumDraftHistory.
static newInstanceByDraftId($draft_id)
static _lookupObjIdForForumId($a_for_id)
static _lookupTermId($a_def_id)
Looks up term id for a definition id.
static _lookGlossaryID($term_id)
get glossary id form term id
static _lookupContObjID($a_id)
get learning module / digibook id for lm object
static getLogger($a_component_id)
Get component logger.
static _getIntLinks($a_item_id)
get all internal links of a media items map areas
static getImageSize($a_location)
Get image size from location.
Class ilMediaItem.
static deleteAllItemsOfMob($a_mob_id)
Delete all items of a mob.
static _getMediaItemsOfMOb(&$a_mob)
read media items into media objects (static)
static _getMapAreasIntLinks($a_mob_id)
get all internal links of map areas of a mob
static _lookupLocationForMobId($a_mob_id, $a_purpose)
Lookup location for mob id.
General exception class for media objects.
static sanitizeDir($a_path)
Sanitize directory recursively.
static lookupMimeType($path_to_file, $fallback=self::APPLICATION__OCTET_STREAM, $a_external=null)
static _lookupContextObjId($a_news_id)
Context Object ID.
static _lookupMediaObjectUsages($a_mob_id)
Lookup media object usage(s)
Class ilObjMediaObject.
MDUpdateListener($a_element)
Meta data update listener.
update($a_upload=false)
update media object in db
getXML($a_mode=IL_MODE_FULL, $a_inst=0, $a_sign_locals=false)
get MediaObject XLM Tag
getMultiSrtFiles()
Get all srt files of srt multi upload.
exportMediaFullscreen($a_target_dir, $pg_obj)
& getMediaItem($a_purpose)
get item for media purpose
uploadVideoPreviewPic($a_prevpic)
Upload video preview picture.
setTitle($a_title)
set object title
static _getThumbnailDirectory($a_mob_id, $a_mode="filesystem")
get directory for files of media object (static)
static isTypeAllowed($a_type)
Is type allowed.
static getThumbnailPath($a_mob_id, $a_thumbname)
Get thumbnail path.
getTitle()
get object title @access public
static _deleteAllUsages($a_type, $a_id, $a_usage_hist_nr=0, $a_lang="-")
static
exportFiles($a_target_dir)
export all media files of object to target directory note: target directory must be the export target...
addMediaItem($a_item)
add media item to media object
getMultiSrtUploadDir()
Get directory for multi srt upload.
static getMimeType($a_file, $a_external=null)
get mime type for file
getRefId()
get reference id @access public
getId()
get object id @access public
static getAllowedFileTypes()
Get allowed file types.
static _useAutoStartParameterOnly($a_loc, $a_format)
Check whether only autostart parameter should be supported (instead of parameters input field.
static handleQuotaUpdate(ilObjMediaObject $a_mob)
static _lookupItemPath( $a_mob_id, $a_url_encode=false, $a_web=true, $a_purpose="")
Get path for item with specific purpose.
uploadAdditionalFile($a_name, $tmp_name, $a_subdir="", $a_mode="move_uploaded")
Create new media object and update page in db and return new media object.
containsIntLink()
returns true, if mob was marked as containing an intern link (via setContainsIntLink) (this method sh...
uploadMultipleSubtitleFile($a_file)
Upload multi srt file.
static getParentObjectIdForUsage($a_usage, $a_include_all_access_obj_ids=false)
Get's the repository object ID of a parent object, if possible.
static _saveUsage($a_mob_id, $a_type, $a_id, $a_usage_hist_nr=0, $a_lang="-")
Save usage of mob within another container (e.g.
makeThumbnail( $a_file, $a_thumbname, $a_format="png", $a_size="80")
Make thumbnail.
setRefId($a_id)
set reference id @access public
static getRestrictedFileTypes()
Get restricted file types (this is for the input form, this list will be empty, if "allowed list" is ...
setImportId($a_id)
set import id
updateMetaData()
update meta data entry
deleteMetaData()
delete meta data entry
escapeProperty($a_value)
Escape property (e.g.
static _getMobsOfObject($a_type, $a_id, $a_usage_hist_nr=0, $a_lang="-")
get mobs of object
static _getDirectory($a_mob_id)
Get absolute directory.
clearMultiSrtDirectory()
Clear multi feedback directory.
static _removeUsage($a_mob_id, $a_type, $a_id, $a_usage_hist_nr=0, $a_lang="-")
Remove usage of mob in another container.
setAlias($a_is_alias)
set wether page object is an alias
& getMediaItems()
get all media items
createReference()
creates reference for object
read()
read media object data from db
static _getSimpleMimeTypes()
Get simple mime types that deactivate parameter property files tab in ILIAS.
handleAmps($a_str)
Replace "&" (if not an "&") with "&".
static _lookupStandardItemPath( $a_mob_id, $a_url_encode=false, $a_web=true)
Get path for standard item.
duplicate()
Duplicate media object, return new media object.
static fixFilename($a_name)
Fix filename of uploaded file.
getVideoPreviewPic($a_filename_only=false)
Get video preview pic.
removeAllMediaItems()
remove all media items
create($a_create_meta_data=false, $a_save_media_items=true)
create media object in db
createDirectory()
Create file directory of media object.
getLinkedMediaObjects($a_ignore="")
Get all media objects linked in map areas of this media object.
static _createThumbnailDirectory($a_obj_id)
Create thumbnail directory.
uploadSrtFile($a_tmp_name, $a_language, $a_mode="move_uploaded")
Upload srt file.
static _getURL($a_mob_id)
get directory for files of media object (static)
generatePreviewPic($a_width, $a_height)
Upload video preview picture.
createMetaData()
create meta data entry
modifyExportIdentifier($a_tag, $a_param, $a_value)
static _getRelativeDirectory($a_mob_id)
Get relative (to webspace dir) directory.
static _determineWidthHeight( $a_format, $a_type, $a_file, $a_reference, $a_constrain_proportions, $a_use_original, $a_user_width, $a_user_height)
Determine width and height.
setContainsIntLink($a_contains_link)
content parser set this flag to true, if the media object contains internal links (this method should...
getUsages($a_include_history=true)
get all usages of current media object
getFilesOfDirectory($a_subdir="")
Get files of directory.
removeAdditionalFile($a_file)
Remove additional file.
exportXML(&$a_xml_writer, $a_inst=0)
export XML
static _resizeImage($a_file, $a_width, $a_height, $a_constrain_prop=false)
resize image and return new image file ("_width_height" string appended)
hasPurposeItem($purpose)
returns wether object has media item with specific purpose
static getForbiddenFileTypes()
Get forbidden file types.
__construct($a_id=0)
Constructor @access public.
putInTree($a_parent_ref)
maybe this method should be in tree object!?
static _exists($a_id, $a_reference=false, $a_type=null)
checks wether a lm content object with specified id exists or not
setDescription($a_description)
set description of media object
static lookupUsages($a_id, $a_include_history=true)
Lookup usages of media object.
static renameExecutables($a_dir)
Rename executables.
getDescription()
get description of media object
static _saveTempFileAsMediaObject($name, $tmp_name, $upload=true)
Create new media object and update page in db and return new media object.
static _lookupTestObjIdForQuestionId($a_q_id)
Get test Object ID for question ID.
static _getUsersForClipboadObject($a_type, $a_id)
get all users, that have a certain object within their clipboard
Class ilObject Basic functions for all objects.
getType()
get object type @access public
static _exists($a_id, $a_reference=false, $a_type=null)
checks if an object exists in object_data@access public
static _writeTitle($a_obj_id, $a_title)
write title to db (static)
static _lookupType($a_id, $a_reference=false)
lookup object type
static _writeDescription($a_obj_id, $a_desc)
write description to db (static)
static _getPageForQuestionId($a_q_id, $a_parent_type="")
Get page for question id.
static lookupParentId($a_id, $a_type)
Lookup parent id.
static _exists($a_parent_type, $a_id, $a_lang="", $a_no_cache=false)
Checks whether page exists.
static getFlashVideoPlayerDirectory()
Get flash video player directory.
static findPortfolioForPage($a_page_id)
Get portfolio id of page id.
static _lookupSLMID($a_id)
Lookup Scorm Learning Module ID for node id.
ILIAS Setting Class.
special template class to simplify handling of ITX/PEAR
static delDir($a_dir, $a_clean_only=false)
removes a dir and all its content (subdirs and files) recursively
static convertImage( $a_from, $a_to, $a_target_format="", $a_geometry="", $a_background_color="")
convert image
static isConvertVersionAtLeast($a_version)
Compare convert version numbers.
static insertInstIntoID($a_value)
inserts installation id into ILIAS id
static escapeShellArg($a_arg)
static getWebspaceDir($mode="filesystem")
get webspace directory
static execConvert($args)
execute convert command
static rCopy($a_sdir, $a_tdir, $preserveTimeAttributes=false)
Copies content of a directory $a_sdir recursively to a directory $a_tdir.
static resizeImage($a_from, $a_to, $a_width, $a_height, $a_constrain_prop=false)
resize image
static rRenameSuffix($a_dir, $a_old_suffix, $a_new_suffix)
Renames all files with certain suffix and gives them a new suffix.
static getDir($a_dir, $a_rec=false, $a_sub_dir="")
get directory
static getASCIIFilename($a_filename)
convert utf8 to ascii filename
static getHtmlPath($relative_path)
get url of path
static unzip($a_file, $overwrite=false, $a_flat=false)
unzip file
static makeDirParents($a_dir)
Create a new directory and all parent directories.
static deducibleSize($a_mime)
checks if mime type is provided by getimagesize()
static secureUrl($url)
Prepare secure href attribute.
static createDirectory($a_dir, $a_mod=0755)
create directory
static makeDir($a_dir)
creates a new directory and inherits all filesystem permissions of the parent directory You may pass ...
static renameExecutables($a_dir)
Rename uploaded executables for security reasons.
static signFile($path_to_file)
static lookupObjIdByPage($a_page_id)
returns the wiki/object id to a given page id
$def
Definition: croninfo.php:21
$key
Definition: croninfo.php:18
$i
Definition: disco.tpl.php:19
$h
$w
$r
Definition: example_031.php:79
xslt_free(&$proc)
xslt_create()
for($i=1; $i<=count($kw_cases_sel); $i+=1) $lang
Definition: langwiz.php:349
$format
Definition: metadata.php:141
$info
Definition: index.php:5
$files
Definition: metarefresh.php:49
$row
static getDescription()
Definition: Php.php:51
update($pash, $contents, Config $config)
redirection script todo: (a better solution should control the processing via a xml file)
$ret
Definition: parser.php:6
global $ilSetting
Definition: privfeed.php:17
global $DIC
Definition: saml.php:7
global $ilDB
$mobs
$ilUser
Definition: imgupload.php:18
$a_type
Definition: workflow.php:92