ILIAS  release_8 Revision v8.19
All Data Structures Namespaces Files Functions Variables Modules Pages
class.ilNewsTimelineGUI.php
Go to the documentation of this file.
1 <?php
2 
22 
30 {
31  protected \ILIAS\HTTP\Services $http;
32  protected int $news_id;
33  protected bool $include_auto_entries;
34  protected ilCtrl $ctrl;
36  protected int $ref_id;
37  protected ilLanguage $lng;
39  protected ilObjUser $user;
41  protected static int $items_per_load = 10;
42  protected bool $user_edit_all = false;
44 
45  protected function __construct(
46  int $a_ref_id,
47  bool $a_include_auto_entries
48  ) {
49  global $DIC;
50 
51  $this->ctrl = $DIC->ctrl();
52  $this->tpl = $DIC["tpl"];
53  $this->ref_id = $a_ref_id;
54  $this->lng = $DIC->language();
55  $this->toolbar = $DIC->toolbar();
56  $this->user = $DIC->user();
57  $this->include_auto_entries = $a_include_auto_entries;
58  $this->access = $DIC->access();
59  $this->http = $DIC->http();
60 
61  $this->std_request = new StandardGUIRequest(
62  $DIC->http(),
63  $DIC->refinery()
64  );
65 
66  $this->news_id = $this->std_request->getNewsId();
67 
68  $this->lng->loadLanguageModule("news");
69  }
70 
74  public function setUserEditAll(bool $a_val): void
75  {
76  $this->user_edit_all = $a_val;
77  }
78 
82  public function getUserEditAll(): bool
83  {
84  return $this->user_edit_all;
85  }
86 
87  public static function getInstance(
88  int $a_ref_id,
89  bool $a_include_auto_entries
91  return new self($a_ref_id, $a_include_auto_entries);
92  }
93 
97  public function executeCommand(): void
98  {
99  $ctrl = $this->ctrl;
100 
101  $next_class = $this->ctrl->getNextClass($this);
102  $cmd = $this->ctrl->getCmd("show");
103 
104  switch ($next_class) {
105  case "illikegui":
106  $i = new ilNewsItem($this->news_id);
107  $likef = new ilLikeFactoryGUI();
108  $like_gui = $likef->widget([$i->getContextObjId()]);
109  $ctrl->saveParameter($this, "news_id");
110  $like_gui->setObject(
111  $i->getContextObjId(),
112  $i->getContextObjType(),
113  $i->getContextSubObjId(),
114  $i->getContextSubObjType(),
116  );
117  $ret = $ctrl->forwardCommand($like_gui);
118  break;
119 
120  case "ilnotegui":
121  $i = new ilNewsItem($this->news_id);
122  $ctrl->saveParameter($this, "news_id");
123  $notes_obj_type = ($i->getContextSubObjType() == "")
124  ? $i->getContextObjType()
125  : $i->getContextSubObjType();
126  $note_gui = new ilNoteGUI(
127  $i->getContextObjId(),
128  $i->getContextSubObjId(),
129  $notes_obj_type,
130  false,
131  $i->getId()
132  );
133  $note_gui->setShowHeader(false);
134  $ret = $ctrl->forwardCommand($note_gui);
135  break;
136 
137  default:
138  if (in_array($cmd, ["show", "save", "update", "loadMore", "remove", "updateNewsItem"])) {
139  $this->$cmd();
140  }
141  }
142  }
143 
144  public function show(ilPropertyFormGUI $form = null): void
145  {
146  // toolbar
147  if ($this->access->checkAccess("news_add_news", "", $this->ref_id)) {
149  $b->setCaption('news_add_news');
150  $b->setOnClick("return il.News.create();");
151  $b->setPrimary(true);
152  $this->toolbar->addButtonInstance($b);
153  }
154 
155  $news_item = new ilNewsItem();
156  $news_item->setContextObjId($this->ctrl->getContextObjId());
157  $news_item->setContextObjType($this->ctrl->getContextObjType());
158 
159  $news_data = $news_item->getNewsForRefId(
160  $this->ref_id,
161  false,
162  false,
163  0,
164  true,
165  false,
166  !$this->include_auto_entries,
167  false,
168  null,
169  self::$items_per_load
170  );
171 
172  $timeline = ilTimelineGUI::getInstance();
173 
174  // get like widget
175  $obj_ids = array_unique(array_map(static function (array $a): int {
176  return (int) $a["context_obj_id"];
177  }, $news_data));
178  $likef = new ilLikeFactoryGUI();
179  $like_gui = $likef->widget($obj_ids);
180 
181  $js_items = [];
182  foreach ($news_data as $d) {
183  $news_item = new ilNewsItem((int) $d["id"]);
184  $item = ilNewsTimelineItemGUI::getInstance($news_item, (int) $d["ref_id"], $like_gui);
185  $item->setUserEditAll($this->getUserEditAll());
186  $timeline->addItem($item);
187  $js_items[$d["id"]] = [
188  "id" => $d["id"],
189  "user_id" => $d["user_id"],
190  "title" => $d["title"],
191  "content" => $d["content"] . $d["content_long"],
192  "content_long" => "",
193  "priority" => $d["priority"],
194  "visibility" => $d["visibility"],
195  "content_type" => $d["content_type"],
196  "mob_id" => $d["mob_id"]
197  ];
198  }
199 
200  $this->tpl->addOnLoadCode("il.News.setItems(" . json_encode($js_items, JSON_THROW_ON_ERROR) . ");");
201  $this->tpl->addOnLoadCode("il.News.setAjaxUrl('" . $this->ctrl->getLinkTarget($this, "", "", true) . "');");
202 
203  if (count($news_data) > 0) {
204  $ttpl = new ilTemplate("tpl.news_timeline.html", true, true, "Services/News");
205  $ttpl->setVariable("NEWS", $timeline->render());
206  $ttpl->setVariable("EDIT_MODAL", $this->getEditModal($form));
207  $ttpl->setVariable("DELETE_MODAL", $this->getDeleteModal());
208  $ttpl->setVariable("LOADER", ilUtil::getImagePath("loader.svg"));
209  $this->tpl->setContent($ttpl->get());
210  } else {
211  $this->tpl->setOnScreenMessage('info', $this->lng->txt("news_timline_add_entries_info"));
212  $this->tpl->setContent($this->getEditModal());
213  }
214 
215  $this->lng->toJS("create");
216  $this->lng->toJS("edit");
217  $this->lng->toJS("update");
218  $this->lng->toJS("save");
219 
220  $this->tpl->addJavaScript("./Services/News/js/News.js");
222  }
223 
224  public function loadMore(): void
225  {
226  $news_item = new ilNewsItem();
227  $news_item->setContextObjId($this->ctrl->getContextObjId());
228  $news_item->setContextObjType($this->ctrl->getContextObjType());
229 
230  $excluded = $this->std_request->getRenderedNews();
231 
232  $news_data = $news_item->getNewsForRefId(
233  $this->ref_id,
234  false,
235  false,
236  0,
237  true,
238  false,
239  !$this->include_auto_entries,
240  false,
241  null,
242  self::$items_per_load,
243  $excluded
244  );
245 
246  $timeline = ilTimelineGUI::getInstance();
247 
248  // get like widget
249  $obj_ids = array_unique(array_map(static function ($a): int {
250  return (int) $a["context_obj_id"];
251  }, $news_data));
252  $likef = new ilLikeFactoryGUI();
253  $like_gui = $likef->widget($obj_ids);
254 
255  $js_items = [];
256  foreach ($news_data as $d) {
257  $news_item = new ilNewsItem((int) $d["id"]);
258  $item = ilNewsTimelineItemGUI::getInstance($news_item, (int) $d["ref_id"], $like_gui);
259  $item->setUserEditAll($this->getUserEditAll());
260  $timeline->addItem($item);
261  $js_items[$d["id"]] = [
262  "id" => $d["id"],
263  "user_id" => $d["user_id"],
264  "title" => $d["title"],
265  "content" => $d["content"] . $d["content_long"],
266  "content_long" => "",
267  "priority" => $d["priority"],
268  "visibility" => $d["visibility"],
269  "content_type" => $d["content_type"],
270  "mob_id" => $d["mob_id"]
271  ];
272  }
273 
274  $obj = new stdClass();
275  $obj->data = $js_items;
276  $obj->html = $timeline->render(true);
277 
278  $this->send(json_encode($obj, JSON_THROW_ON_ERROR));
279  }
280 
284  protected function send(string $output): void
285  {
286  $this->http->saveResponse($this->http->response()->withBody(
287  Streams::ofString($output)
288  ));
289  $this->http->sendResponse();
290  $this->http->close();
291  }
292 
293  protected function updateNewsItem(): void
294  {
295  if ($this->std_request->getNewsAction() === "save") {
296  $this->save();
297  }
298  if ($this->std_request->getNewsAction() === "update") {
299  $this->update();
300  }
301  }
302 
303 
304  // Save (ajax)
305  public function save(): void
306  {
308  if ($form->checkInput()) {
309  $news_item = new ilNewsItem();
310  $news_item->setTitle($form->getInput("news_title"));
311  $news_item->setContent($form->getInput("news_content"));
312  $news_item->setVisibility($form->getInput("news_visibility"));
314  $news_item->setContentHtml(true);
315  }
316  //$news_item->setContentLong($form->getInput("news_content_long"));
317  $news_item->setContentLong("");
318 
319  $obj_id = ilObject::_lookupObjectId($this->ref_id);
320  $obj_type = ilObject::_lookupType($obj_id);
321  $news_item->setContextObjId($obj_id);
322  $news_item->setContextObjType($obj_type);
323  $news_item->setUserId($this->user->getId());
324 
325  $media = $_FILES["media"];
326  if ($media["name"] != "") {
327  $mob = ilObjMediaObject::_saveTempFileAsMediaObject($media["name"], $media["tmp_name"], true);
328  $news_item->setMobId($mob->getId());
329  }
330 
331  $news_set = new ilSetting("news");
332  if (!$news_set->get("enable_rss_for_internal")) {
333  $news_item->setVisibility("users");
334  }
335  $news_item->create();
336  $this->ctrl->redirect($this, "show");
337  } else {
338  $form->setValuesByPost();
339  $this->show($form);
340  $this->tpl->addOnLoadCode("il.News.create(true);");
341  }
342  }
343 
344 
345 
346  // Update (ajax)
347  public function update(): void
348  {
350  if ($form->checkInput()) {
351  $news_item = new ilNewsItem($this->std_request->getId());
352  $news_item->setTitle($form->getInput("news_title"));
353  $news_item->setContent($form->getInput("news_content"));
354  $news_item->setVisibility($form->getInput("news_visibility"));
355  //$news_item->setContentLong($form->getInput("news_content_long"));
357  $news_item->setContentHtml(true);
358  }
359  $news_item->setContentLong("");
360 
361  $media = $_FILES["media"];
362  $old_mob_id = 0;
363 
364  // delete old media object
365  if ($media["name"] != "" || $this->std_request->getDeleteMedia() > 0) {
366  if ($news_item->getMobId() > 0 && ilObject::_lookupType($news_item->getMobId()) === "mob") {
367  $old_mob_id = $news_item->getMobId();
368  }
369  $news_item->setMobId(0);
370  }
371 
372  if ($media["name"] != "") {
373  $mob = ilObjMediaObject::_saveTempFileAsMediaObject($media["name"], $media["tmp_name"], true);
374  $news_item->setMobId($mob->getId());
375  }
376 
377  $obj_id = ilObject::_lookupObjectId($this->ref_id);
378 
379  if ($news_item->getContextObjId() === $obj_id) {
380  $news_item->setUpdateUserId($this->user->getId());
381  $news_item->update();
382 
383  if ($old_mob_id > 0) {
384  $old_mob = new ilObjMediaObject($old_mob_id);
385  $old_mob->delete();
386  }
387  }
388  $this->ctrl->redirect($this, "show");
389  } else {
390  $form->setValuesByPost();
391  $this->show($form);
392  $this->tpl->addOnLoadCode("il.News.edit(" . $this->std_request->getNewsId() . ", true);");
393  }
394  }
395 
396  // Remove (ajax)
397  public function remove(): void
398  {
399  $news_item = new ilNewsItem($this->std_request->getNewsId());
400  if ($this->getUserEditAll() || $this->user->getId() === $news_item->getUserId()) {
401  $news_item->delete();
402  }
403  $this->send("");
404  }
405 
406  protected function getEditModal($form = null): string
407  {
408  $modal = ilModalGUI::getInstance();
409  $modal->setHeading($this->lng->txt("edit"));
410  $modal->setId("ilNewsEditModal");
411  $modal->setType(ilModalGUI::TYPE_LARGE);
412 
413  if (is_null($form)) {
415  }
416  $form->setShowTopButtons(false);
417  $form->setFormAction($this->ctrl->getFormAction($this));
418 
419 
420  //
421  $hi = new ilHiddenInputGUI("id");
422  $form->addItem($hi);
423  $act = new ilHiddenInputGUI("news_action");
424  $form->addItem($act);
425  $form->setId("news_edit_form");
426 
427  $modal->setBody($form->getHTML());
428 
429  return $modal->getHTML();
430  }
431 
432  protected function getDeleteModal(): string
433  {
434  $modal = ilModalGUI::getInstance();
435  $modal->setHeading($this->lng->txt("delete"));
436  $modal->setId("ilNewsDeleteModal");
437  $modal->setType(ilModalGUI::TYPE_LARGE);
438 
439  $confirm = ilSubmitButton::getInstance();
440  $confirm->setCaption("delete");
441  $confirm->setId("news_btn_delete");
442  $modal->addButton($confirm);
443 
444  $cancel = ilSubmitButton::getInstance();
445  $cancel->setCaption("cancel");
446  $cancel->setId("news_btn_cancel_delete");
447  $modal->addButton($cancel);
448 
449  $modal->setBody("<p id='news_delete_news_title'></p>" .
450  ilUtil::getSystemMessageHTML($this->lng->txt("news_really_delete_news"), "question"));
451 
452  return $modal->getHTML();
453  }
454 }
static getInstance(int $a_ref_id, bool $a_include_auto_entries)
static getSystemMessageHTML(string $a_txt, string $a_type="info")
Get HTML for a system message.
static getImagePath(string $img, string $module_path="", string $mode="output", bool $offline=false)
get image path (for images located in a template directory)
forwardCommand(object $a_gui_object)
setUserEditAll(bool $a_val)
Set user can edit other users postings.
Notes GUI class.
static initJavascript(ilGlobalTemplateInterface $a_tpl=null)
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.
setTitle(string $a_title)
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
setShowHeader(bool $a_val)
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)
for($i=6; $i< 13; $i++) for($i=1; $i< 13; $i++) $d
Definition: date.php:296
getUserEditAll()
Get user can edit other users postings.
$i
Definition: metadata.php:41
delete()
Delete news item.