ILIAS  release_6 Revision v6.24-5-g0c8bfefb3b8
class.ilLMContentRendererGUI.php
Go to the documentation of this file.
1<?php
2
3/* Copyright (c) 1998-2019 ILIAS open source, Extended GPL, see docs/LICENSE */
4
12{
13 const STATUS_ACCESS = 0;
21
25 protected $access;
26
30 protected $user;
31
35 protected $help;
36
40 protected $current_page;
41
45 protected $lm;
46
50 protected $lng;
51
55 protected $offline;
56
60 protected $tracker;
61
65 protected $ctrl;
66
70 protected $lm_tree;
71
75 protected $parent_gui;
76
80 protected $lm_set;
81
85 protected $lang;
86
90 protected $linker;
91
95 public function __construct(
103 $requested_obj_id
104 ) {
105 global $DIC;
106
107 $this->access = $access;
108 $this->user = $user;
109 $this->help = $help;
110 $this->ctrl = $ctrl;
111 $this->lm_tree = $service->getLMTree();
112 $this->lang = $service->getPresentationStatus()->getLang();
113 $this->current_page = $service->getNavigationStatus()->getCurrentPage();
114 $this->lm = $service->getLearningModule();
115 $this->lm_set = $service->getSettings();
116 $this->lng = $lng;
117 $this->offline = $service->getPresentationStatus()->offline;
118 $this->tracker = $service->getTracker();
119 $this->linker = $service->getLinker();
120 $this->parent_gui = $parent_gui;
121 $this->chapter_has_no_active_page = $service->getNavigationStatus()->isChapterWithoutActivePage();
122 $this->deactivated_page = $service->getNavigationStatus()->isDeactivatedPage();
123 $this->focus_id = $service->getPresentationStatus()->getFocusId();
124
125 $this->search_string = $service->getPresentationStatus()->getSearchString();
126 $this->requested_obj_id = $requested_obj_id;
127 $this->requested_focus_return = $service->getPresentationStatus()->getFocusReturn();
128 }
129
133 protected function initHelp()
134 {
135 $ilHelp = $this->help;
136 $ilHelp->setScreenIdComponent("lm");
137 $ilHelp->setScreenId("content");
138 $ilHelp->setSubScreenId("content");
139 }
140
147 protected function determineStatus()
148 {
150
151 $status = self::STATUS_ACCESS;
152
153 // check page id
154 $requested_page_lm = ilLMPage::lookupParentId($this->current_page, "lm");
155 if ($requested_page_lm != $this->lm->getId()) {
156 $status = self::STATUS_NO_ACCESS;
157 }
158
159
160 // check if page is (not) visible in public area
161 if ($user->getId() == ANONYMOUS_USER_ID &&
162 $this->lm->getPublicAccessMode() == 'selected') {
163 if (!ilLMObject::_isPagePublic($this->current_page)) {
165 }
166 }
167
168 // preconditions
169 if (!ilObjContentObject::_checkPreconditionsOfPage($this->lm->getRefId(), $this->lm->getId(), $this->current_page)) {
171 }
172
173 // if navigation is restricted based on correct answered questions
174 // check if we have preceeding pages including unsanswered/incorrect answered questions
175 if (!$this->offline) {
176 if ($this->lm->getRestrictForwardNavigation()) {
177 if ($this->tracker->hasPredIncorrectAnswers($this->current_page)) {
179 }
180 }
181 }
182
183 // no active page found in chapter
184 if ($this->chapter_has_no_active_page &&
185 ilLMObject::_lookupType($this->requested_obj_id) == "st") {
187 }
188
189 if ($this->deactivated_page) {
191 }
192
193 if ($this->current_page == 0) {
195 }
196
197
198 return $status;
199 }
200
204 protected function initSearchHighlighting()
205 {
207
208 if ($this->search_string != "" && !$this->offline) {
209 $cache = ilUserSearchCache::_getInstance($user->getId());
210 $cache->switchSearchType(ilUserSearchCache::LAST_QUERY);
211 $search_string = $cache->getQuery();
212
213 // advanced search?
214 if (is_array($search_string)) {
215 $search_string = $search_string["lom_content"];
216 }
217
218 $p = new ilQueryParser($search_string);
219 $p->parse();
220
221 $words = $p->getQuotedWords();
222 if (is_array($words)) {
223 foreach ($words as $w) {
224 ilTextHighlighterGUI::highlight("ilLMPageContent", $w);
225 }
226 }
227 }
228 }
229
230
237 public function render($a_head_foot_page_id = 0)
238 {
240
241 $this->initHelp();
242
243 switch ($this->determineStatus()) {
245 return $this->renderNoPageAccess();
246
248 return $this->renderNoPublicAccess();
249
251 return $this->renderPreconditionsOfPage();
252
255
257 return $this->renderNoPageInChapterMessage();
258
260 return $this->renderDeactivatedPageMessage();
261
263 return $this->renderNoPageFoundMessage();
264
265 }
266
267 // page id is e.g. > 0 when footer or header page is processed
268 if ($a_head_foot_page_id == 0) {
269 $page_id = $this->current_page;
270 $this->initSearchHighlighting();
271 } else {
272 $page_id = $a_head_foot_page_id;
273 }
274
275 // check if page is out of focus
276 $focus_mess = $this->renderFocusMessage();
277 $page_object_gui = $this->getLMPageGUI($page_id);
278
279 // @todo 6.0 (factor this out (maybe to ilLMPageGUI)
280 $this->parent_gui->basicPageGuiInit($page_object_gui);
281 $page_object = $page_object_gui->getPageObject();
282 $page_object->buildDom();
283 $page_object->registerOfflineHandler($this);
284
285 $page_object_gui->setTemplateOutput(false);
286
287 // Update course items
288 ilCourseLMHistory::_updateLastAccess($ilUser->getId(), $this->lm->getRefId(), $page_id);
289
290 // read link targets
291 $page_object_gui->setPageLinker($this->linker);
292
293 // get lm page object
294 $lm_pg_obj = new ilLMPageObject($this->lm, $page_id);
295 $lm_pg_obj->setLMId($this->lm->getId());
296
297 // determine target frames for internal links
298 $page_object_gui->setLinkFrame($_GET["frame"]);
299
300 // page title and tracking (not for header or footer page)
301 if ($page_id == 0 || ($page_id != $this->lm->getHeaderPage() &&
302 $page_id != $this->lm->getFooterPage())) {
303 $page_object_gui->setPresentationTitle(
305 $lm_pg_obj->getId(),
306 $this->lm->getPageHeader(),
307 $this->lm->isActiveNumbering(),
308 $this->lm_set->get("time_scheduled_page_activation"),
309 false,
310 0,
311 $this->lang
312 )
313 );
314
315 // track access
316 if ($page_id != 0 && !$this->offline) {
317 $this->tracker->trackAccess($page_id, $ilUser->getId());
318 }
319 } else {
320 $page_object_gui->setEnabledPageFocus(false);
321 $page_object_gui->getPageConfig()->setEnableSelfAssessment(false);
322 }
323
324 // ADDED FOR CITATION
325 $page_object_gui->setLinkParams("ref_id=" . $this->lm->getRefId());
326 $page_object_gui->setTemplateTargetVar("PAGE_CONTENT");
327 // @todo 6.0
328 // $page_object_gui->setSourcecodeDownloadScript($this->getSourcecodeDownloadLink());
329
330 $ret = $page_object_gui->presentation($page_object_gui->getOutputMode());
331
332 // process header
333 if ($this->lm->getHeaderPage() > 0 &&
334 $page_id != $this->lm->getHeaderPage() &&
335 ($page_id == 0 || $page_id != $this->lm->getFooterPage())) {
336 if (ilLMObject::_exists($this->lm->getHeaderPage())) {
337 $head = $this->render($this->lm->getHeaderPage());
338 }
339 }
340
341 // process footer
342 if ($this->lm->getFooterPage() > 0 &&
343 $page_id != $this->lm->getFooterPage() &&
344 ($page_id == 0 || $page_id != $this->lm->getHeaderPage())) {
345 if (ilLMObject::_exists($this->lm->getFooterPage())) {
346 $foot = $this->render($this->lm->getFooterPage());
347 }
348 }
349
350 return $head . $focus_mess . $ret . $foot;
351 }
352
359 public function getLMPageGUI($a_id)
360 {
361 if ($this->lang != "-" && ilPageObject::_exists("lm", $a_id, $this->lang)) {
362 $page_gui = new ilLMPageGUI($a_id, 0, false, $this->lang);
363 } else {
364 $page_gui = new ilLMPageGUI($a_id);
365 }
366 if ($this->offline) {
367 $page_gui->setOutputMode(ilPageObjectGUI::OFFLINE);
368 }
369 return $page_gui;
370 }
371
372
373
380 protected function renderFocusMessage()
381 {
382 $focus_mess = "";
383 if ($this->focus_id > 0) {
384 $path = $this->lm_tree->getPathId($this->current_page);
385
386 // out of focus
387 if (!in_array($this->focus_id, $path)) {
388 $mtpl = new ilTemplate(
389 "tpl.out_of_focus_message.html",
390 true,
391 true,
392 "Modules/LearningModule"
393 );
394 $mtpl->setVariable("MESSAGE", $this->lng->txt("cont_out_of_focus_message"));
395 $mtpl->setVariable("TXT_SHOW_CONTENT", $this->lng->txt("cont_show_content_after_focus"));
396
397 if ($this->requested_focus_return == 0 || ilObject::_lookupType((int) $this->requested_focus_return, true) != "crs") {
398 $mtpl->setVariable("TXT_BACK_BEGINNING", $this->lng->txt("cont_to_focus_beginning"));
399 $this->ctrl->setParameter($this->parent_gui, "obj_id", $this->focus_id);
400 $mtpl->setVariable("LINK_BACK_TO_BEGINNING", $this->ctrl->getLinkTarget($this->parent_gui, "layout"));
401 $this->ctrl->setParameter($this->parent_gui, "obj_id", $this->requested_obj_id);
402 } else {
403 $mtpl->setVariable("TXT_BACK_BEGINNING", $this->lng->txt("cont_to_focus_return_crs"));
404 $mtpl->setVariable("LINK_BACK_TO_BEGINNING", ilLink::_getLink($this->requested_focus_return));
405 }
406
407 $this->ctrl->setParameter($this->parent_gui, "focus_id", "");
408 $mtpl->setVariable("LINK_SHOW_CONTENT", $this->ctrl->getLinkTarget($this->parent_gui, "layout"));
409 $this->ctrl->setParameter($this->parent_gui, "focus_id", $this->requested_obj_id);
410
411 $focus_mess = $mtpl->get();
412 } else {
413 $sp = $this->getSuccessorPage();
414 $path2 = array();
415 if ($sp > 0) {
416 $path2 = $this->lm_tree->getPathId($this->getSuccessorPage());
417 }
418 if ($sp == 0 || !in_array($this->focus_id, $path2)) {
419 $mtpl = new ilTemplate(
420 "tpl.out_of_focus_message.html",
421 true,
422 true,
423 "Modules/LearningModule"
424 );
425 $mtpl->setVariable("MESSAGE", $this->lng->txt("cont_out_of_focus_message_last_page"));
426 $mtpl->setVariable("TXT_SHOW_CONTENT", $this->lng->txt("cont_show_content_after_focus"));
427
428 if ($this->requested_focus_return == 0 || ilObject::_lookupType($this->requested_focus_return, true) != "crs") {
429 $mtpl->setVariable("TXT_BACK_BEGINNING", $this->lng->txt("cont_to_focus_beginning"));
430 $this->ctrl->setParameter($this->parent_gui, "obj_id", $this->focus_id);
431 $mtpl->setVariable("LINK_BACK_TO_BEGINNING", $this->ctrl->getLinkTarget($this->parent_gui, "layout"));
432 $this->ctrl->setParameter($this->parent_gui, "obj_id", $this->requested_obj_id);
433 } else {
434 $mtpl->setVariable("TXT_BACK_BEGINNING", $this->lng->txt("cont_to_focus_return_crs"));
435 $mtpl->setVariable("LINK_BACK_TO_BEGINNING", ilLink::_getLink($this->requested_focus_return));
436 }
437
438 $this->ctrl->setParameter($this->parent_gui, "focus_id", "");
439 $mtpl->setVariable("LINK_SHOW_CONTENT", $this->ctrl->getLinkTarget($this->parent_gui, "layout"));
440 $this->ctrl->setParameter($this->parent_gui, "focus_id", $this->requested_obj_id);
441
442 $focus_mess = $mtpl->get();
443 }
444 }
445 }
446 return $focus_mess;
447 }
448
449
454 protected function renderNoPageAccess()
455 {
456 return $this->renderMessageScreen($this->lng->txt("msg_no_page_access"));
457 }
458
465 protected function renderMessageScreen($a_content)
466 {
467 // content style
468 $tpl = new ilTemplate("tpl.page_message_screen.html", true, true, "Modules/LearningModule");
469 $tpl->setVariable("TXT_PAGE_NO_PUBLIC_ACCESS", $a_content);
470
471 return $tpl->get();
472 }
473
478 protected function renderNoPublicAccess()
479 {
480 return $this->renderMessageScreen($this->lng->txt("msg_page_no_public_access"));
481 }
482
489 {
490 return $this->renderMessageScreen($this->lng->txt("cont_no_page_access_unansw_q"));
491 }
492
497 protected function renderNoPageInChapterMessage()
498 {
499 $mtpl = new ilTemplate(
500 "tpl.no_content_message.html",
501 true,
502 true,
503 "Modules/LearningModule"
504 );
505 $mtpl->setVariable("MESSAGE", $this->lng->txt("cont_no_page_in_chapter"));
506 $mtpl->setVariable(
507 "ITEM_TITLE",
508 ilLMObject::_lookupTitle($this->requested_obj_id)
509 );
510 return $mtpl->get();
511 }
512
517 protected function renderNoPageFoundMessage()
518 {
519 return $this->renderMessageScreen($this->lng->txt("cont_no_page"));
520 }
521
522
528 protected function renderDeactivatedPageMessage()
529 {
530 $mtpl = new ilTemplate(
531 "tpl.no_content_message.html",
532 true,
533 true,
534 "Modules/LearningModule"
535 );
536 $m = $this->lng->txt("cont_page_currently_deactivated");
537 $act_data = ilLMPage::_lookupActivationData($this->requested_obj_id, $this->lm->getType());
538 if ($act_data["show_activation_info"] &&
539 (ilUtil::now() < $act_data["activation_start"])) {
540 $m .= "<p>" . sprintf(
541 $this->lng->txt("cont_page_activation_on"),
543 new ilDateTime($act_data["activation_start"], IL_CAL_DATETIME)
544 )
545 ) .
546 "</p>";
547 }
548 $mtpl->setVariable("MESSAGE", $m);
549 $mtpl->setVariable(
550 "ITEM_TITLE",
551 ilLMObject::_lookupTitle($this->requested_obj_id)
552 );
553 return $mtpl->get();
554 }
555
556
561 {
562 $conds = ilObjContentObject::_getMissingPreconditionsOfPage($this->lm->getRefId(), $this->lm->getId(), $this->current_page);
563 $topchap = ilObjContentObject::_getMissingPreconditionsTopChapter($this->lm->getRefId(), $this->lm->getId(), $this->current_page);
564
565 $ptpl = new ilTemplate("tpl.page_preconditions.html", true, true, "Modules/LearningModule");
566
567 // list all missing preconditions
568 foreach ($conds as $cond) {
569 $obj_link = ilLink::_getLink($cond["trigger_ref_id"]);
570 $ptpl->setCurrentBlock("condition");
571 $ptpl->setVariable("VAL_ITEM", ilObject::_lookupTitle($cond["trigger_obj_id"]));
572 $ptpl->setVariable("LINK_ITEM", $obj_link);
573 if ($cond["operator"] == "passed") {
574 $cond_str = $this->lng->txt("passed");
575 } else {
576 $cond_str = $this->lng->txt("condition_" . $cond["operator"]);
577 }
578 $ptpl->setVariable("VAL_CONDITION", $cond_str . " " . $cond["value"]);
579 $ptpl->parseCurrentBlock();
580 }
581
582 $ptpl->setVariable(
583 "TXT_MISSING_PRECONDITIONS",
584 sprintf(
585 $this->lng->txt("cont_missing_preconditions"),
587 )
588 );
589 $ptpl->setVariable("TXT_ITEM", $this->lng->txt("object"));
590 $ptpl->setVariable("TXT_CONDITION", $this->lng->txt("condition"));
591
592 // output skip chapter link
593 $parent = $this->lm_tree->getParentId($topchap);
594 $childs = $this->lm_tree->getChildsByType($parent, "st");
595 $j = -2;
596 $i = 1;
597 foreach ($childs as $child) {
598 if ($child["child"] == $topchap) {
599 $j = $i;
600 }
601 if ($i++ == ($j + 1)) {
602 $succ_node = $this->lm_tree->fetchSuccessorNode($child["child"], "pg");
603 }
604 }
605 if ($succ_node != "") {
606 $link = "<br /><a href=\"" .
607 $this->linker->getLink("layout", $succ_node["obj_id"], $_GET["frame"]) .
608 "\">" . $this->lng->txt("cont_skip_chapter") . "</a>";
609 $ptpl->setVariable("LINK_SKIP_CHAPTER", $link);
610 }
611
612 return $ptpl->get();
613 }
614
615
622 public function getSuccessorPage()
623 {
625
626 $page_id = $this->current_page;
627
628 if (empty($page_id)) {
629 return 0;
630 }
631
632 // determine successor page_id
633 $found = false;
634
635 // empty chapter
636 if ($this->chapter_has_no_active_page &&
637 ilLMObject::_lookupType($this->requested_obj_id) == "st") {
638 $c_id = $this->requested_obj_id;
639 } else {
640 if ($this->deactivated_page) {
641 $c_id = $this->requested_obj_id;
642 } else {
643 $c_id = $page_id;
644 }
645 }
646 while (!$found) {
647 $succ_node = $this->lm_tree->fetchSuccessorNode($c_id, "pg");
648 $c_id = $succ_node["obj_id"];
649
650 $active = ilLMPage::_lookupActive(
651 $c_id,
652 $this->lm->getType(),
653 $this->lm_set->get("time_scheduled_page_activation")
654 );
655
656 if ($succ_node["obj_id"] > 0 &&
657 $ilUser->getId() == ANONYMOUS_USER_ID &&
658 ($this->lm->getPublicAccessMode() == "selected" &&
659 !ilLMObject::_isPagePublic($succ_node["obj_id"]))) {
660 $found = false;
661 } elseif ($succ_node["obj_id"] > 0 && !$active) {
662 // look, whether activation data should be shown
663 $act_data = ilLMPage::_lookupActivationData((int) $succ_node["obj_id"], $this->lm->getType());
664 if ($act_data["show_activation_info"] &&
665 (ilUtil::now() < $act_data["activation_start"])) {
666 $found = true;
667 } else {
668 $found = false;
669 }
670 } else {
671 $found = true;
672 }
673 }
674
675 if ($found) {
676 return $succ_node["obj_id"];
677 }
678 return 0;
679 }
680}
user()
Definition: user.php:4
$_GET["client_id"]
An exception for terminatinating execution or to throw for unit testing.
const IL_CAL_DATETIME
static _updateLastAccess($a_user_id, $a_lm_ref_id, $a_page_id)
This class provides processing control methods.
static formatDate(ilDateTime $date, $a_skip_day=false, $a_include_wd=false, $include_seconds=false)
Format a date @access public.
@classDescription Date and time handling
Help GUI class.
determineStatus()
Determine Status (should be factored out later to something like LMPageAccessStatus)
getLMPageGUI($a_id)
Get lm page gui object.
render($a_head_foot_page_id=0)
Render lm content.
__construct(ilLMPresentationService $service, ilLMPresentationGUI $parent_gui, ilLanguage $lng, ilCtrl $ctrl, ilAccessHandler $access, ilObjUser $user, ilHelpGUI $help, $requested_obj_id)
Constructor.
renderNavRestrictionDueToQuestions()
Show message if navigation to page is not allowed due to unanswered questions.
renderNoPageFoundMessage()
Render no page found message.
renderNoPageInChapterMessage()
Render no page in chapter message.
initSearchHighlighting()
Init search highlighting.
renderPreconditionsOfPage()
show preconditions of the page
renderNoPublicAccess()
Show info message, if page is not accessible in public area.
renderNoPageAccess()
Show info message, if page is not accessible in public area.
renderFocusMessage()
Render focus message.
renderDeactivatedPageMessage()
Render deactivated page message.
renderMessageScreen($a_content)
Show message screen.
static _lookupType($a_obj_id, $a_lm_id=0)
Lookup type.
static _isPagePublic($a_node_id, $a_check_public_mode=false)
static _lookupTitle($a_obj_id)
Lookup title.
static _exists($a_id)
checks wether a lm content object with specified id exists or not
Extension of ilPageObjectGUI for learning modules.
Class ilLMPageObject.
static _getPresentationTitle( $a_pg_id, $a_mode=self::CHAPTER_TITLE, $a_include_numbers=false, $a_time_scheduled_activation=false, $a_force_content=false, $a_lm_id=0, $a_lang="-", $a_include_short=false)
presentation title doesn't have to be page title, it may be chapter title + page title or chapter tit...
Class ilLMPresentationGUI.
Main service init and factory.
language handling
static _getMissingPreconditionsTopChapter($cont_obj_ref_id, $cont_obj_id, $page_id)
get top chapter of page for that any precondition is missing
static _checkPreconditionsOfPage($cont_ref_id, $cont_obj_id, $page_id)
checks wether the preconditions of a page are fulfilled or not
static _getMissingPreconditionsOfPage($cont_ref_id, $cont_obj_id, $page_id)
gets all missing preconditions of page
static _lookupTitle($a_id)
lookup object title
static _lookupType($a_id, $a_reference=false)
lookup object type
static _lookupActive($a_id, $a_parent_type, $a_check_scheduled_activation=false, $a_lang="-")
lookup activation status
static lookupParentId($a_id, $a_type)
Lookup parent id.
static _lookupActivationData($a_id, $a_parent_type, $a_lang="-")
Lookup activation data.
static _exists($a_parent_type, $a_id, $a_lang="", $a_no_cache=false)
Checks whether page exists.
special template class to simplify handling of ITX/PEAR
static highlight($a_dom_node_id, $a_text, $a_tpl=null)
Searches for all occurences of a text (case-insensitive) and highlights it.
static _getInstance($a_usr_id)
Get singleton instance.
static now()
Return current timestamp in Y-m-d H:i:s format.
help()
Definition: help.php:2
Interface ilAccessHandler.
$i
Definition: metadata.php:24
$ret
Definition: parser.php:6
$service
Definition: result.php:17
if(isset($_FILES['img_file']['size']) && $_FILES['img_file']['size'] > 0) $tpl
$ilUser
Definition: imgupload.php:18
$a_content
Definition: workflow.php:93
$DIC
Definition: xapitoken.php:46