ILIAS  trunk Revision v12.0_alpha-377-g3641b37b9db
class.ilPCMediaObject.php
Go to the documentation of this file.
1<?php
2
20
27{
30 protected DOMNode $mal_node;
31 protected ilObjUser $user;
32 protected DOMNode $mob_node;
33 protected \ILIAS\DI\UIServices $ui;
34 protected ?ilObjMediaObject $mediaobject = null;
35 protected ilLanguage $lng;
37 protected static string $modal_show_signal = "";
38 protected static string $modal_suffix = "";
39
40 public function init(): void
41 {
42 global $DIC;
43
44 $this->user = $DIC->user();
45 $this->setType("media");
46 $this->ui = $DIC->ui();
47 $this->lng = $DIC->language();
48 $this->mob_usage_repo = $DIC->mediaObjects()
49 ->internal()
50 ->repo()
51 ->usage();
52 $this->ctrl = $DIC->ctrl();
53 }
54
55 public function readMediaObject(int $a_mob_id = 0): void
56 {
57 if ($a_mob_id > 0) {
58 $mob = new ilObjMediaObject($a_mob_id);
59 $this->setMediaObject($mob);
60 }
61 }
62
63 public function setHierId(string $a_hier_id): void
64 {
65 $this->hier_id = $a_hier_id;
66 }
67
68 public function setMediaObject(ilObjMediaObject $a_mediaobject): void
69 {
70 $this->mediaobject = $a_mediaobject;
71 }
72
73 public function getMediaObject(): ?ilObjMediaObject
74 {
75 return $this->mediaobject;
76 }
77
78 public function createMediaObject(): void
79 {
80 $this->setMediaObject(new ilObjMediaObject());
81 }
82
83 public function create(): void
84 {
85 $this->createPageContentNode();
86 }
87
88 public function createAlias(
89 ilPageObject $a_pg_obj,
90 string $a_hier_id,
91 string $a_pc_id = ""
92 ): void {
93 $this->setDomNode($this->dom_doc->createElement("PageContent"));
94 $a_pg_obj->insertContent($this, $a_hier_id, IL_INSERT_AFTER, $a_pc_id);
95 $mob_node = $this->dom_doc->createElement("MediaObject");
96 $mob_node = $this->getDomNode()->appendChild($mob_node);
97 $this->mal_node = $this->dom_doc->createElement("MediaAlias");
98 $this->mal_node = $mob_node->appendChild($this->mal_node);
99 $this->mal_node->setAttribute("OriginId", "il__mob_" . $this->getMediaObject()->getId());
100
101 // standard view
102 $item_node = $this->dom_doc->createElement("MediaAliasItem");
103 $item_node = $mob_node->appendChild($item_node);
104 $item_node->setAttribute("Purpose", "Standard");
105 $media_item = $this->getMediaObject()->getMediaItem("Standard");
106 if (is_null($media_item)) {
107 return;
108 }
109
110 $layout_node = $this->dom_doc->createElement("Layout");
111 $layout_node = $item_node->appendChild($layout_node);
112 if ($media_item->getWidth() > 0) {
113 //$layout_node->set_attribute("Width", $media_item->getWidth());
114 }
115 if ($media_item->getHeight() > 0) {
116 //$layout_node->set_attribute("Height", $media_item->getHeight());
117 }
118 $layout_node->setAttribute("HorizontalAlign", "Left");
119
120 // caption
121 if ($media_item->getCaption() != "") {
122 $cap_node = $this->dom_doc->createElement("Caption");
123 $cap_node = $item_node->appendChild($cap_node);
124 $cap_node->setAttribute("Align", "bottom");
125 $this->dom_util->setContent($cap_node, $media_item->getCaption());
126 }
127
128 // text representation
129 if ($media_item->getTextRepresentation() != "") {
130 $tr_node = $this->dom_doc->createElement("TextRepresentation");
131 $tr_node = $item_node->appendChild($tr_node);
132 $this->dom_util->setContent($tr_node, $media_item->getTextRepresentation());
133 }
134
135 $pars = $media_item->getParameters();
136 foreach ($pars as $par => $val) {
137 $par_node = $this->dom_doc->createElement("Parameter");
138 $par_node = $item_node->appendChild($par_node);
139 $par_node->setAttribute("Name", $par);
140 $par_node->setAttribute("Value", $val);
141 }
142
143 // fullscreen view
144 $fullscreen_item = $this->getMediaObject()->getMediaItem("Fullscreen");
145 if (is_object($fullscreen_item)) {
146 $item_node = $this->dom_doc->createElement("MediaAliasItem");
147 $item_node = $mob_node->appendChild($item_node);
148 $item_node->setAttribute("Purpose", "Fullscreen");
149
150 // width and height
151 $layout_node = $this->dom_doc->createElement("Layout");
152 $layout_node = $item_node->appendChild($layout_node);
153 if ($fullscreen_item->getWidth() > 0) {
154 $layout_node->setAttribute("Width", $fullscreen_item->getWidth());
155 }
156 if ($fullscreen_item->getHeight() > 0) {
157 $layout_node->setAttribute("Height", $fullscreen_item->getHeight());
158 }
159
160 // caption
161 if ($fullscreen_item->getCaption() != "") {
162 $cap_node = $this->dom_doc->createElement("Caption");
163 $cap_node = $item_node->appendChild($cap_node);
164 $cap_node->setAttribute("Align", "bottom");
165 $this->dom_util->setContent($cap_node, $fullscreen_item->getCaption());
166 }
167
168 // text representation
169 if ($fullscreen_item->getTextRepresentation() != "") {
170 $tr_node = $this->dom_doc->createElement("TextRepresentation");
171 $tr_node = $item_node->appendChild($tr_node);
172 $this->dom_util->setContent($tr_node, $fullscreen_item->getTextRepresentation());
173 }
174
175 $pars = $fullscreen_item->getParameters();
176 foreach ($pars as $par => $val) {
177 $par_node = $this->dom_doc->createElement("Parameter");
178 $par_node = $item_node->appendChild($par_node);
179 $par_node->setAttribute("Name", $par);
180 $par_node->setAttribute("Value", $val);
181 }
182 }
183 }
184
185 protected function getMediaAliasNode(): ?DOMNode
186 {
187 if (is_object($this->getChildNode())) {
188 $mal_node = $this->getChildNode()->firstChild;
189 if (is_object($mal_node) && $mal_node->nodeName == "MediaAlias") {
190 return $mal_node;
191 }
192 }
193 return null;
194 }
195
201 public function updateObjectReference(): void
202 {
203 $this->getMediaAliasNode()?->setAttribute("OriginId", "il__mob_" . $this->getMediaObject()->getId());
204 }
205
206 public function dumpXML(): string
207 {
208 return $this->dom_util->dump($this->getDomNode());
209 }
210
211 public function setClass(string $a_class): void
212 {
213 $this->dom_util->setAttribute($this->getMediaAliasNode(), "Class", $a_class);
214 }
215
219 public function getClass(): string
220 {
221 return (string) $this->getMediaAliasNode()?->getAttribute("Class");
222 }
223
227 public function setCaptionClass(string $a_class): void
228 {
229 $this->dom_util->setAttribute($this->getMediaAliasNode(), "CaptionClass", $a_class);
230 }
231
232 public function getCaptionClass(): string
233 {
234 return (string) $this->getMediaAliasNode()?->getAttribute("CaptionClass");
235 }
236
237 public static function getLangVars(): array
238 {
239 return array("pc_mob");
240 }
241
249 public static function afterPageUpdate(
250 ilPageObject $a_page,
251 DOMDocument $a_domdoc,
252 string $a_xml,
253 bool $a_creation
254 ): void {
255 if (!$a_page->getImportMode()) {
257 $a_page->getParentType() . ":pg",
258 $a_page->getId(),
259 0,
260 $a_page->getLanguage()
261 );
262 self::saveMobUsage($a_page, $a_domdoc);
263 foreach ($mob_ids as $mob) { // check, whether media object can be deleted
264 if (ilObject::_exists($mob) && ilObject::_lookupType($mob) == "mob") {
265 $mob_obj = new ilObjMediaObject($mob);
266 $usages = $mob_obj->getUsages(false);
267 if (count($usages) == 0) { // delete, if no usage exists
268 $mob_obj->delete();
269 }
270 }
271 }
272 }
273 }
274
275 public static function beforePageDelete(
276 ilPageObject $a_page
277 ): void {
278 $mob_ids = ilObjMediaObject::_getMobsOfObject(
279 $a_page->getParentType() . ":pg",
280 $a_page->getId(),
281 0,
282 $a_page->getLanguage()
283 );
284
286 $a_page->getParentType() . ":pg",
287 $a_page->getId(),
288 null,
289 $a_page->getLanguage()
290 );
291
292 foreach ($mob_ids as $mob) { // check, whether media object can be deleted
293 if (ilObject::_exists($mob) && ilObject::_lookupType($mob) == "mob") {
294 $mob_obj = new ilObjMediaObject($mob);
295 $usages = $mob_obj->getUsages(false);
296 if (count($usages) == 0) { // delete, if no usage exists
297 $mob_obj->delete();
298 }
299 }
300 }
301 }
302
310 public static function afterPageHistoryEntry(
311 ilPageObject $a_page,
312 DOMDocument $a_old_domdoc,
313 string $a_old_xml,
314 int $a_old_nr
315 ): void {
316 self::saveMobUsage($a_page, $a_old_domdoc, $a_old_nr);
317 }
318
319 public static function saveMobUsage(
320 ilPageObject $a_page,
321 DOMDocument $a_domdoc,
322 int $a_old_nr = 0
323 ): array {
324 $usages = array();
325
326 // media aliases
327 $xpath = new DOMXPath($a_domdoc);
328 $nodes = $xpath->query('//MediaAlias');
329 foreach ($nodes as $node) {
330 $id_arr = explode("_", $node->getAttribute("OriginId"));
331 $mob_id = $id_arr[count($id_arr) - 1];
332 if ($mob_id > 0 && $id_arr[1] == "") {
333 $usages[$mob_id] = true;
334 }
335 }
336
337 // media objects
338 $xpath = new DOMXPath($a_domdoc);
339 $nodes = $xpath->query('//MediaObject/MetaData/General/Identifier');
340 foreach ($nodes as $node) {
341 $mob_entry = $node->getAttribute("Entry");
342 $mob_arr = explode("_", $mob_entry);
343 $mob_id = $mob_arr[count($mob_arr) - 1];
344 if ($mob_id > 0 && $mob_arr[1] == "") {
345 $usages[$mob_id] = true;
346 }
347 }
348
349 // internal links
350 $xpath = new DOMXPath($a_domdoc);
351 $nodes = $xpath->query("//IntLink[@Type='MediaObject']");
352 foreach ($nodes as $node) {
353 $mob_target = $node->getAttribute("Target");
354 $mob_arr = explode("_", $mob_target);
355 //echo "<br>3<br>";
356 //echo $mob_target."<br>";
357 //var_dump($mob_arr);
358 $mob_id = $mob_arr[count($mob_arr) - 1];
359 if ($mob_id > 0 && $mob_arr[1] == "") {
360 $usages[$mob_id] = true;
361 }
362 }
363
365 $a_page->getParentType() . ":pg",
366 $a_page->getId(),
367 $a_old_nr,
368 $a_page->getLanguage()
369 );
370 foreach ($usages as $mob_id => $val) {
371 // save usage, if object exists...
372 if (ilObject::_lookupType($mob_id) == "mob") {
374 $mob_id,
375 $a_page->getParentType() . ":pg",
376 $a_page->getId(),
377 $a_old_nr,
378 $a_page->getLanguage()
379 );
380 }
381 }
382
383 return $usages;
384 }
385
387 string $a_output,
388 string $a_mode,
389 bool $a_abstract_only = false
390 ): string {
391 global $DIC;
392
393 $this->global_tpl = $DIC['tpl'];
394 $ilUser = $this->user;
395
396 if ($a_mode == "offline") {
397 $page = $this->getPage();
398
400 $page->getParentType() . ":pg",
401 $page->getId(),
402 0,
403 $page->getLanguage()
404 );
405 foreach ($mob_ids as $mob_id) {
406 $mob = new ilObjMediaObject($mob_id);
407 $srts = $mob->getSrtFiles();
408 foreach ($srts as $srt) {
409 if ($ilUser->getLanguage() == $srt["language"]) {
410 $srt_content = file_get_contents(ilObjMediaObject::_getDirectory($mob->getId()) . "/" . $srt["full_path"]);
411 $a_output = str_replace("[[[[[mobsubtitle;il__mob_" . $mob->getId() . "_Standard]]]]]", $srt_content, $a_output);
412 }
413 }
414 }
415 }
416
417 if ($a_abstract_only) {
418 return $a_output;
419 }
420
421 if ($a_mode === "edit") {
422 $a_output = str_replace(
423 "{{{{{Unsupported Media Type}}}}}",
424 $this->ui->renderer()->render(
425 $this->ui->factory()->messageBox()->info(
426 $this->lng->txt("copg_unsupported_media_type")
427 )
428 ),
429 $a_output
430 );
431 // currently media objects, when in translation mode
432 $a_output = str_replace(
433 "{{{{{No Media Type}}}}}",
434 '<div class="copg-new-content-placeholder">' .
435 $this->ui->renderer()->render(
436 $this->ui->factory()->symbol()->icon()->standard("pemed", "pemed", 'medium')
437 ) . "</div>",
438 $a_output
439 );
440 } else {
441 $a_output = str_replace(
442 "{{{{{Unsupported Media Type}}}}}",
443 "",
444 $a_output
445 );
446 $a_output = str_replace(
447 "{{{{{No Media Type}}}}}",
448 "",
449 $a_output
450 );
451 }
452
453 // add fullscreen modals
454 $page = $this->getPage();
455 $suffix = "-" . $page->getParentType() . "-" . $page->getId();
456 $modal = $this->ui->factory()->modal()->roundtrip(
457 $this->lng->txt("cont_fullscreen"),
458 $this->ui->factory()->legacy()->content("<iframe class='il-copg-mob-fullscreen' id='il-copg-mob-fullscreen" . $suffix . "'></iframe>")
459 );
460 $show_signal = $modal->getShowSignal();
461
462 $js = "
463 $(function () {
464 il.COPagePres.setFullscreenModalShowSignal('$show_signal', '$suffix');
465 });
466 ";
467 self::$modal_show_signal = $show_signal;
468 self::$modal_suffix = $suffix;
469 $this->global_tpl->addOnloadCode($js);
470
471 // async ensures to have onloadcode of modal in output
472 // if other main tpl is used, see #32198
473 // note: if always rendered async, $ not defined errors will be thrown in non-async cases
474 if ($this->ctrl->isAsynch()) {
475 $html = $this->ui->renderer()->renderAsync($modal);
476 } else {
477 $html = $this->ui->renderer()->render($modal);
478 }
479 return $a_output . "<div class='il-copg-mob-fullscreen-modal'>" . $html . "</div>";
480 }
481
482 public function getOnloadCode(string $a_mode): array
483 {
484 $onload_code = [];
485 // necessary due to 32198 (other main template used)
486 if (self::$modal_show_signal !== "") {
487 $onload_code[] = "il.COPagePres.setFullscreenModalShowSignal('" . self::$modal_show_signal .
488 "', '" . self::$modal_suffix . "');";
489 }
490 return $onload_code;
491 }
492
493 public function getJavascriptFiles(
494 string $a_mode
495 ): array {
496 return [];
497 }
498
499 public function getCssFiles(
500 string $a_mode
501 ): array {
502 return [];
503 }
504
506 {
507 $std_alias_item = new ilMediaAliasItem(
508 $this->getDomDoc(),
509 $this->getHierId(),
510 "Standard",
511 $this->getPCId()
512 );
513 return $std_alias_item;
514 }
515
517 {
518 $std_alias_item = new ilMediaAliasItem(
519 $this->getDomDoc(),
520 $this->getHierId(),
521 "Fullscreen",
522 $this->getPCId()
523 );
524 return $std_alias_item;
525 }
526
527 public function checkInstanceEditing(): bool
528 {
529 // if any properties are set on the instance,
530 // that are not accessible through the quick editing screen
531 // -> offer instance editing
532 $std_alias_item = $this->getStandardMediaAliasItem();
533 if ($std_alias_item->hasAnyPropertiesSet()) {
534 return true;
535 }
536 if ($this->getMediaObject()->hasFullscreenItem()) {
537 $full_alias_item = $this->getFullscreenMediaAliasItem();
538 if ($full_alias_item->hasAnyPropertiesSet()) {
539 return true;
540 }
541 }
542
543 // if the media object has any other use outside of the current page
544 // -> offer instance editing
546 $mob = $this->getMediaObject();
547 $page = $this->getPage();
548 if (is_object($mob)) {
549 $usages = $mob->getUsages();
550 $other_usages = array_filter($usages, function ($usage) use ($page) {
551 return ($usage["type"] != $page->getParentType() . ":pg" || $usage["id"] != $page->getId());
552 });
553 if (count($other_usages) > 0) {
554 return true;
555 }
556 }
557 // see https://mantis.ilias.de/view.php?id=38582
558 // we allow instance editing regardless of number of usages
559 return true;
560 }
561
562 public static function deleteHistoryLowerEqualThan(
563 string $parent_type,
564 int $page_id,
565 string $lang,
566 int $delete_lower_than_nr
567 ): void {
568 global $DIC;
569
570 $mob_usage_repo = $DIC->mediaObjects()
571 ->internal()
572 ->repo()
573 ->usage();
574
576
577 $mob_ids = $mob_usage_repo->getHistoryUsagesLowerEqualThan(
578 $parent_type . ":pg",
579 $page_id,
580 $delete_lower_than_nr,
581 $lang
582 );
583
584 $mob_usage_repo->deleteHistoryUsagesLowerEqualThan(
585 $parent_type . ":pg",
586 $page_id,
587 $delete_lower_than_nr,
588 $lang
589 );
590
591 foreach ($mob_ids as $mob_id) {
592 $usages = ilObjMediaObject::lookupUsages($mob_id, true);
593 $log->debug("...check deletion of mob $mob_id. Usages: " . count($usages));
594 if (count($usages) == 0) {
595 if (ilObject::_lookupType($mob_id) === "mob") {
596 $mob = new ilObjMediaObject($mob_id);
597 $log->debug("Deleting Mob ID: " . $mob_id);
598 $mob->delete();
599 }
600 }
601 }
602 }
603
604 public static function handleCopiedContent(
605 DOMDocument $a_domdoc,
606 bool $a_self_ass = true,
607 bool $a_clone_mobs = false,
608 int $new_parent_id = 0,
609 int $obj_copy_id = 0
610 ): void {
611 global $DIC;
612
613 if (!$a_clone_mobs) {
614 return;
615 }
616
617 $dom_util = $DIC->copage()->internal()->domain()->domUtil();
618 $path = "//MediaObject/MediaAlias";
619 $nodes = $dom_util->path($a_domdoc, $path);
620 foreach ($nodes as $node) {
621 $or_id = $node->getAttribute("OriginId");
622
623 $inst_id = ilInternalLink::_extractInstOfTarget($or_id);
625
626 if (!($inst_id > 0)) {
627 if ($mob_id > 0) {
628 $media_object = new ilObjMediaObject($mob_id);
629 $new_mob = $media_object->duplicate();
630 $node->setAttribute("OriginId", "il__mob_" . $new_mob->getId());
631 }
632 }
633 }
634 }
635}
deleteHistoryUsagesLowerEqualThan(string $a_type, int $a_id, int $a_usage_hist_nr, string $a_lang="-")
getHistoryUsagesLowerEqualThan(string $a_type, int $a_id, int $a_usage_hist_nr, string $a_lang="-")
const IL_INSERT_AFTER
language handling
static getLogger(string $a_component_id)
Get component logger.
This file is part of ILIAS, a powerful learning management system published by ILIAS open source e-Le...
static lookupUsages(int $a_id, bool $a_include_history=true)
Lookup usages of media object.
static _getDirectory(int $a_mob_id)
Get absolute directory.
static _deleteAllUsages(string $a_type, int $a_id, ?int $a_usage_hist_nr=0, string $a_lang="-")
static _saveUsage(int $a_mob_id, string $a_type, int $a_id, int $a_usage_hist_nr=0, string $a_lang="-")
Save usage of mob within another container (e.g.
static _getMobsOfObject(string $a_type, int $a_id, int|false $a_usage_hist_nr=0, string $a_lang="-")
User class.
static _lookupType(int $id, bool $reference=false)
static _exists(int $id, bool $reference=false, ?string $type=null)
checks if an object exists in object_data
Class ilPCMediaObject Media content object (see ILIAS DTD)
readMediaObject(int $a_mob_id=0)
static deleteHistoryLowerEqualThan(string $parent_type, int $page_id, string $lang, int $delete_lower_than_nr)
Overwrite in derived classes, if old history entries are being deleted.
static saveMobUsage(ilPageObject $a_page, DOMDocument $a_domdoc, int $a_old_nr=0)
ILIAS DI UIServices $ui
updateObjectReference()
Updates the media object referenced by the media alias.
getCssFiles(string $a_mode)
setHierId(string $a_hier_id)
getOnloadCode(string $a_mode)
UsageDBRepository $mob_usage_repo
getClass()
Get characteristic of section.
static beforePageDelete(ilPageObject $a_page)
Before page is being deleted.
ilCtrlInterface $ctrl
createAlias(ilPageObject $a_pg_obj, string $a_hier_id, string $a_pc_id="")
static afterPageHistoryEntry(ilPageObject $a_page, DOMDocument $a_old_domdoc, string $a_old_xml, int $a_old_nr)
After page history entry has been created.
getJavascriptFiles(string $a_mode)
modifyPageContentPostXsl(string $a_output, string $a_mode, bool $a_abstract_only=false)
Modify page content after xsl.
static string $modal_suffix
setClass(string $a_class)
setCaptionClass(string $a_class)
Set caption style class of media object.
static handleCopiedContent(DOMDocument $a_domdoc, bool $a_self_ass=true, bool $a_clone_mobs=false, int $new_parent_id=0, int $obj_copy_id=0)
Handle copied content.
static getLangVars()
Get lang vars needed for editing.
setMediaObject(ilObjMediaObject $a_mediaobject)
static string $modal_show_signal
static afterPageUpdate(ilPageObject $a_page, DOMDocument $a_domdoc, string $a_xml, bool $a_creation)
After page has been updated (or created)
ilObjMediaObject $mediaobject
ilGlobalPageTemplate $global_tpl
Content object of ilPageObject (see ILIAS DTD).
createPageContentNode(bool $a_set_this_node=true)
Create page content node (always use this method first when adding a new element)
setDomNode(DOMNode $node)
setType(string $a_type)
Set Type.
Class ilPageObject Handles PageObjects of ILIAS Learning Modules (see ILIAS DTD)
insertContent(ilPageContent $a_cont_obj, string $a_pos, int $a_mode=IL_INSERT_AFTER, string $a_pcid="", bool $remove_placeholder=true)
insert a content node before/after a sibling or as first child of a parent
return['delivery_method'=> 'php',]
This file is part of ILIAS, a powerful learning management system published by ILIAS open source e-Le...
This file is part of ILIAS, a powerful learning management system published by ILIAS open source e-Le...
$log
Definition: ltiresult.php:34
$path
Definition: ltiservices.php:30
if(!file_exists('../ilias.ini.php'))
global $DIC
Definition: shib_login.php:26
getLanguage()