ILIAS  release_5-4 Revision v5.4.26-12-gabc799a52e6
class.ilForumTopic.php
Go to the documentation of this file.
1 <?php
2 /* Copyright (c) 1998-2012 ILIAS open source, Extended GPL, see docs/LICENSE */
3 
11 {
12  private $id = 0;
13 
14  private $forum_id = 0;
15 
16  private $frm_obj_id = 0;
17 
18  private $display_user_id = 0;
19 
20  private $user_alias = '';
21 
22  private $subject = '';
23 
24  private $createdate = null;
25 
26  private $changedate = null;
27 
28  private $num_posts = 0;
29 
30  private $last_post_string = '';
31 
32  private $visits = 0;
33 
34  private $import_name = '';
35 
36  private $is_sticky = 0;
37 
38  private $is_closed = 0;
39 
40  private $orderField = '';
41 
43  private $last_post = null;
44 
45  private $db = null;
46 
47  private $is_moderator = false;
48 
49  private $thr_author_id = 0;
50 
54  private $average_rating = 0;
55 
56  private $orderDirection = 'DESC';
57 
58  protected static $possibleOrderDirections = array('ASC', 'DESC');
59 
72  public function __construct($a_id = 0, $a_is_moderator = false, $preventImplicitRead = false)
73  {
74  global $DIC;
75 
76  $this->is_moderator = $a_is_moderator;
77  $this->db = $DIC->database();
78  $this->user = $DIC->user();
79  $this->id = $a_id;
80 
81  if (!$preventImplicitRead) {
82  $this->read();
83  }
84  }
85 
89  public function assignData($data)
90  {
91  $this->setId((int) $data['thr_pk']);
92  $this->setForumId((int) $data['thr_top_fk']);
93  $this->setSubject($data['thr_subject']);
94  $this->setDisplayUserId((int) $data['thr_display_user_id']);
95  $this->setUserAlias($data['thr_usr_alias']);
96  $this->setLastPostString($data['last_post_string']);
97  $this->setCreateDate($data['thr_date']);
98  $this->setChangeDate($data['thr_update']);
99  $this->setVisits((int) $data['visits']);
100  $this->setImportName($data['import_name']);
101  $this->setSticky((int) $data['is_sticky']);
102  $this->setClosed((int) $data['is_closed']);
103  $this->setAverageRating($data['avg_rating']);
104  $this->setThrAuthorId($data['thr_author_id']);
105 
106  // Aggregated values
107  $this->setNumPosts((int) $data['num_posts']);
108  $this->setNumUnreadPosts((int) $data['num_unread_posts']);
109  $this->setNumNewPosts((int) $data['num_new_posts']);
110  $this->setUserNotificationEnabled((bool) $data['usr_notification_is_enabled']);
111  }
112 
119  public function insert()
120  {
121  if ($this->forum_id) {
122  $nextId = $this->db->nextId('frm_threads');
123 
124  $this->db->insert(
125  'frm_threads',
126  array(
127  'thr_pk' => array('integer', $nextId),
128  'thr_top_fk' => array('integer', $this->forum_id),
129  'thr_subject' => array('text', $this->subject),
130  'thr_display_user_id' => array('integer', $this->display_user_id),
131  'thr_usr_alias' => array('text', $this->user_alias),
132  'thr_num_posts' => array('integer', $this->num_posts),
133  'thr_last_post' => array('text', $this->last_post_string),
134  'thr_date' => array('timestamp', $this->createdate),
135  'thr_update' => array('timestamp', null),
136  'import_name' => array('text', $this->import_name),
137  'is_sticky' => array('integer', $this->is_sticky),
138  'is_closed' => array('integer', $this->is_closed),
139  'avg_rating' => array('float', $this->average_rating),
140  'thr_author_id' => array('integer', $this->thr_author_id)
141  )
142  );
143 
144  $this->id = $nextId;
145 
146  return true;
147  }
148 
149  return false;
150  }
151 
158  public function update()
159  {
160  if ($this->id) {
161  $this->db->manipulateF(
162  '
163  UPDATE frm_threads
164  SET thr_top_fk = %s,
165  thr_subject = %s,
166  thr_update = %s,
167  thr_num_posts = %s,
168  thr_last_post = %s,
169  avg_rating = %s
170  WHERE thr_pk = %s',
171  array('integer', 'text','timestamp', 'integer', 'text', 'float', 'integer'),
172  array( $this->forum_id,
173  $this->subject,
174  /* $this->changedate, */
175  date('Y-m-d H:i:s'),
176  $this->num_posts,
177  $this->last_post_string,
178  $this->average_rating,
179  $this->id
180  )
181  );
182 
183  return true;
184  }
185 
186  return false;
187  }
188 
196  private function read()
197  {
198  if ($this->id) {
199  $res = $this->db->queryf(
200  '
201  SELECT frm_threads.*, top_frm_fk frm_obj_id
202  FROM frm_threads
203  INNER JOIN frm_data ON top_pk = thr_top_fk
204  WHERE thr_pk = %s',
205  array('integer'),
206  array($this->id)
207  );
208 
210 
211  if (is_object($row)) {
212  $this->thr_pk = $row->pos_pk; // thr_pk = pos_pk ??!??!
213  $this->forum_id = $row->thr_top_fk;
214  $this->display_user_id = $row->thr_display_user_id;
215  $this->user_alias = $row->thr_usr_alias;
216  $this->subject = html_entity_decode($row->thr_subject);
217  $this->createdate = $row->thr_date;
218  $this->changedate = $row->thr_update;
219  $this->import_name = $row->import_name;
220  $this->num_posts = $row->thr_num_posts;
221  $this->last_post_string = $row->thr_last_post;
222  $this->visits = $row->visits;
223  $this->is_sticky = $row->is_sticky;
224  $this->is_closed = $row->is_closed;
225  $this->frm_obj_id = $row->frm_obj_id;
226  $this->average_rating = $row->avg_rating;
227  $this->thr_author_id = $row->thr_author_id;
228 
229  return true;
230  }
231  $this->id = 0;
232  return false;
233  }
234 
235  return false;
236  }
237 
244  public function reload()
245  {
246  return $this->read();
247  }
248 
255  public function getFirstPostId()
256  {
257  $res = $this->db->queryf(
258  '
259  SELECT * FROM frm_posts_tree
260  WHERE thr_fk = %s
261  AND parent_pos = %s',
262  array('integer', 'integer'),
263  array($this->id, '1')
264  );
265 
267 
268  return $row->pos_fk ? $row->pos_fk : 0;
269  }
270 
276  public function updateVisits()
277  {
278  $checkTime = time() - (60 * 60);
279 
280  if ($_SESSION['frm_visit_frm_threads_' . $this->id] < $checkTime) {
281  $_SESSION['frm_visit_frm_threads_' . $this->id] = time();
282 
283  $this->db->manipulateF(
284  '
285  UPDATE frm_threads
286  SET visits = visits + 1
287  WHERE thr_pk = %s',
288  array('integer'),
289  array($this->id)
290  );
291  }
292 
293  return true;
294  }
295 
303  public function countPosts($ignoreRoot = false)
304  {
305  $res = $this->db->queryf(
306  '
307  SELECT COUNT(*) cnt
308  FROM frm_posts
309  INNER JOIN frm_posts_tree ON frm_posts_tree.pos_fk = pos_pk
310  WHERE pos_thr_fk = %s' . ($ignoreRoot ? ' AND parent_pos != 0 ' : ''),
311  array('integer'),
312  array($this->id)
313  );
314 
315  $rec = $res->fetchRow(ilDBConstants::FETCHMODE_ASSOC);
316 
317  return $rec['cnt'];
318  }
319 
327  public function countActivePosts($ignoreRoot = false)
328  {
329  $res = $this->db->queryf(
330  '
331  SELECT COUNT(*) cnt
332  FROM frm_posts
333  INNER JOIN frm_posts_tree ON frm_posts_tree.pos_fk = pos_pk
334  WHERE (pos_status = %s
335  OR (pos_status = %s AND pos_display_user_id = %s))
336  AND pos_thr_fk = %s' . ($ignoreRoot ? ' AND parent_pos != 0 ' : ''),
337  array('integer', 'integer', 'integer', 'integer'),
338  array('1', '0', $this->user->getId(), $this->id)
339  );
340 
341  $rec = $res->fetchRow(ilDBConstants::FETCHMODE_ASSOC);
342 
343  return $rec['cnt'];
344  }
345 
352  public function getFirstPostNode($isModerator = false, $preventImplicitRead = false)
353  {
354  $res = $this->db->queryF(
355  '
356  SELECT *
357  FROM frm_posts
358  INNER JOIN frm_posts_tree ON pos_fk = pos_pk
359  WHERE parent_pos = %s
360  AND thr_fk = %s',
361  array('integer', 'integer'),
362  array(0, $this->id)
363  );
364 
365  $row = $this->db->fetchAssoc($res);
366 
367  $post = new ilForumPost($row['pos_pk'], $isModerator, $preventImplicitRead);
368  $post->assignData($row);
369 
370  return $post;
371  }
372 
379  public function getLastPost()
380  {
381  if ($this->id) {
382  $this->db->setLimit(1);
383  $res = $this->db->queryf(
384  '
385  SELECT pos_pk
386  FROM frm_posts
387  WHERE pos_thr_fk = %s
388  ORDER BY pos_date DESC',
389  array('integer'),
390  array($this->id)
391  );
392 
394 
395  return new ilForumPost($row->pos_pk);
396  }
397 
398  return false;
399  }
400 
407  public function getLastActivePost()
408  {
409  if ($this->id) {
410  $this->db->setLimit(1);
411  $res = $this->db->queryf(
412  '
413  SELECT pos_pk
414  FROM frm_posts
415  WHERE pos_thr_fk = %s
416  AND (pos_status = %s OR
417  (pos_status = %s AND pos_display_user_id = %s))
418  ORDER BY pos_date DESC',
419  array('integer', 'integer', 'integer', 'integer'),
420  array($this->id, '1', '0', $this->user->getId())
421  );
422 
424 
425  return new ilForumPost($row->pos_pk);
426  }
427 
428  return false;
429  }
430 
431  public function getAllPosts()
432  {
433  $posts = array();
434 
435  if ($this->id) {
436  $res = $this->db->queryf(
437  '
438  SELECT pos_pk
439  FROM frm_posts
440  WHERE pos_thr_fk = %s',
441  array('integer'),
442  array($this->id)
443  );
444 
445  while ($row = $res->fetchRow(ilDBConstants::FETCHMODE_OBJECT)) {
446  $posts[$row->pos_pk] = $row;
447  }
448  }
449 
450  return is_array($posts) ? $posts : array();
451  }
452 
461  public function getPostTree(ilForumPost $a_post_node)
462  {
463  $posts = array();
464 
465  $data = array();
466  $data_types = array();
467 
468  $query = '
469  SELECT is_author_moderator, pos_author_id, pos_pk, fpt_date, rgt, pos_top_fk, pos_thr_fk,
470  pos_display_user_id, pos_usr_alias, pos_subject,
471  pos_status, pos_message, pos_date, pos_update,
472  update_user, pos_cens, pos_cens_com, notify,
473  import_name, fpt_pk, parent_pos, lft, depth,
474  (CASE
475  WHEN fur.post_id IS NULL ' .
476  ($this->user->getId() == ANONYMOUS_USER_ID ? ' AND 1 = 2 ' : '') . '
477  THEN 0
478  ELSE 1
479  END) post_read,
480  firstname, lastname, title, login
481 
482  FROM frm_posts_tree
483 
484  INNER JOIN frm_posts
485  ON pos_fk = pos_pk
486 
487  LEFT JOIN usr_data
488  ON pos_display_user_id = usr_id
489 
490  LEFT JOIN frm_user_read fur
491  ON fur.thread_id = pos_thr_fk
492  AND fur.post_id = pos_pk
493  AND fur.usr_id = %s
494 
495  WHERE lft > %s AND lft < %s
496  AND thr_fk = %s';
497 
498  array_push($data_types, 'integer', 'integer', 'integer', 'integer');
499  array_push($data, $this->user->getId(), $a_post_node->getLft(), $a_post_node->getRgt(), $a_post_node->getThreadId());
500 
501  if ($this->orderField != "") {
502  $query .= " ORDER BY " . $this->orderField . " " . $this->getOrderDirection();
503  }
504 
505  $res = $this->db->queryF($query, $data_types, $data);
506 
507  $usr_ids = [];
508  while ($row = $this->db->fetchAssoc($res)) {
509  $post = new ilForumPost($row['pos_pk'], false, true);
510  $post->assignData($row);
511 
512  if (!$this->is_moderator) {
513  if (!$post->isActivated() && $post->getPosAuthorId() != $this->user->getId()) {
514  continue;
515  }
516  }
517 
518  if ((int) $row['pos_display_user_id']) {
519  $usr_ids[(int) $row['pos_display_user_id']] = (int) $row['pos_display_user_id'];
520  }
521  if ((int) $row['update_user']) {
522  $usr_ids[(int) $row['update_user']] = (int) $row['update_user'];
523  }
524 
525  $posts[] = $post;
526  }
527 
529 
530  return $posts;
531  }
532 
543  public function movePosts($old_obj_id, $old_pk, $new_obj_id, $new_pk)
544  {
545  if ($this->id) {
546  $nodes = $this->getAllPosts();
547  if (is_array($nodes)) {
548  $postsMoved = array();
549  // Move attachments
550  try {
551  foreach ($nodes as $node) {
552  $file_obj = new ilFileDataForum((int) $old_obj_id, (int) $node->pos_pk);
553  $moved = $file_obj->moveFilesOfPost((int) $new_obj_id);
554 
555  if (true === $moved) {
556  $postsMoved[] = array(
557  'from' => $old_obj_id,
558  'to' => $new_obj_id,
559  'position_id' => (int) $node->pos_pk
560  );
561  }
562 
563  unset($file_obj);
564  }
565  } catch (\ilFileUtilsException $exception) {
566  foreach ($postsMoved as $postedInformation) {
567  $file_obj = new ilFileDataForum($postedInformation['to'], $postedInformation['position_id']);
568  $file_obj->moveFilesOfPost($postedInformation['from']);
569  }
570 
571  throw $exception;
572  }
573  }
574 
575  $current_id = $this->id;
576 
577  $ilAtomQuery = $this->db->buildAtomQuery();
578  $ilAtomQuery->addTableLock('frm_user_read');
579  $ilAtomQuery->addTableLock('frm_thread_access');
580 
581  $ilAtomQuery->addQueryCallable(function (ilDBInterface $ilDB) use ($new_obj_id, $current_id) {
582  $ilDB->manipulateF(
583  '
584  DELETE FROM frm_user_read
585  WHERE obj_id = %s AND thread_id =%s',
586  array('integer', 'integer'),
587  array($new_obj_id, $current_id)
588  );
589 
590  $ilDB->manipulateF(
591  '
592  UPDATE frm_user_read
593  SET obj_id = %s
594  WHERE thread_id = %s',
595  array('integer', 'integer'),
596  array($new_obj_id, $current_id)
597  );
598 
599  $ilDB->manipulateF(
600  '
601  DELETE FROM frm_thread_access
602  WHERE obj_id = %s AND thread_id =%s',
603  array('integer', 'integer'),
604  array($new_obj_id, $current_id)
605  );
606 
607  $ilDB->manipulateF(
608  '
609  UPDATE frm_thread_access
610  SET obj_id = %s
611  WHERE thread_id =%s',
612  array('integer', 'integer'),
613  array($new_obj_id, $current_id)
614  );
615  });
616 
617  $ilAtomQuery->run();
618 
619  $this->db->manipulateF(
620  '
621  UPDATE frm_posts
622  SET pos_top_fk = %s
623  WHERE pos_thr_fk = %s',
624  array('integer', 'integer'),
625  array($new_pk, $this->id)
626  );
627 
628  // update all related news
629  $posts = $this->db->queryf(
630  '
631  SELECT * FROM frm_posts WHERE pos_thr_fk = %s',
632  array('integer'),
633  array($this->id)
634  );
635 
636  $old_obj_id = ilForum::_lookupObjIdForForumId($old_pk);
637 
638  $new_obj_id = ilForum::_lookupObjIdForForumId($new_pk);
639 
640  while ($post = $posts->fetchRow(ilDBConstants::FETCHMODE_ASSOC)) {
642  $old_obj_id,
643  "frm",
644  $post["pos_pk"],
645  "pos"
646  );
647  $news_item = new ilNewsItem($news_id);
648  $news_item->setContextObjId($new_obj_id);
649  $news_item->update();
650  //echo "<br>-".$post["pos_pk"]."-".$old_obj_id."-".$new_obj_id."-";
651  }
652 
653  return count($nodes);
654  }
655 
656  return 0;
657  }
658 
659  public function getNestedSetPostChildren($pos_id = null, $levels = null)
660  {
661  $data = null;
662  $objProperties = ilForumProperties::getInstance($this->getFrmObjId());
663  $is_post_activation_enabled = $objProperties->isPostActivationEnabled();
664 
665  if ($pos_id !== null) {
666  $res = $this->db->queryF(
667  "
668  SELECT lft, rgt, depth
669  FROM frm_posts_tree
670  WHERE pos_fk = %s
671  AND thr_fk = %s",
672  array('integer', 'integer'),
673  array($pos_id, $this->id)
674  );
675 
676  $data = $this->db->fetchAssoc($res);
677  }
678 
679  $query = '
680  SELECT fpt.depth,
681  fpt.rgt,
682  fpt.parent_pos,
683  fp.pos_pk,
684  fp.pos_subject,
685  fp.pos_usr_alias,
686  fp.pos_date,
687  fp.pos_update,
688  fp.pos_status,
689  fp.pos_display_user_id,
690  fp.pos_usr_alias,
691  fp.import_name,
692  fp.pos_author_id,
693  fp.is_author_moderator,
694  fur.post_id,
695  (CASE
696  WHEN fur.post_id IS NULL ' .
697  ($this->user->getId() == ANONYMOUS_USER_ID ? ' AND 1 = 2 ' : '') . '
698  THEN 0
699  ELSE 1
700  END) post_read,
701  COUNT(fpt2.pos_fk) children
702 
703  FROM frm_posts_tree fpt
704 
705  INNER JOIN frm_posts fp
706  ON fp.pos_pk = fpt.pos_fk
707 
708  LEFT JOIN frm_posts_tree fpt2
709  ON fpt2.lft BETWEEN fpt.lft AND fpt.rgt
710  AND fpt.thr_fk = fpt2.thr_fk
711  AND fpt.pos_fk != fpt2.pos_fk ';
712 
713 
714  $query .= '
715  LEFT JOIN frm_user_read fur
716  ON fur.thread_id = fp.pos_thr_fk
717  AND fur.post_id = fp.pos_pk
718  AND fur.usr_id = ' . $this->db->quote($this->user->getId(), 'integer') . '
719 
720  LEFT JOIN usr_data ud
721  ON ud.usr_id = fp.pos_display_user_id
722 
723  WHERE fpt.thr_fk = ' . $this->db->quote($this->id, 'integer');
724 
725  if ($data) {
726  $query .= ' AND fpt.lft > ' . $this->db->quote($data['lft'], 'integer') .
727  ' AND fpt.lft < ' . $this->db->quote($data['rgt'], 'integer') . ' ';
728  }
729  if ($is_post_activation_enabled && !$this->is_moderator) {
730  $query .= ' AND (fp.pos_status = 1 OR fp.pos_status = 0 AND fp.pos_display_user_id = ' . $this->db->quote($this->user->getId(), 'integer') . ') ';
731  }
732 
733  if ($data && is_numeric($levels)) {
734  $query .= ' AND fpt.depth <= ' . $this->db->quote($data['depth'] + $levels, 'integer') . ' ';
735  }
736 
737  $query .= ' GROUP BY fpt.depth,
738  fpt.rgt,
739  fpt.parent_pos,
740  fp.pos_pk,
741  fp.pos_subject,
742  fp.pos_usr_alias,
743  fp.pos_date,
744  fp.pos_update,
745  fp.pos_status,
746  fp.pos_display_user_id,
747  fp.pos_usr_alias,
748  fp.import_name,
749  fp.pos_author_id,
750  fp.is_author_moderator,
751  fur.post_id
752  ORDER BY fpt.rgt DESC
753  ';
754 
755  $queryCounter = '
756  SELECT pos_fk
757  FROM frm_posts_tree fpt
758  INNER JOIN frm_posts fp
759  ON fp.pos_pk = fpt.pos_fk
760  WHERE fpt.thr_fk = ' . $this->db->quote($this->id, 'integer');
761 
762  if ($is_post_activation_enabled && !$this->is_moderator) {
763  $queryCounter .= ' AND (fp.pos_status = 1 OR fp.pos_status = 0 AND fp.pos_display_user_id = ' . $this->db->quote($this->user->getId(), 'integer') . ') ';
764  }
765  $queryCounter .= ' ORDER BY fpt.rgt DESC';
766 
767  $resCounter = $this->db->query($queryCounter);
768  $counter = array();
769  $i = 0;
770  while ($row = $this->db->fetchAssoc($resCounter)) {
771  $counter[$row['pos_fk']] = $i++;
772  }
773 
774  $res = $this->db->query($query);
775  $children = array();
776  $usr_ids = array();
777  while ($row = $this->db->fetchAssoc($res)) {
778  if ((int) $row['pos_display_user_id']) {
779  $usr_ids[] = (int) $row['pos_display_user_id'];
780  }
781 
782  $row['counter'] = $counter[$row['pos_pk']];
783  $children[] = $row;
784  }
785 
787 
788  return $children;
789  }
790 
797  public function isNotificationEnabled($a_user_id)
798  {
799  if ($this->id && $a_user_id) {
800  $result = $this->db->queryf(
801  '
802  SELECT COUNT(notification_id) cnt FROM frm_notification
803  WHERE user_id = %s AND thread_id = %s',
804  array('integer', 'integer'),
805  array($a_user_id, $this->id)
806  );
807 
808  while ($record = $this->db->fetchAssoc($result)) {
809  return (bool) $record['cnt'];
810  }
811 
812  return false;
813  }
814 
815  return false;
816  }
817 
824  public function enableNotification($a_user_id)
825  {
826  if ($this->id && $a_user_id) {
827  if (!$this->isNotificationEnabled($a_user_id)) {
828  $nextId = $this->db->nextId('frm_notification');
829  $this->db->manipulateF(
830  '
831  INSERT INTO frm_notification
832  ( notification_id,
833  user_id,
834  thread_id
835  )
836  VALUES(%s, %s, %s)',
837  array('integer', 'integer', 'integer'),
838  array($nextId, $a_user_id, $this->id)
839  );
840 
841  return true;
842  }
843  return false;
844  }
845 
846  return false;
847  }
848 
855  public function disableNotification($a_user_id)
856  {
857  if ($this->id && $a_user_id) {
858  $this->db->manipulateF(
859  '
860  DELETE FROM frm_notification
861  WHERE user_id = %s
862  AND thread_id = %s',
863  array('integer', 'integer'),
864  array($a_user_id, $this->id)
865  );
866 
867  return false;
868  }
869 
870  return false;
871  }
872 
879  public function makeSticky()
880  {
881  if ($this->id && !$this->is_sticky) {
882  $this->db->manipulateF(
883  '
884  UPDATE frm_threads
885  SET is_sticky = %s
886  WHERE thr_pk = %s',
887  array('integer', 'integer'),
888  array('1', $this->id)
889  );
890 
891  $this->is_sticky = 1;
892 
893  return true;
894  }
895 
896  return false;
897  }
898 
905  public function unmakeSticky()
906  {
907  if ($this->id && $this->is_sticky) {
908  $this->db->manipulateF(
909  '
910  UPDATE frm_threads
911  SET is_sticky = %s
912  WHERE thr_pk = %s',
913  array('integer', 'integer'),
914  array('0', $this->id)
915  );
916 
917  $this->is_sticky = 0;
918 
919  return true;
920  }
921 
922  return false;
923  }
924 
931  public function close()
932  {
933  if ($this->id && !$this->is_closed) {
934  $this->db->manipulateF(
935  '
936  UPDATE frm_threads
937  SET is_closed = %s
938  WHERE thr_pk = %s',
939  array('integer', 'integer'),
940  array('1', $this->id)
941  );
942 
943  $this->is_closed = 1;
944 
945  return true;
946  }
947 
948  return false;
949  }
950 
957  public function reopen()
958  {
959  if ($this->id && $this->is_closed) {
960  $this->db->manipulateF(
961  '
962  UPDATE frm_threads
963  SET is_closed = %s
964  WHERE thr_pk = %s',
965  array('integer', 'integer'),
966  array('0', $this->id)
967  );
968 
969  $this->is_closed = 0;
970 
971  return true;
972  }
973 
974  return false;
975  }
976 
980  public function getAverageRating()
981  {
982  return $this->average_rating;
983  }
984 
989  {
990  $this->average_rating = $average_rating;
991  }
992 
993  public function setId($a_id)
994  {
995  $this->id = $a_id;
996  }
997  public function getId()
998  {
999  return $this->id;
1000  }
1001  public function setForumId($a_forum_id)
1002  {
1003  $this->forum_id = $a_forum_id;
1004  }
1005  public function getForumId()
1006  {
1007  return $this->forum_id;
1008  }
1009  public function setDisplayUserId($a_user_id)
1010  {
1011  $this->display_user_id = $a_user_id;
1012  }
1013  public function getDisplayUserId()
1014  {
1015  return $this->display_user_id;
1016  }
1017  public function setUserAlias($a_user_alias)
1018  {
1019  $this->user_alias = $a_user_alias;
1020  }
1021  public function getUserAlias()
1022  {
1023  return $this->user_alias;
1024  }
1025  public function setSubject($a_subject)
1026  {
1027  $this->subject = $a_subject;
1028  }
1029  public function getSubject()
1030  {
1031  return $this->subject;
1032  }
1033  public function setCreateDate($a_createdate)
1034  {
1035  $this->createdate = $a_createdate;
1036  }
1037  public function getCreateDate()
1038  {
1039  return $this->createdate;
1040  }
1041  public function setChangeDate($a_changedate)
1042  {
1043  if ($a_changedate == '0000-00-00 00:00:00') {
1044  $this->changedate = null;
1045  } else {
1046  $this->changedate = $a_changedate;
1047  }
1048  }
1049  public function getChangeDate()
1050  {
1051  return $this->changedate;
1052  }
1053  public function setImportName($a_import_name)
1054  {
1055  $this->import_name = $a_import_name;
1056  }
1057  public function getImportName()
1058  {
1059  return $this->import_name;
1060  }
1061  public function setLastPostString($a_last_post)
1062  {
1063  if ($a_last_post == '') {
1064  $a_last_post = null;
1065  }
1066 
1067  $this->last_post_string = $a_last_post;
1068  }
1069  public function getLastPostString()
1070  {
1071  return $this->last_post_string;
1072  }
1073  public function setVisits($a_visits)
1074  {
1075  $this->visits = $a_visits;
1076  }
1077  public function getVisits()
1078  {
1079  return $this->visits;
1080  }
1081  public function setSticky($a_sticky)
1082  {
1083  $this->is_sticky = $a_sticky;
1084  }
1085  public function isSticky()
1086  {
1087  return $this->is_sticky == 1 ? true : false;
1088  }
1089  public function setClosed($a_closed)
1090  {
1091  $this->is_closed = $a_closed;
1092  }
1093  public function isClosed()
1094  {
1095  return $this->is_closed == 1 ? true : false;
1096  }
1097  public function setOrderField($a_order_field)
1098  {
1099  $this->orderField = $a_order_field;
1100  }
1101  public function getOrderField()
1102  {
1103  return $this->orderField;
1104  }
1105  public function setModeratorRight($bool)
1106  {
1107  $this->is_moderator = $bool;
1108  }
1109  public function getModeratorRight()
1110  {
1111  return $this->is_moderator;
1112  }
1113  public function getFrmObjId()
1114  {
1115  return $this->frm_obj_id;
1116  }
1117 
1122  {
1123  $this->thr_author_id = $thr_author_id;
1124  }
1125 
1129  public function getThrAuthorId()
1130  {
1131  return $this->thr_author_id;
1132  }
1133 
1142  public static function _lookupTitle($a_topic_id)
1143  {
1144  global $DIC;
1145  $ilDB = $DIC->database();
1146 
1147  $res = $ilDB->queryf(
1148  '
1149  SELECT thr_subject
1150  FROM frm_threads
1151  WHERE thr_pk = %s',
1152  array('integer'),
1153  array($a_topic_id)
1154  );
1155  $row = $ilDB->fetchObject($res);
1156 
1157  if (is_object($row)) {
1158  return $row->thr_subject;
1159  }
1160 
1161  return '';
1162  }
1163 
1164  public function updateThreadTitle()
1165  {
1166  $this->db->update(
1167  'frm_threads',
1168  array('thr_subject' => array('text',$this->getSubject())),
1169  array('thr_pk' => array('integer', $this->getId()))
1170  );
1171 
1172  $first_node = $this->getFirstPostNode();
1173  $first_node->setSubject($this->getSubject());
1174  $first_node->update();
1175  }
1176 
1181  public function setNumPosts($a_num_posts)
1182  {
1183  $this->num_posts = $a_num_posts;
1184  return $this;
1185  }
1186 
1190  public function getNumPosts()
1191  {
1192  return $this->num_posts;
1193  }
1194 
1199  public function setNumNewPosts($num_new_posts)
1200  {
1201  $this->num_new_posts = $num_new_posts;
1202  return $this;
1203  }
1204 
1208  public function getNumNewPosts()
1209  {
1210  return $this->num_new_posts;
1211  }
1212 
1217  public function setNumUnreadPosts($num_unread_posts)
1218  {
1219  $this->num_unread_posts = $num_unread_posts;
1220  return $this;
1221  }
1222 
1226  public function getNumUnreadPosts()
1227  {
1228  return $this->num_unread_posts;
1229  }
1230 
1235  public function setUserNotificationEnabled($user_notification_enabled)
1236  {
1237  $this->user_notification_enabled = $user_notification_enabled;
1238  return $this;
1239  }
1240 
1244  public function getUserNotificationEnabled()
1245  {
1246  return $this->user_notification_enabled;
1247  }
1248 
1249  public function setOrderDirection($direction)
1250  {
1251  if (!in_array(strtoupper($direction), self::$possibleOrderDirections)) {
1252  $direction = current(self::$possibleOrderDirections);
1253  }
1254 
1255  $this->orderDirection = $direction;
1256  return $this;
1257  }
1258 
1259  public function getOrderDirection()
1260  {
1261  return $this->orderDirection;
1262  }
1263 
1264  public static function lookupForumIdByTopicId($a_topic_id)
1265  {
1266  global $DIC;
1267  $ilDB = $DIC->database();
1268 
1269  $res = $ilDB->queryF(
1270  'SELECT thr_top_fk FROM frm_threads WHERE thr_pk = %s',
1271  array('integer'),
1272  array($a_topic_id)
1273  );
1274 
1275  $row = $ilDB->fetchAssoc($res);
1276 
1277  return $row['thr_top_fk'];
1278  }
1279 
1280  public function getSorting()
1281  {
1282  return $this->thread_sorting;
1283  }
1284  public function updateMergedThread()
1285  {
1286  $this->db->update(
1287  'frm_threads',
1288  array(
1289  'thr_num_posts' => array('integer', $this->getNumPosts()),
1290  'visits' => array('integer', $this->getVisits()),
1291  'thr_last_post' => array('text', $this->getLastPostString()),
1292  'thr_subject' => array('text', $this->getSubject())
1293  ),
1294  array('thr_pk' => array('integer', $this->getId()))
1295  );
1296  }
1297 
1302  public static function _lookupDate($thread_id)
1303  {
1304  global $DIC;
1305  $ilDB = $DIC->database();
1306 
1307  $res = $ilDB->queryF(
1308  'SELECT thr_date FROM frm_threads WHERE thr_pk = %s',
1309  array('integer'),
1310  array((int) $thread_id)
1311  );
1312 
1313  $row = $ilDB->fetchAssoc($res);
1314 
1315  return $row['thr_date'] ? $row['thr_date'] : '0000-00-00 00:00:00';
1316  }
1317 
1322  {
1323  return $this->last_post;
1324  }
1325 
1330  {
1331  $this->last_post = $post;
1332  }
1333 }
insert()
Inserts the object data into database.
static _lookupDate($thread_id)
updateVisits()
Updates the visit counter of the current topic.
setSubject($a_subject)
static _lookupObjIdForForumId($a_for_id)
unmakeSticky()
Sets the current topic non-sticky.
isNotificationEnabled($a_user_id)
Check whether a user&#39;s notification about new posts in a thread is enabled (result > 0) or not (resul...
setOrderDirection($direction)
setUserNotificationEnabled($user_notification_enabled)
setForumId($a_forum_id)
setOrderField($a_order_field)
$_SESSION["AccountId"]
$result
getFirstPostId()
Fetches the primary key of the first post node of the current topic from database and returns it...
__construct($a_id=0, $a_is_moderator=false, $preventImplicitRead=false)
Constructor.
setAverageRating($average_rating)
global $DIC
Definition: saml.php:7
getLastActivePost()
Fetches and returns an object of the last active post in the current topic.
movePosts($old_obj_id, $old_pk, $new_obj_id, $new_pk)
Moves all posts within the current thread to a new forum.
setNumNewPosts($num_new_posts)
static $possibleOrderDirections
update()
Updates an existing topic.
countActivePosts($ignoreRoot=false)
Fetches and returns the number of active posts for the given user id.
user()
Definition: user.php:4
setNumUnreadPosts($num_unread_posts)
setCreateDate($a_createdate)
getNestedSetPostChildren($pos_id=null, $levels=null)
setThrAuthorId($thr_author_id)
static getInstance($a_obj_id=0)
makeSticky()
Sets the current topic sticky.
close()
Closes the current topic.
foreach($_POST as $key=> $value) $res
getFirstPostNode($isModerator=false, $preventImplicitRead=false)
Fetches and returns an object of the first post in the current topic.
$post
Definition: post.php:34
setDisplayUserId($a_user_id)
$query
setLastPostString($a_last_post)
setChangeDate($a_changedate)
getLastPost()
Fetches and returns an object of the last post in the current topic.
$row
countPosts($ignoreRoot=false)
Fetches and returns the number of posts for the given user id.
static getFirstNewsIdForContext( $a_context_obj_id, $a_context_obj_type, $a_context_sub_obj_id="", $a_context_sub_obj_type="")
Get first new id of news set related to a certain context.
setUserAlias($a_user_alias)
setNumPosts($a_num_posts)
disableNotification($a_user_id)
Disable a user&#39;s notification about new posts in a thread.
setLastPostForThreadOverview(ilForumPost $post)
This class handles all operations on files for the forum object.
global $ilDB
$i
Definition: disco.tpl.php:19
reopen()
Reopens the current topic.
getPostTree(ilForumPost $a_post_node)
Fetches and returns an array of posts from the post tree, starting with the node object passed by the...
static _lookupTitle($a_topic_id)
Looks up the title/subject of a topic/thread.
read()
Reads the data of the current object id from database and loads it into the object.
reload()
Calls the private method read() to load the topic data from database into the object.
enableNotification($a_user_id)
Enable a user&#39;s notification about new posts in a thread.
manipulateF($query, $types, $values)
setImportName($a_import_name)
static lookupForumIdByTopicId($a_topic_id)
Class to report exception.
$data
Definition: bench.php:6