ILIAS  trunk Revision v11.0_alpha-2638-g80c1d007f79
class.ilForumExportGUI.php
Go to the documentation of this file.
1 <?php
2 
19 declare(strict_types=1);
20 
23 
30 {
31  private const int MODE_EXPORT_WEB = 1;
32  private const int MODE_EXPORT_CLIENT = 2;
33 
35  public ilLanguage $lng;
38  public ilObjUser $user;
40  protected bool $is_moderator = false;
41  protected ilForum $frm;
43  private readonly GlobalHttpState $http;
44  private readonly Refinery $refinery;
45  private readonly int $ref_id;
46 
47  public function __construct()
48  {
49  global $DIC;
50 
51  $this->lng = $DIC->language();
52  $this->ctrl = $DIC->ctrl();
53  $this->access = $DIC->access();
54  $this->error = $DIC['ilErr'];
55  $this->user = $DIC->user();
56  $this->ilObjDataCache = $DIC['ilObjDataCache'];
57  $this->http = $DIC->http();
58  $this->refinery = $DIC->refinery();
59 
60  $this->ref_id = $this->retrieveRefId();
61 
62  $forum = new ilObjForum($this->ref_id);
63  $this->frm = $forum->Forum;
64  $this->objProperties = ilForumProperties::getInstance($forum->getId());
65 
66  $this->frm->setForumId($forum->getId());
67  $this->frm->setForumRefId($forum->getRefId());
68 
69  $this->lng->loadLanguageModule('forum');
70 
71  $this->is_moderator = $this->access->checkAccess('moderate_frm', '', $this->ref_id);
72  }
73 
74  private function retrieveRefId(): int
75  {
76  $ref_id = 0;
77  if ($this->http->wrapper()->query()->has('ref_id')) {
78  $ref_id = $this->http->wrapper()->query()->retrieve(
79  'ref_id',
80  $this->refinery->kindlyTo()->int()
81  );
82  }
83 
84  return $ref_id;
85  }
86 
87  private function ensureThreadBelongsToForum(int $objId, ilForumTopic $thread): void
88  {
89  $forumId = ilObjForum::lookupForumIdByObjId($objId);
90  if ($thread->getForumId() !== $forumId) {
91  $this->error->raiseError($this->lng->txt('permission_denied'), $this->error->MESSAGE);
92  }
93  }
94 
102  private function addLatexResources(ilGlobalTemplateInterface $tpl): void
103  {
104  $tpl->addJavaScript('assets/js/mathjax_config.js');
105  $tpl->addJavaScript('node_modules/mathjax/es5/tex-chtml-full.js');
106  }
107 
108  public function executeCommand(): void
109  {
110  $cmd = $this->ctrl->getCmd();
111  $this->$cmd();
112  }
113 
114  protected function renderPostHtml(ilGlobalTemplateInterface $tpl, ilForumPost $post, int $counter, int $mode): void
115  {
116  $tpl->setCurrentBlock('posts_row');
117 
118  if (ilForumProperties::getInstance($this->ilObjDataCache->lookupObjId($this->ref_id))->getMarkModeratorPosts()) {
119  if ($post->isAuthorModerator() === null && $is_moderator = ilForum::_isModerator(
120  $this->ref_id,
121  $post->getPosAuthorId()
122  )) {
123  $rowCol = 'ilModeratorPosting';
124  } elseif ($post->isAuthorModerator()) {
125  $rowCol = 'ilModeratorPosting';
126  } else {
127  $rowCol = ilUtil::switchColor($counter, 'tblrow1', 'tblrow2');
128  }
129  } else {
130  $rowCol = ilUtil::switchColor($counter, 'tblrow1', 'tblrow2');
131  }
132 
133  $tpl->setVariable('ROWCOL', ' ' . $rowCol);
134 
135  if ($post->isCensored()) {
136  $tpl->setVariable('TXT_CENSORSHIP_ADVICE', $this->lng->txt('post_censored_comment_by_moderator'));
137  $rowCol = 'tblrowmarked';
138  }
139 
140  $tpl->setVariable('ROWCOL', ' ' . $rowCol);
141  if (!$post->isActivated() && $post->isOwner($this->user->getId())) {
142  $tpl->setVariable('POST_NOT_ACTIVATED_YET', $this->lng->txt('frm_post_not_activated_yet'));
143  }
144 
145  $authorinfo = new ilForumAuthorInformation(
146  $post->getPosAuthorId(),
147  $post->getDisplayUserId(),
148  (string) $post->getUserAlias(),
149  (string) $post->getImportName()
150  );
151 
152  if ($authorinfo->hasSuffix()) {
153  if (!$authorinfo->isDeleted()) {
154  $tpl->setVariable('USR_NAME', $authorinfo->getAlias());
155  }
156  $tpl->setVariable('AUTHOR', $authorinfo->getSuffix());
157  } else {
158  if ($authorinfo->getAuthorName(true) && !$this->objProperties->isAnonymized()) {
159  $tpl->setVariable('USR_NAME', $authorinfo->getAuthorName(true));
160  }
161  $tpl->setVariable('AUTHOR', $authorinfo->getAuthorShortName());
162  }
163 
164  if (self::MODE_EXPORT_CLIENT === $mode) {
165  if ($authorinfo->getAuthor()->getPref('public_profile') !== 'n') {
166  $tpl->setVariable('TXT_REGISTERED', $this->lng->txt('registered_since'));
167  $tpl->setVariable(
168  'REGISTERED_SINCE',
169  $this->frm->convertDate($authorinfo->getAuthor()->getCreateDate())
170  );
171  }
172 
173  if ($post->getDisplayUserId() !== 0) {
174  if ($this->is_moderator) {
175  $num_posts = $this->frm->countUserArticles($post->getDisplayUserId());
176  } else {
177  $num_posts = $this->frm->countActiveUserArticles($post->getDisplayUserId());
178  }
179  $tpl->setVariable('TXT_NUM_POSTS', $this->lng->txt('forums_posts'));
180  $tpl->setVariable('NUM_POSTS', $num_posts);
181  }
182  }
183 
184  $tpl->setVariable('USR_IMAGE', $authorinfo->getProfilePicture());
185  if ($authorinfo->getAuthor()->getId() && ilForum::_isModerator(
186  $this->ref_id,
187  $post->getPosAuthorId()
188  )) {
189  if ($authorinfo->getAuthor()->getGender() === 'f') {
190  $tpl->setVariable('ROLE', $this->lng->txt('frm_moderator_f'));
191  } elseif ($authorinfo->getAuthor()->getGender() === 'm') {
192  $tpl->setVariable('ROLE', $this->lng->txt('frm_moderator_m'));
193  } else {
194  $tpl->setVariable('ROLE', $this->lng->txt('frm_moderator_n'));
195  }
196  }
197 
198  if ($post->getUpdateUserId() > 0) {
199  $spanClass = '';
200  if (ilForum::_isModerator($this->ref_id, $post->getUpdateUserId())) {
201  $spanClass = 'moderator_small';
202  }
203 
204  $post->setChangeDate($post->getChangeDate());
205 
206  $authorinfo = new ilForumAuthorInformation(
207  $post->getPosAuthorId(),
208  $post->getDisplayUserId(),
209  (string) $post->getUserAlias(),
210  ''
211  );
212 
213  $tpl->setVariable(
214  'POST_UPDATE_TXT',
215  $this->lng->txt('edited_on') . ': ' . $this->frm->convertDate($post->getChangeDate()) . ' - ' . strtolower($this->lng->txt('by'))
216  );
217  $tpl->setVariable('UPDATE_AUTHOR', $authorinfo->getLinkedAuthorShortName());
218  if ($authorinfo->getAuthorName(true) && !$this->objProperties->isAnonymized()) {
219  $tpl->setVariable('UPDATE_USR_NAME', $authorinfo->getAuthorName(true));
220  }
221  }
222 
223  $post->setMessage($this->frm->prepareText($post->getMessage()));
224  $tpl->setVariable('POST_DATE', $this->frm->convertDate($post->getCreateDate()));
225  $tpl->setVariable('SUBJECT', $post->getSubject());
226 
227  if (!$post->isCensored()) {
228  $spanClass = "";
229  if (ilForum::_isModerator($this->ref_id, $post->getDisplayUserId())) {
230  $spanClass = 'moderator';
231  }
232 
233  // possible bugfix for mantis #8223
234  if ($post->getMessage() === strip_tags($post->getMessage())) {
235  // We can be sure, that there are not html tags
236  $post->setMessage(nl2br($post->getMessage()));
237  }
238 
239  if ($spanClass !== '') {
240  $tpl->setVariable(
241  'POST',
242  "<span class=\"" . $spanClass . "\">" . ilRTE::_replaceMediaObjectImageSrc(
243  $post->getMessage(),
244  1
245  ) . "</span>"
246  );
247  } else {
248  $tpl->setVariable('POST', ilRTE::_replaceMediaObjectImageSrc($post->getMessage(), 1));
249  }
250  } else {
251  $tpl->setVariable('POST', "<span class=\"moderator\">" . nl2br((string) $post->getCensorshipComment()) . "</span>");
252  }
253 
254  $tpl->parseCurrentBlock('posts_row');
255  }
256 
257  public function printThread(): void
258  {
259  if (
260  !$this->access->checkAccess('read,visible', '', $this->ref_id) ||
261  !$this->http->wrapper()->query()->has('thr_top_fk') ||
262  !$this->http->wrapper()->query()->has('print_thread')
263  ) {
264  $this->error->raiseError($this->lng->txt('permission_denied'), $this->error->MESSAGE);
265  }
266 
268 
269  $tpl = new ilGlobalTemplate('tpl.forums_export_print.html', true, true, 'components/ILIAS/Forum');
270  $location_stylesheet = ilUtil::getStyleSheetLocation();
271  $tpl->setVariable('LOCATION_STYLESHEET', $location_stylesheet);
272 
274  $this->addLatexResources($tpl);
275 
276  $this->frm->setMDB2WhereCondition('top_pk = %s ', ['integer'], [$this->http->wrapper()->query()->retrieve(
277  'thr_top_fk',
278  $this->refinery->kindlyTo()->int()
279  )]);
280  $frmData = $this->frm->getOneTopic();
281 
282  if ($frmData->getTopPk() > 0) {
283  $topic = new ilForumTopic($this->http->wrapper()->query()->retrieve(
284  'print_thread',
285  $this->refinery->kindlyTo()->int()
286  ), $this->is_moderator);
287 
288  $this->ensureThreadBelongsToForum($this->frm->getForumId(), $topic);
289 
290  $topic->setOrderField('frm_posts_tree.rgt');
291  $first_post = $topic->getPostRootNode();
292  $post_collection = $topic->getPostTree($first_post);
293  $num_posts = count($post_collection);
294 
295  $tpl->setVariable('TITLE', $topic->getSubject());
296  $tpl->setVariable(
297  'HEADLINE',
298  $this->lng->txt('forum') . ': ' . $frmData->getTopName() . ' > ' .
299  $this->lng->txt('forums_thread') . ': ' . $topic->getSubject() . ' > ' .
300  $this->lng->txt('forums_count_art') . ': ' . $num_posts
301  );
302 
303  $i = 0;
304  foreach ($post_collection as $post) {
305  $this->renderPostHtml($tpl, $post, $i++, self::MODE_EXPORT_WEB);
306  }
307  }
308 
309  $tpl->printToStdout();
310  }
311 
312  public function printPost(): void
313  {
314  if (!$this->access->checkAccess('read,visible', '', $this->ref_id)) {
315  $this->error->raiseError($this->lng->txt('permission_denied'), $this->error->MESSAGE);
316  }
317 
319 
320  $tpl = new ilGlobalTemplate('tpl.forums_export_print.html', true, true, 'components/ILIAS/Forum');
321  $location_stylesheet = ilUtil::getStyleSheetLocation();
322  $tpl->setVariable('LOCATION_STYLESHEET', $location_stylesheet);
323 
325  $this->addLatexResources($tpl);
326 
327  $this->frm->setMDB2WhereCondition('top_pk = %s ', ['integer'], [$this->http->wrapper()->query()->retrieve(
328  'top_pk',
329  $this->refinery->kindlyTo()->int()
330  )]);
331  $frmData = $this->frm->getOneTopic();
332 
333  if ($frmData->getTopPk() > 0) {
334  $post = new ilForumPost($this->http->wrapper()->query()->retrieve(
335  'print_post',
336  $this->refinery->kindlyTo()->int()
337  ), $this->is_moderator);
338  $this->ensureThreadBelongsToForum($this->frm->getForumId(), $post->getThread());
339 
340  $tpl->setVariable('TITLE', $post->getThread()->getSubject());
341  $tpl->setVariable(
342  'HEADLINE',
343  $this->lng->txt('forum') . ': ' . $frmData->getTopName() . ' > ' .
344  $this->lng->txt('forums_thread') . ': ' . $post->getThread()->getSubject()
345  );
346 
347  $this->renderPostHtml($tpl, $post, 0, self::MODE_EXPORT_WEB);
348  }
349  $tpl->printToStdout();
350  }
351 
352  public function exportHTML(): void
353  {
354  if (!$this->access->checkAccess('read,visible', '', $this->ref_id)) {
355  $this->error->raiseError($this->lng->txt('permission_denied'), $this->error->MESSAGE);
356  }
357 
359 
360  $tpl = new ilGlobalTemplate('tpl.forums_export_html.html', true, true, 'components/ILIAS/Forum');
361  $location_stylesheet = ilUtil::getStyleSheetLocation();
362  $tpl->setVariable('LOCATION_STYLESHEET', $location_stylesheet);
363  $tpl->setVariable('BASE', (str_ends_with(ILIAS_HTTP_PATH, '/') ? ILIAS_HTTP_PATH : ILIAS_HTTP_PATH . '/'));
364 
366 
368  $threads = [];
369  $thread_ids = [];
370  $isModerator = $this->is_moderator;
371  if ($this->http->wrapper()->post()->has('thread_ids')) {
372  $thread_ids = $this->http->wrapper()->post()->retrieve(
373  'thread_ids',
374  $this->refinery->kindlyTo()->listOf($this->refinery->kindlyTo()->int())
375  );
376  } elseif ($this->ref_id > 0) {
377  $obj_id = $this->ilObjDataCache->lookupObjId($this->ref_id);
379  if (count($topics) > 0) {
380  $thread_ids = array_keys($topics);
381  }
382  }
383  array_walk($thread_ids, function (int $threadId) use (&$threads, $isModerator): void {
384  $thread = new ilForumTopic($threadId, $isModerator);
385  $this->ensureThreadBelongsToForum($this->frm->getForumId(), $thread);
386 
387  $threads[] = $thread;
388  });
389 
390  $i = 0;
391  foreach ($threads as $topic) {
392  $this->frm->setMDB2WhereCondition('top_pk = %s ', ['integer'], [$topic->getForumId()]);
393  $frmData = $this->frm->getOneTopic();
394 
395  if ($frmData->getTopPk() > 0) {
396  if (0 === $i) {
397  $tpl->setVariable('TITLE', $frmData->getTopName());
398  }
399 
400  $first_post = $topic->getPostRootNode();
401  $topic->setOrderField('frm_posts_tree.rgt');
402  $post_collection = $topic->getPostTree($first_post);
403 
404  $j = 0;
405  foreach ($post_collection as $post) {
406  $this->renderPostHtml($tpl, $post, $j++, self::MODE_EXPORT_CLIENT);
407  }
408 
409  $tpl->setCurrentBlock('thread_headline');
410  $tpl->setVariable('T_TITLE', $topic->getSubject());
411  if ($this->is_moderator) {
412  $tpl->setVariable('T_NUM_POSTS', $topic->countPosts(true));
413  } else {
414  $tpl->setVariable('T_NUM_POSTS', $topic->countActivePosts(true));
415  }
416  $tpl->setVariable('T_NUM_VISITS', $topic->getVisits());
417  $tpl->setVariable('T_FORUM', $frmData->getTopName());
418  $authorinfo = new ilForumAuthorInformation(
419  $topic->getThrAuthorId(),
420  $topic->getDisplayUserId(),
421  (string) $topic->getUserAlias(),
422  (string) $topic->getImportName()
423  );
424  $tpl->setVariable('T_AUTHOR', $authorinfo->getAuthorName());
425  $tpl->setVariable('T_TXT_FORUM', $this->lng->txt('forum') . ': ');
426  $tpl->setVariable('T_TXT_TOPIC', $this->lng->txt('forums_thread') . ': ');
427  $tpl->setVariable('T_TXT_AUTHOR', $this->lng->txt('forums_thread_create_from') . ': ');
428  $tpl->setVariable('T_TXT_NUM_POSTS', $this->lng->txt('forums_articles') . ': ');
429  $tpl->setVariable('T_TXT_NUM_VISITS', $this->lng->txt('visits') . ': ');
430  $tpl->parseCurrentBlock();
431 
432  ++$i;
433  }
434 
435  $tpl->setCurrentBlock('thread_block');
436  $tpl->parseCurrentBlock();
437  }
438 
439  $this->addLatexResources($tpl);
440  $tpl->fillJavaScriptFiles();
441 
443  $tpl->get(),
444  'forum_html_export_' . $this->ref_id . '.html'
445  );
446  }
447 }
static _replaceMediaObjectImageSrc(string $a_text, int $a_direction=0, string $nic='')
Replaces image source from mob image urls with the mob id or replaces mob id with the correct image s...
static array static setUseRelativeDates(bool $a_status)
set use relative dates
static getStyleSheetLocation(string $mode="output", string $a_css_name="")
get full style sheet file name (path inclusive) of current user
parseCurrentBlock(string $block_name=self::DEFAULT_BLOCK)
Parses the given block.
ensureThreadBelongsToForum(int $objId, ilForumTopic $thread)
static lookupForumIdByObjId(int $obj_id)
setCurrentBlock(string $part=self::DEFAULT_BLOCK)
Sets the template to the given block.
special template class to simplify handling of ITX/PEAR
static switchColor(int $a_num, string $a_css1, string $a_css2)
switches style sheets for each even $a_num (used for changing colors of different result rows) ...
setMessage(string $a_message)
addLatexResources(ilGlobalTemplateInterface $tpl)
Register the resources needed for latex rendering We can&#39;t query these resources from the UI framewor...
$objId
Definition: xapitoken.php:57
isOwner(int $a_user_id=0)
static deliverData(string $a_data, string $a_filename, string $mime="application/octet-stream")
setVariable(string $variable, $value='')
Sets the given variable to the given value.
static getInstance(int $a_obj_id=0)
while($session_entry=$r->fetchRow(ilDBConstants::FETCHMODE_ASSOC)) return null
static http()
Fetches the global http state from ILIAS.
renderPostHtml(ilGlobalTemplateInterface $tpl, ilForumPost $post, int $counter, int $mode)
Forum export to HTML and Print.
setChangeDate(?string $a_changedate)
static initjQuery(?ilGlobalTemplateInterface $a_tpl=null)
inits and adds the jQuery JS-File to the global or a passed template
global $DIC
Definition: shib_login.php:26
readonly ilForumProperties $objProperties
static _isModerator(int $a_ref_id, int $a_usr_id)
addJavaScript(string $a_js_file, bool $a_add_version_parameter=true, int $a_batch=2)
Add a javascript file that should be included in the header.
readonly Refinery $refinery
readonly GlobalHttpState $http
static getSortedThreadSubjects(int $a_obj_id, int $a_sort_mode=self::SORT_DATE)
$post
Definition: ltitoken.php:46
ilObjectDataCache $ilObjDataCache