ILIAS  trunk Revision v11.0_alpha-3011-gc6b235a2e85
class.ilNewsTimelineGUI.php
Go to the documentation of this file.
1<?php
2
22
30{
31 protected \ILIAS\News\InternalGUIService $gui;
32 protected int $period = 0;
33 protected \ILIAS\News\Timeline\TimelineManager $manager;
34 protected \ILIAS\DI\UIServices $ui;
35 protected \ILIAS\Notes\Service $notes;
36 protected \ILIAS\HTTP\Services $http;
37 protected int $news_id;
38 protected bool $include_auto_entries;
39 protected ilCtrl $ctrl;
41 protected int $ref_id;
42 protected ilLanguage $lng;
44 protected ilObjUser $user;
46 protected static int $items_per_load = 20;
47 protected bool $user_edit_all = false;
49 protected bool $enable_add_news = true;
50 protected ?array $news_data = null;
51
52 protected function __construct(
53 int $a_ref_id,
54 bool $a_include_auto_entries
55 ) {
56 global $DIC;
57
58 $this->ctrl = $DIC->ctrl();
59 $this->tpl = $DIC["tpl"];
60 $this->ref_id = $a_ref_id;
61 $this->lng = $DIC->language();
62 $this->toolbar = $DIC->toolbar();
63 $this->user = $DIC->user();
64 $this->include_auto_entries = $a_include_auto_entries;
65 $this->access = $DIC->access();
66 $this->http = $DIC->http();
67 $this->notes = $DIC->notes();
68
69 $this->std_request = $DIC->news()
70 ->internal()
71 ->gui()
72 ->standardRequest();
73
74 $this->news_id = $this->std_request->getNewsId();
75
76 $this->lng->loadLanguageModule("news");
77 $this->lng->loadLanguageModule("cont");
78 $this->ui = $DIC->ui();
79 $this->manager = $DIC->news()->internal()->domain()->timeline();
80 $this->gui = $DIC->news()->internal()->gui();
81 }
82
83 public function setEnableAddNews(bool $a_val): void
84 {
85 $this->enable_add_news = $a_val;
86 }
87
88 public function getEnableAddNews(): bool
89 {
91 }
92
93 public function setPeriod(int $a_val): void
94 {
95 $this->period = $a_val;
96 }
97
98 public function getPeriod(): int
99 {
100 return $this->period;
101 }
102
103
107 public function setUserEditAll(bool $a_val): void
108 {
109 $this->user_edit_all = $a_val;
110 }
111
115 public function getUserEditAll(): bool
116 {
118 }
119
120 public static function getInstance(
121 int $a_ref_id,
122 bool $a_include_auto_entries
124 return new self($a_ref_id, $a_include_auto_entries);
125 }
126
130 public function executeCommand(): void
131 {
132 $ctrl = $this->ctrl;
133
134 $next_class = $this->ctrl->getNextClass($this);
135 $cmd = $this->ctrl->getCmd("show");
136
137 switch ($next_class) {
138 case "illikegui":
139 $i = new ilNewsItem($this->news_id);
140 $likef = new ilLikeFactoryGUI();
141 $like_gui = $likef->widget([$i->getContextObjId()]);
142 $ctrl->saveParameter($this, "news_id");
143 $like_gui->setObject(
144 $i->getContextObjId(),
145 $i->getContextObjType(),
146 $i->getContextSubObjId(),
147 $i->getContextSubObjType(),
148 $this->news_id
149 );
150 $ret = $ctrl->forwardCommand($like_gui);
151 break;
152
153 case strtolower(ilCommentGUI::class):
154 $i = new ilNewsItem($this->news_id);
155 $ctrl->saveParameter($this, "news_id");
156 $notes_obj_type = ($i->getContextSubObjType() == "")
157 ? $i->getContextObjType()
158 : $i->getContextSubObjType();
159 $comment_gui = $this->notes->gui()->getCommentsGUI(
160 $i->getContextObjId(),
161 $i->getContextSubObjId(),
162 $notes_obj_type,
163 $i->getId()
164 );
165 $comment_gui->setShowHeader(false);
166 $ret = $ctrl->forwardCommand($comment_gui);
167 break;
168
169 default:
170 if (in_array($cmd, ["show", "save", "update", "loadMore", "remove", "updateNewsItem", "downloadMob"])) {
171 $this->$cmd();
172 }
173 }
174 }
175
176 public function show(?ilPropertyFormGUI $form = null): void
177 {
178 $this->tpl->setContent($this->getHTML($form));
179 }
180
181 protected function readNewsData($excluded = []): void
182 {
183 $this->news_data = $this->manager->getNewsData(
184 $this->ref_id,
185 $this->ctrl->getContextObjId(),
186 $this->ctrl->getContextObjType(),
187 $this->period,
188 $this->include_auto_entries,
189 self::$items_per_load,
190 $excluded
191 );
192 }
193
194 public function getHTML(?ilPropertyFormGUI $form = null): string
195 {
196 // toolbar
197 if ($this->getEnableAddNews() &&
198 $this->access->checkAccess("news_add_news", "", $this->ref_id)) {
199 $this->gui->button(
200 $this->lng->txt("news_add_news"),
201 "#"
202 )->onClick("return il.News.create();")->primary()->toToolbar(true, $this->toolbar);
203 }
204
205 $this->readNewsData();
206
207 $timeline = ilTimelineGUI::getInstance();
208
209 // get like widget
210 $obj_ids = array_unique(array_map(static function (array $a): int {
211 return (int) $a["context_obj_id"];
212 }, $this->news_data));
213 $likef = new ilLikeFactoryGUI();
214 $like_gui = $likef->widget($obj_ids);
215
216 $js_items = [];
217 foreach ($this->news_data as $d) {
218 $news_item = new ilNewsItem((int) $d["id"]);
219 $item = ilNewsTimelineItemGUI::getInstance($news_item, (int) $d["ref_id"], $like_gui);
220 $item->setUserEditAll($this->getUserEditAll());
221 $timeline->addItem($item);
222 $js_items[$d["id"]] = [
223 "id" => $d["id"],
224 "user_id" => $d["user_id"],
225 "title" => $d["title"],
226 "content" => $d["content"] . $d["content_long"],
227 "content_long" => "",
228 "priority" => $d["priority"],
229 "visibility" => $d["visibility"],
230 "content_type" => $d["content_type"],
231 "mob_id" => $d["mob_id"]
232 ];
233 }
234
235 $this->tpl->addOnLoadCode("il.News.setItems(" . json_encode($js_items, JSON_THROW_ON_ERROR) . ");");
236 $this->tpl->addOnLoadCode("il.News.setAjaxUrl('" . $this->ctrl->getLinkTarget($this, "", "", true) . "');");
237
238 if (count($this->news_data) > 0) {
239 $ttpl = new ilTemplate("tpl.news_timeline.html", true, true, "components/ILIAS/News");
240 $ttpl->setVariable("NEWS", $timeline->render());
241 $this->renderDeleteModal($ttpl);
242 $this->renderEditModal($form, $ttpl);
243 $ttpl->setVariable("LOADER", ilUtil::getImagePath("media/loader.svg"));
244 $this->tpl->setContent($ttpl->get());
245 $html = $ttpl->get();
246 } else {
247 if ($this->getEnableAddNews()) {
248 $ttpl = new ilTemplate("tpl.news_timeline.html", true, true, "components/ILIAS/News");
249 $this->tpl->setOnScreenMessage('info', $this->lng->txt("news_timline_add_entries_info"));
250 $this->renderEditModal($form, $ttpl);
251 $this->tpl->setContent($ttpl->get());
252 $html = $ttpl->get();
253 } else {
254 $mess = $this->ui->factory()->messageBox()->info(
255 $this->lng->txt("news_timline_no_entries")
256 );
257 $html = $this->ui->renderer()->render($mess);
258 }
259 }
260
261 $this->lng->toJS("create");
262 $this->lng->toJS("edit");
263 $this->lng->toJS("update");
264 $this->lng->toJS("save");
265
266 $debug = false;
267 if ($debug) {
268 $this->tpl->addJavaScript("../components/ILIAS/News/resources/News.js");
269 } else {
270 $this->tpl->addJavaScript("assets/js/News.js");
271 }
272 $this->notes->gui()->initJavascript();
273 return $html;
274 }
275
276 public function loadMore(): void
277 {
278 $news_item = new ilNewsItem();
279 $news_item->setContextObjId($this->ctrl->getContextObjId());
280 $news_item->setContextObjType($this->ctrl->getContextObjType());
281
282 $excluded = $this->std_request->getRenderedNews();
283
284 $this->readNewsData($excluded);
285
286 $timeline = ilTimelineGUI::getInstance();
287
288 // get like widget
289 $obj_ids = array_unique(array_map(static function ($a): int {
290 return (int) $a["context_obj_id"];
291 }, $this->news_data));
292 $likef = new ilLikeFactoryGUI();
293 $like_gui = $likef->widget($obj_ids);
294
295 $js_items = [];
296 foreach ($this->news_data as $d) {
297 $news_item = new ilNewsItem((int) $d["id"]);
298 $item = ilNewsTimelineItemGUI::getInstance($news_item, (int) $d["ref_id"], $like_gui);
299 $item->setUserEditAll($this->getUserEditAll());
300 $timeline->addItem($item);
301 $js_items[$d["id"]] = [
302 "id" => $d["id"],
303 "user_id" => $d["user_id"],
304 "title" => $d["title"],
305 "content" => $d["content"] . $d["content_long"],
306 "content_long" => "",
307 "priority" => $d["priority"],
308 "visibility" => $d["visibility"],
309 "content_type" => $d["content_type"],
310 "mob_id" => $d["mob_id"]
311 ];
312 }
313
314 $obj = new stdClass();
315 $obj->data = $js_items;
316 $obj->html = $timeline->render(true);
317
318 $this->send(json_encode($obj, JSON_THROW_ON_ERROR));
319 }
320
324 protected function send(string $output): void
325 {
326 $this->http->saveResponse($this->http->response()->withBody(
327 Streams::ofString($output)
328 ));
329 $this->http->sendResponse();
330 $this->http->close();
331 }
332
333 protected function updateNewsItem(): void
334 {
335 if ($this->std_request->getNewsAction() === "save") {
336 $this->save();
337 }
338 if ($this->std_request->getNewsAction() === "update") {
339 $this->update();
340 }
341 }
342
343
344 // Save (ajax)
345 public function save(): void
346 {
348 if ($form->checkInput()) {
349 $news_item = new ilNewsItem();
350 $news_item->setTitle($form->getInput("news_title"));
351 $news_item->setContent($form->getInput("news_content"));
352 $news_item->setVisibility($form->getInput("news_visibility"));
354 $news_item->setContentHtml(true);
355 }
356 //$news_item->setContentLong($form->getInput("news_content_long"));
357 $news_item->setContentLong("");
358
359 $obj_id = ilObject::_lookupObjectId($this->ref_id);
360 $obj_type = ilObject::_lookupType($obj_id);
361 $news_item->setContextObjId($obj_id);
362 $news_item->setContextObjType($obj_type);
363 $news_item->setUserId($this->user->getId());
364
365 $media = $_FILES["media"];
366 if ($media["name"] != "") {
367 $mob = ilObjMediaObject::_saveTempFileAsMediaObject($media["name"], $media["tmp_name"], true);
368 $news_item->setMobId($mob->getId());
369 }
370
371 $news_set = new ilSetting("news");
372 if (!$news_set->get("enable_rss_for_internal")) {
373 $news_item->setVisibility("users");
374 }
375 $news_item->create();
376 $this->ctrl->redirect($this, "show");
377 } else {
378 $form->setValuesByPost();
379 $this->show($form);
380 $this->tpl->addOnLoadCode("il.News.create(true);");
381 }
382 }
383
384
385
386 // Update (ajax)
387 public function update(): void
388 {
390 if ($form->checkInput()) {
391 $news_item = new ilNewsItem($this->std_request->getId());
392 $news_item->setTitle($form->getInput("news_title"));
393 $news_item->setContent($form->getInput("news_content"));
394 $news_item->setVisibility($form->getInput("news_visibility"));
395 //$news_item->setContentLong($form->getInput("news_content_long"));
397 $news_item->setContentHtml(true);
398 }
399 $news_item->setContentLong("");
400
401 $media = $_FILES["media"];
402 $old_mob_id = 0;
403
404 // delete old media object
405 if ($media["name"] != "" || $this->std_request->getDeleteMedia() > 0) {
406 if ($news_item->getMobId() > 0 && ilObject::_lookupType($news_item->getMobId()) === "mob") {
407 $old_mob_id = $news_item->getMobId();
408 }
409 $news_item->setMobId(0);
410 }
411
412 if ($media["name"] != "") {
413 $mob = ilObjMediaObject::_saveTempFileAsMediaObject($media["name"], $media["tmp_name"], true);
414 $news_item->setMobId($mob->getId());
415 }
416
417 $obj_id = ilObject::_lookupObjectId($this->ref_id);
418
419 if ($news_item->getContextObjId() === $obj_id) {
420 $news_item->setUpdateUserId($this->user->getId());
421 $news_item->update();
422
423 if ($old_mob_id > 0) {
424 $old_mob = new ilObjMediaObject($old_mob_id);
425 $old_mob->delete();
426 }
427 }
428 $this->ctrl->redirect($this, "show");
429 } else {
430 $form->setValuesByPost();
431 $this->show($form);
432 $this->tpl->addOnLoadCode("il.News.edit(" . $this->std_request->getNewsId() . ", true);");
433 }
434 }
435
436 // Remove (ajax)
437 public function remove(): void
438 {
439 $news_item = new ilNewsItem($this->std_request->getNewsId());
440 if ($this->getUserEditAll() || $this->user->getId() === $news_item->getUserId()) {
441 $news_item->delete();
442 }
443 $this->send("");
444 }
445
446 protected function getEditModal($form = null): \ILIAS\UI\Component\Modal\Modal
447 {
448 if (is_null($form)) {
450 }
451 $form->setShowTopButtons(false);
452 $form->setFormAction($this->ctrl->getFormAction($this));
453
454
455 //
456 $hi = new ilHiddenInputGUI("id");
457 $form->addItem($hi);
458 $act = new ilHiddenInputGUI("news_action");
459 $form->addItem($act);
460 $form->setId("news_edit_form");
461
462 $modal = $this->gui->ui()->factory()->modal()->roundtrip(
463 $this->lng->txt("edit"),
464 $this->ui->factory()->legacy()->content($form->getHTML())
465 );
466
467 return $modal;
468 }
469
470 protected function renderDeleteModal(ilTemplate $tpl): void
471 {
472 $mbox = $this->gui->ui()->factory()->messageBox()->confirmation(
473 $this->lng->txt("news_really_delete_news")
474 );
475 $title = $this->gui->ui()->factory()->legacy()->content("<p id='news_delete_news_title'></p>");
476 $modal = $this->gui->modal($this->lng->txt("delete"))
477 ->content([$title, $mbox])
478 ->button($this->lng->txt("delete"), "#", false, "il.News.remove(); return false;");
479 $c = $modal->getTriggerButtonComponents("");
480 $tpl->setVariable("DELETE_MODAL", $this->gui->ui()->renderer()->render($c["modal"]));
481 $tpl->setVariable("SIGNAL_ID", $c["signal"]);
482 }
483
484 protected function renderEditModal(?ilPropertyFormGUI $form, ilTemplate $tpl): void
485 {
486 $edit_modal = $this->getEditModal($form);
487 $signal = $edit_modal->getShowSignal()->getId();
488 $close_signal = $edit_modal->getCloseSignal()->getId();
489 $tpl->setVariable("SHOW_EDIT_SIGNAL", $signal);
490 $tpl->setVariable("CLOSE_EDIT_SIGNAL", $close_signal);
491 $tpl->setVariable("EDIT_MODAL", $this->ui->renderer()->render($edit_modal));
492 }
493
494 protected function downloadMob(): void
495 {
496 $news_id = $this->std_request->getNewsId();
497 $news = new ilNewsItem($news_id);
498 $news->deliverMobFile("Standard", true);
499 }
500}
setVariable($variable, $value='')
Sets a variable value.
Definition: IT.php:544
Stream factory which enables the user to create streams without the knowledge of the concrete class.
Definition: Streams.php:32
show()
returns the content of IniFile
Class ilCtrl provides processing control methods.
saveParameter(object $a_gui_obj, $a_parameter)
@inheritDoc
forwardCommand(object $a_gui_object)
@inheritDoc
This class represents a hidden form property in a property form.
language handling
This file is part of ILIAS, a powerful learning management system published by ILIAS open source e-Le...
static getEditForm(int $a_mode, int $a_ref_id)
A news item can be created by different sources.
ilGlobalTemplateInterface $tpl
show(?ilPropertyFormGUI $form=null)
ILIAS HTTP Services $http
renderDeleteModal(ilTemplate $tpl)
ILIAS News InternalGUIService $gui
ILIAS News Timeline TimelineManager $manager
static getInstance(int $a_ref_id, bool $a_include_auto_entries)
ILIAS DI UIServices $ui
ILIAS Notes Service $notes
setUserEditAll(bool $a_val)
Set user can edit other users postings.
getHTML(?ilPropertyFormGUI $form=null)
getUserEditAll()
Get user can edit other users postings.
renderEditModal(?ilPropertyFormGUI $form, ilTemplate $tpl)
StandardGUIRequest $std_request
__construct(int $a_ref_id, bool $a_include_auto_entries)
static getInstance(ilNewsItem $a_news_item, int $a_news_ref_id, ilLikeGUI $a_like_gui)
static _saveTempFileAsMediaObject(string $name, string $tmp_name, bool $upload=true)
User class.
static _lookupObjectId(int $ref_id)
static _lookupType(int $id, bool $reference=false)
This class represents a property form user interface.
ILIAS Setting Class.
special template class to simplify handling of ITX/PEAR
This file is part of ILIAS, a powerful learning management system published by ILIAS open source e-Le...
static getImagePath(string $image_name, string $module_path="", string $mode="output", bool $offline=false)
get image path (for images located in a template directory)
$c
Definition: deliver.php:25
return['delivery_method'=> 'php',]
This file is part of ILIAS, a powerful learning management system published by ILIAS open source e-Le...
Interface ilAccessHandler This interface combines all available interfaces which can be called via gl...
static http()
Fetches the global http state from ILIAS.
Interface Observer \BackgroundTasks Contains several chained tasks and infos about them.
$a
thx to https://mlocati.github.io/php-cs-fixer-configurator for the examples
global $DIC
Definition: shib_login.php:26
catch(ilCmiXapiException $e) send($response)
Definition: xapitoken.php:100