ILIAS  release_8 Revision v8.24
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 {
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(),
115 $this->news_id
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}
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 file is part of ILIAS, a powerful learning management system published by ILIAS open source e-Le...
language handling
This file is part of ILIAS, a powerful learning management system published by ILIAS open source e-Le...
static initJavascript(ilGlobalTemplateInterface $a_tpl=null)
static getInstance()
static getEditForm(int $a_mode, int $a_ref_id)
A news item can be created by different sources.
ilGlobalTemplateInterface $tpl
ILIAS HTTP Services $http
static getInstance(int $a_ref_id, bool $a_include_auto_entries)
setUserEditAll(bool $a_val)
Set user can edit other users postings.
getUserEditAll()
Get user can edit other users postings.
StandardGUIRequest $std_request
__construct(int $a_ref_id, bool $a_include_auto_entries)
show(ilPropertyFormGUI $form=null)
static getInstance(ilNewsItem $a_news_item, int $a_news_ref_id, ilLikeGUI $a_like_gui)
Notes GUI class.
static _saveTempFileAsMediaObject(string $name, string $tmp_name, bool $upload=true)
Create new media object and update page in db and return new media object.
User class.
static _lookupObjectId(int $ref_id)
static _lookupType(int $id, bool $reference=false)
This class represents a property form user interface.
This file is part of ILIAS, a powerful learning management system published by ILIAS open source e-Le...
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 $img, string $module_path="", string $mode="output", bool $offline=false)
get image path (for images located in a template directory)
static getSystemMessageHTML(string $a_txt, string $a_type="info")
Get HTML for a system message.
for( $i=6;$i< 13;$i++) for($i=1; $i< 13; $i++) $d
Definition: date.php:296
return['3gp', '7z', 'ai', 'aif', 'aifc', 'aiff', 'au', 'arw', 'avi', 'backup', 'bak', 'bas', 'bpmn', 'bpmn2', 'bmp', 'bib', 'bibtex', 'bz', 'bz2', 'c', 'c++', 'cc', 'cct', 'cdf', 'cer', 'class', 'cls', 'conf', 'cpp', 'crt', 'crs', 'crw', 'cr2', 'css', 'cst', 'csv', 'cur', 'db', 'dcr', 'des', 'dng', 'doc', 'docx', 'dot', 'dotx', 'dtd', 'dvi', 'el', 'eps', 'epub', 'f', 'f77', 'f90', 'flv', 'for', 'g3', 'gif', 'gl', 'gan', 'ggb', 'gsd', 'gsm', 'gtar', 'gz', 'gzip', 'h', 'hpp', 'htm', 'html', 'htmls', 'ibooks', 'ico', 'ics', 'ini', 'ipynb', 'java', 'jbf', 'jpeg', 'jpg', 'js', 'jsf', 'jso', 'json', 'latex', 'lang', 'less', 'log', 'lsp', 'ltx', 'm1v', 'm2a', 'm2v', 'm3u', 'm4a', 'm4v', 'markdown', 'm', 'mat', 'md', 'mdl', 'mdown', 'mid', 'min', 'midi', 'mobi', 'mod', 'mov', 'movie', 'mp2', 'mp3', 'mp4', 'mpa', 'mpeg', 'mpg', 'mph', 'mpga', 'mpp', 'mpt', 'mpv', 'mpx', 'mv', 'mw', 'mv4', 'nb', 'nbp', 'nef', 'nif', 'niff', 'obj', 'obm', 'odt', 'ods', 'odp', 'odg', 'odf', 'oga', 'ogg', 'ogv', 'old', 'p', 'pas', 'pbm', 'pcl', 'pct', 'pcx', 'pdf', 'pgm', 'pic', 'pict', 'png', 'por', 'pov', 'project', 'properties', 'ppa', 'ppm', 'pps', 'ppsx', 'ppt', 'pptx', 'ppz', 'ps', 'psd', 'pwz', 'qt', 'qtc', 'qti', 'qtif', 'r', 'ra', 'ram', 'rar', 'rast', 'rda', 'rev', 'rexx', 'ris', 'rf', 'rgb', 'rm', 'rmd', 'rmi', 'rmm', 'rmp', 'rt', 'rtf', 'rtx', 'rv', 's', 's3m', 'sav', 'sbs', 'sec', 'sdml', 'sgm', 'sgml', 'smi', 'smil', 'srt', 'sps', 'spv', 'stl', 'svg', 'swa', 'swf', 'swz', 'tar', 'tex', 'texi', 'texinfo', 'text', 'tgz', 'tif', 'tiff', 'ttf', 'txt', 'tmp', 'uvproj', 'vdf', 'vimeo', 'viv', 'vivo', 'vrml', 'vsdx', 'wav', 'webm', 'wmv', 'wmx', 'wmz', 'woff', 'wwd', 'xhtml', 'xif', 'xls', 'xlsx', 'xmind', 'xml', 'xsl', 'xsd', 'zip']
global $DIC
Definition: feed.php:28
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...
$i
Definition: metadata.php:41
static http()
Fetches the global http state from ILIAS.
$a
thx to https://mlocati.github.io/php-cs-fixer-configurator for the examples
catch(ilCmiXapiException $e) send($response)
Definition: xapitoken.php:100