ILIAS  release_9 Revision v9.13-25-g2c18ec4c24f
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  {
117  return $this->user_edit_all;
118  }
119 
120  public static function getInstance(
121  int $a_ref_id,
122  bool $a_include_auto_entries
123  ): ilNewsTimelineGUI {
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(),
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(),
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, "Services/News");
240  $ttpl->setVariable("NEWS", $timeline->render());
241  $ttpl->setVariable("EDIT_MODAL", $this->getEditModal($form));
242  //$ttpl->setVariable("DELETE_MODAL", $this->getDeleteModal());
243  $this->renderDeleteModal($ttpl);
244  $ttpl->setVariable("LOADER", ilUtil::getImagePath("media/loader.svg"));
245  $this->tpl->setContent($ttpl->get());
246  $html = $ttpl->get();
247  } else {
248  if ($this->getEnableAddNews()) {
249  $this->tpl->setOnScreenMessage('info', $this->lng->txt("news_timline_add_entries_info"));
250  $this->tpl->setContent($this->getEditModal());
251  $html = $this->getEditModal();
252  } else {
253  $mess = $this->ui->factory()->messageBox()->info(
254  $this->lng->txt("news_timline_no_entries")
255  );
256  $html = $this->ui->renderer()->render($mess);
257  }
258  }
259 
260  $this->lng->toJS("create");
261  $this->lng->toJS("edit");
262  $this->lng->toJS("update");
263  $this->lng->toJS("save");
264 
265  $this->tpl->addJavaScript("./Services/News/js/News.js");
266 
267  $this->notes->gui()->initJavascript();
268 
269  return $html;
270  }
271 
272  public function loadMore(): void
273  {
274  $news_item = new ilNewsItem();
275  $news_item->setContextObjId($this->ctrl->getContextObjId());
276  $news_item->setContextObjType($this->ctrl->getContextObjType());
277 
278  $excluded = $this->std_request->getRenderedNews();
279 
280  $this->readNewsData($excluded);
281 
282  $timeline = ilTimelineGUI::getInstance();
283 
284  // get like widget
285  $obj_ids = array_unique(array_map(static function ($a): int {
286  return (int) $a["context_obj_id"];
287  }, $this->news_data));
288  $likef = new ilLikeFactoryGUI();
289  $like_gui = $likef->widget($obj_ids);
290 
291  $js_items = [];
292  foreach ($this->news_data as $d) {
293  $news_item = new ilNewsItem((int) $d["id"]);
294  $item = ilNewsTimelineItemGUI::getInstance($news_item, (int) $d["ref_id"], $like_gui);
295  $item->setUserEditAll($this->getUserEditAll());
296  $timeline->addItem($item);
297  $js_items[$d["id"]] = [
298  "id" => $d["id"],
299  "user_id" => $d["user_id"],
300  "title" => $d["title"],
301  "content" => $d["content"] . $d["content_long"],
302  "content_long" => "",
303  "priority" => $d["priority"],
304  "visibility" => $d["visibility"],
305  "content_type" => $d["content_type"],
306  "mob_id" => $d["mob_id"]
307  ];
308  }
309 
310  $obj = new stdClass();
311  $obj->data = $js_items;
312  $obj->html = $timeline->render(true);
313 
314  $this->send(json_encode($obj, JSON_THROW_ON_ERROR));
315  }
316 
320  protected function send(string $output): void
321  {
322  $this->http->saveResponse($this->http->response()->withBody(
323  Streams::ofString($output)
324  ));
325  $this->http->sendResponse();
326  $this->http->close();
327  }
328 
329  protected function updateNewsItem(): void
330  {
331  if ($this->std_request->getNewsAction() === "save") {
332  $this->save();
333  }
334  if ($this->std_request->getNewsAction() === "update") {
335  $this->update();
336  }
337  }
338 
339 
340  // Save (ajax)
341  public function save(): void
342  {
344  if ($form->checkInput()) {
345  $news_item = new ilNewsItem();
346  $news_item->setTitle($form->getInput("news_title"));
347  $news_item->setContent($form->getInput("news_content"));
348  $news_item->setVisibility($form->getInput("news_visibility"));
350  $news_item->setContentHtml(true);
351  }
352  //$news_item->setContentLong($form->getInput("news_content_long"));
353  $news_item->setContentLong("");
354 
355  $obj_id = ilObject::_lookupObjectId($this->ref_id);
356  $obj_type = ilObject::_lookupType($obj_id);
357  $news_item->setContextObjId($obj_id);
358  $news_item->setContextObjType($obj_type);
359  $news_item->setUserId($this->user->getId());
360 
361  $media = $_FILES["media"];
362  if ($media["name"] != "") {
363  $mob = ilObjMediaObject::_saveTempFileAsMediaObject($media["name"], $media["tmp_name"], true);
364  $news_item->setMobId($mob->getId());
365  }
366 
367  $news_set = new ilSetting("news");
368  if (!$news_set->get("enable_rss_for_internal")) {
369  $news_item->setVisibility("users");
370  }
371  $news_item->create();
372  $this->ctrl->redirect($this, "show");
373  } else {
374  $form->setValuesByPost();
375  $this->show($form);
376  $this->tpl->addOnLoadCode("il.News.create(true);");
377  }
378  }
379 
380 
381 
382  // Update (ajax)
383  public function update(): void
384  {
386  if ($form->checkInput()) {
387  $news_item = new ilNewsItem($this->std_request->getId());
388  $news_item->setTitle($form->getInput("news_title"));
389  $news_item->setContent($form->getInput("news_content"));
390  $news_item->setVisibility($form->getInput("news_visibility"));
391  //$news_item->setContentLong($form->getInput("news_content_long"));
393  $news_item->setContentHtml(true);
394  }
395  $news_item->setContentLong("");
396 
397  $media = $_FILES["media"];
398  $old_mob_id = 0;
399 
400  // delete old media object
401  if ($media["name"] != "" || $this->std_request->getDeleteMedia() > 0) {
402  if ($news_item->getMobId() > 0 && ilObject::_lookupType($news_item->getMobId()) === "mob") {
403  $old_mob_id = $news_item->getMobId();
404  }
405  $news_item->setMobId(0);
406  }
407 
408  if ($media["name"] != "") {
409  $mob = ilObjMediaObject::_saveTempFileAsMediaObject($media["name"], $media["tmp_name"], true);
410  $news_item->setMobId($mob->getId());
411  }
412 
413  $obj_id = ilObject::_lookupObjectId($this->ref_id);
414 
415  if ($news_item->getContextObjId() === $obj_id) {
416  $news_item->setUpdateUserId($this->user->getId());
417  $news_item->update();
418 
419  if ($old_mob_id > 0) {
420  $old_mob = new ilObjMediaObject($old_mob_id);
421  $old_mob->delete();
422  }
423  }
424  $this->ctrl->redirect($this, "show");
425  } else {
426  $form->setValuesByPost();
427  $this->show($form);
428  $this->tpl->addOnLoadCode("il.News.edit(" . $this->std_request->getNewsId() . ", true);");
429  }
430  }
431 
432  // Remove (ajax)
433  public function remove(): void
434  {
435  $news_item = new ilNewsItem($this->std_request->getNewsId());
436  if ($this->getUserEditAll() || $this->user->getId() === $news_item->getUserId()) {
437  $news_item->delete();
438  }
439  $this->send("");
440  }
441 
442  protected function getEditModal($form = null): string
443  {
444  $modal = ilModalGUI::getInstance();
445  $modal->setHeading($this->lng->txt("edit"));
446  $modal->setId("ilNewsEditModal");
447  $modal->setType(ilModalGUI::TYPE_LARGE);
448 
449  if (is_null($form)) {
451  }
452  $form->setShowTopButtons(false);
453  $form->setFormAction($this->ctrl->getFormAction($this));
454 
455 
456  //
457  $hi = new ilHiddenInputGUI("id");
458  $form->addItem($hi);
459  $act = new ilHiddenInputGUI("news_action");
460  $form->addItem($act);
461  $form->setId("news_edit_form");
462 
463  $modal->setBody($form->getHTML());
464 
465  return $modal->getHTML();
466  }
467 
468  protected function renderDeleteModal(ilTemplate $tpl): void
469  {
470  $mbox = $this->gui->ui()->factory()->messageBox()->confirmation(
471  $this->lng->txt("news_really_delete_news")
472  );
473  $title = $this->gui->ui()->factory()->legacy("<p id='news_delete_news_title'></p>");
474  $modal = $this->gui->modal($this->lng->txt("delete"))
475  ->content([$title, $mbox])
476  ->button($this->lng->txt("delete"), "#", false, "il.News.remove(); return false;");
477  $c = $modal->getTriggerButtonComponents("");
478  $tpl->setVariable("DELETE_MODAL", $this->gui->ui()->renderer()->render($c["modal"]));
479  $tpl->setVariable("SIGNAL_ID", $c["signal"]);
480  }
481 
482  protected function downloadMob(): void
483  {
484  $news_id = $this->std_request->getNewsId();
485  $news = new ilNewsItem($news_id);
486  $news->deliverMobFile("Standard", true);
487  }
488 }
ILIAS Notes Service $notes
getHTML(ilPropertyFormGUI $form=null)
static getInstance(int $a_ref_id, bool $a_include_auto_entries)
static getImagePath(string $img, string $module_path="", string $mode="output", bool $offline=false)
get image path (for images located in a template directory)
ILIAS DI UIServices $ui
ILIAS News Timeline TimelineManager $manager
forwardCommand(object $a_gui_object)
setUserEditAll(bool $a_val)
Set user can edit other users postings.
global $DIC
Definition: feed.php:28
ILIAS HTTP Services $http
This file is part of ILIAS, a powerful learning management system published by ILIAS open source e-Le...
static http()
Fetches the global http state from ILIAS.
setVariable($variable, $value='')
Sets a variable value.
Definition: IT.php:546
setTitle(string $a_title)
renderDeleteModal(ilTemplate $tpl)
static getEditForm(int $a_mode, int $a_ref_id)
This file is part of ILIAS, a powerful learning management system published by ILIAS open source e-Le...
ilGlobalTemplateInterface $tpl
StandardGUIRequest $std_request
static _lookupObjectId(int $ref_id)
static _saveTempFileAsMediaObject(string $name, string $tmp_name, bool $upload=true)
Create new media object and update page in db and return new media object.
static getInstance()
This file is part of ILIAS, a powerful learning management system published by ILIAS open source e-Le...
A news item can be created by different sources.
show(ilPropertyFormGUI $form=null)
static getInstance(ilNewsItem $a_news_item, int $a_news_ref_id, ilLikeGUI $a_like_gui)
saveParameter(object $a_gui_obj, $a_parameter)
__construct(int $a_ref_id, bool $a_include_auto_entries)
$a
thx to https://mlocati.github.io/php-cs-fixer-configurator for the examples
static _lookupType(int $id, bool $reference=false)
ILIAS News InternalGUIService $gui
getUserEditAll()
Get user can edit other users postings.
delete()
Delete news item.