19 declare(strict_types=1);
37 private readonly \ILIAS\DI\RBACServices
$rbac;
41 public function __construct(
int $a_id = 0,
bool $a_call_by_reference =
true)
48 $this->
rbac = $DIC->rbac();
49 $this->
logger = $DIC->logger()->root();
57 $id = parent::create();
60 $properties->setDefaultView(
63 $properties->setAnonymisation(
false);
64 $properties->setStatisticsStatus(
false);
65 $properties->setPostActivation(
false);
66 $properties->insert();
79 parent::setPermissions($parent_ref_id);
81 $roles = [self::_lookupModeratorRole($this->
getRefId())];
82 $this->
rbac->admin()->assignUser($roles[0], $this->
getOwner());
88 $this->db->manipulate(
89 'UPDATE frm_data SET top_mods = ' . $this->db->quote(
92 ) .
' WHERE top_frm_fk = ' . $this->db->quote($this->
getId(),
'integer')
100 $ilDB = $DIC->database();
102 $res =
$ilDB->queryF(
'SELECT thr_subject FROM frm_threads WHERE thr_pk = %s', [
'integer'], [$a_thread_id]);
103 while ($row =
$ilDB->fetchObject(
$res)) {
104 return $row->thr_subject ??
'';
110 public function getCountUnread(
int $a_usr_id,
int $a_thread_id = 0,
bool $ignoreRoot =
false):
int 112 $a_frm_id = $this->
getId();
117 if ($a_thread_id === 0) {
118 $res = $this->db->queryF(
'SELECT top_pk FROM frm_data WHERE top_frm_fk = %s', [
'integer'], [$a_frm_id]);
119 while ($row = $this->db->fetchObject(
$res)) {
120 $topic_id = (
int) $row->top_pk;
123 $res = $this->db->queryF(
125 SELECT COUNT(pos_pk) num_posts 127 LEFT JOIN frm_posts_tree ON frm_posts_tree.pos_fk = pos_pk 128 WHERE pos_top_fk = %s' . ($ignoreRoot ?
' AND parent_pos != 0 ' :
''),
133 while ($row = $this->db->fetchObject(
$res)) {
134 $num_posts = (
int) $row->num_posts;
137 $res = $this->db->queryF(
138 'SELECT COUNT(post_id) count_read FROM frm_user_read WHERE obj_id = %s AND usr_id = %s',
139 [
'integer',
'integer'],
140 [$a_frm_id, $a_usr_id]
143 while ($row = $this->db->fetchObject(
$res)) {
144 $count_read = (
int) $row->count_read;
147 $res = $this->db->queryF(
149 SELECT COUNT(pos_pk) num_posts FROM frm_posts 150 LEFT JOIN frm_posts_tree ON frm_posts_tree.pos_fk = pos_pk 151 WHERE pos_thr_fk = %s' . ($ignoreRoot ?
' AND parent_pos != 0 ' :
''),
156 $row = $this->db->fetchObject(
$res);
157 $num_posts = (
int) $row->num_posts;
159 $res = $this->db->queryF(
161 SELECT COUNT(post_id) count_read FROM frm_user_read 165 [
'integer',
'integer',
'integer'],
166 [$a_frm_id, $a_frm_id, $a_thread_id]
169 $row = $this->db->fetchObject(
$res);
170 $count_read = (
int) $row->count_read;
172 $unread = $num_posts - $count_read;
174 return max($unread, 0);
179 $res = $this->db->queryF(
'SELECT pos_pk FROM frm_posts WHERE pos_thr_fk = %s', [
'integer'], [$a_thread_id]);
180 while ($row = $this->db->fetchObject(
$res)) {
181 $this->
markPostRead($a_usr_id, $a_thread_id, (
int) $row->pos_pk);
189 $res = $this->db->queryF(
190 'SELECT thr_pk FROM frm_data, frm_threads WHERE top_frm_fk = %s AND top_pk = thr_top_fk',
195 while ($row = $this->db->fetchObject(
$res)) {
200 public function markPostRead(
int $a_usr_id,
int $a_thread_id,
int $a_post_id): void
202 $res = $this->db->queryF(
204 SELECT thread_id FROM frm_user_read 209 [
'integer',
'integer',
'integer',
'integer'],
210 [$a_usr_id, $this->
getId(), $a_thread_id, $a_post_id]
213 if ($this->db->numRows(
$res) === 0) {
214 $this->db->manipulateF(
216 INSERT INTO frm_user_read 222 VALUES (%s,%s,%s,%s)',
223 [
'integer',
'integer',
'integer',
'integer'],
224 [$a_usr_id, $this->
getId(), $a_thread_id, $a_post_id]
231 $this->db->manipulateF(
232 'DELETE FROM frm_user_read WHERE usr_id = %s AND post_id = %s',
233 [
'integer',
'integer'],
234 [$a_user_id, $a_post_id]
238 public function isRead($a_usr_id, $a_post_id): bool
240 $res = $this->db->queryF(
241 'SELECT * FROM frm_user_read WHERE usr_id = %s AND post_id = %s',
242 [
'integer',
'integer'],
243 [$a_usr_id, $a_post_id]
246 return (
bool) $this->db->numRows(
$res);
255 $DIC->database()->manipulateF(
'DELETE FROM frm_user_read WHERE usr_id = %s', [
'integer'],
$data);
256 $DIC->database()->manipulateF(
'DELETE FROM frm_notification WHERE user_id = %s', [
'integer'],
$data);
263 $DIC->database()->manipulateF(
'DELETE FROM frm_user_read WHERE post_id = %s', [
'integer'], [$a_post_id]);
268 $this->db->manipulateF(
269 'UPDATE frm_data SET update_user = %s WHERE top_frm_fk = %s',
270 [
'integer',
'integer'],
271 [$usr_id, $this->
getId()],
277 if (parent::update()) {
278 $this->db->manipulateF(
279 'UPDATE frm_data SET top_name = %s, top_description = %s, top_update = %s, update_user = %s WHERE top_frm_fk = %s',
280 [
'text',
'text',
'timestamp',
'integer',
'integer'],
285 $this->
user->getId(),
296 public function cloneObject(
int $target_id,
int $copy_id = 0,
bool $omit_tree =
false): ?
ilObject 299 $new_obj = parent::cloneObject($target_id, $copy_id, $omit_tree);
303 $this->Forum->setMDB2WhereCondition(
'top_frm_fk = %s ', [
'integer'], [$this->
getId()]);
304 $topData = $this->Forum->getOneTopic();
306 $this->db->update(
'frm_data', [
307 'top_name' => [
'text', $topData->getTopName()],
308 'top_description' => [
'text', $topData->getTopDescription()],
309 'top_num_posts' => [
'integer', $topData->getTopNumPosts()],
310 'top_num_threads' => [
'integer', $topData->getTopNumThreads()],
311 'top_last_post' => [
'text', $topData->getTopLastPost()],
312 'top_date' => [
'timestamp', $topData->getTopDate()],
313 'visits' => [
'integer', $topData->getVisits()],
314 'top_update' => [
'timestamp', $topData->getTopUpdate()],
315 'update_user' => [
'integer', $topData->getUpdateUser()],
316 'top_usr_id' => [
'integer', $topData->getTopUsrId()]
318 'top_frm_fk' => [
'integer', $new_obj->getId()]
322 $options = $cwo->getOptions($this->
getRefId());
324 $options[
'threads'] = $this->Forum::getSortedThreadSubjects($this->
getId());
326 $new_frm = $new_obj->Forum;
327 $new_frm->setMDB2WhereCondition(
'top_frm_fk = %s ', [
'integer'], [$new_obj->getId()]);
329 $new_frm->setForumId($new_obj->getId());
330 $new_frm->setForumRefId($new_obj->getRefId());
332 $new_topic = $new_frm->getOneTopic();
333 foreach (array_keys($options[
'threads']) as $thread_id) {
334 $this->Forum->setMDB2WhereCondition(
'thr_pk = %s ', [
'integer'], [$thread_id]);
336 $old_thread = $this->Forum->getOneThread();
338 $old_post_id = $this->Forum->getRootPostIdByThread($old_thread->getId());
341 $newThread->setSticky($old_thread->isSticky());
342 $newThread->setForumId($new_topic->getTopPk());
343 $newThread->setThrAuthorId($old_thread->getThrAuthorId());
344 $newThread->setDisplayUserId($old_thread->getDisplayUserId());
345 $newThread->setSubject($old_thread->getSubject());
346 $newThread->setUserAlias($old_thread->getUserAlias());
347 $newThread->setCreateDate($old_thread->getCreateDate());
350 $top_pos = $old_thread->getFirstVisiblePostNode();
355 $newPostId = $new_frm->generateThread(
357 $top_pos->getMessage(),
358 $top_pos->isNotificationEnabled(),
361 (bool) ($old_thread->getNumPosts() - 1)
365 $old_forum_files->
ilClone($new_obj->getId(), $newPostId);
369 $target_ref_id = $new_obj->getRefId();
372 if ($source_ref_id > 0 && $target_ref_id > 0 &&
373 $this->tree->getParentId($source_ref_id) === $this->tree->getParentId($target_ref_id)) {
374 if ($new_obj->isParentMembershipEnabledContainer()) {
375 $target_notifications->cloneFromSource($source_ref_id);
379 $target_notifications->updateUserNotifications($new_obj->getAllForumParticipants(),
$object_properties);
384 foreach ($translations as $language) {
386 $copiedXML = $originalPageObject->copyXmlContent();
389 $duplicatePageObject->setId($new_obj->getId());
390 $duplicatePageObject->setParentId($new_obj->getId());
391 $duplicatePageObject->setLanguage($language);
392 $duplicatePageObject->setXMLContent($copiedXML);
393 $duplicatePageObject->createFromXML();
399 if (!$cwo->isRootNode($this->getRefId())) {
402 $new_obj->setOfflineStatus(
true);
411 $maybe_grp_ref_id = $this->tree->checkForParentType($this->
getRefId(),
'grp');
412 if ($maybe_grp_ref_id > 0) {
416 return $this->tree->checkForParentType($this->
getRefId(),
'crs') > 0;
428 $participant_usr_ids = array_merge(
429 $participant_usr_ids,
430 $participants->getAdmins(),
431 $participants->getMembers(),
432 $participants->getTutors()
434 }
catch (DomainException) {
437 return array_unique($participant_usr_ids);
446 throw new DomainException(
'Parent is not a membership enabled container.');
449 $maybe_grp_ref_id = $this->tree->checkForParentType($this->
getRefId(),
'grp');
450 if ($maybe_grp_ref_id > 0) {
456 $crs_ref_id = $this->tree->checkForParentType($this->
getRefId(),
'crs');
464 $src_moderator_role_id = self::_lookupModeratorRole($this->
getRefId());
465 $new_moderator_role_id = self::_lookupModeratorRole($new_obj->getRefId());
468 0 === $src_moderator_role_id ||
469 0 === $new_moderator_role_id ||
471 0 === $new_obj->getRefId()
473 $this->
logger->write(__METHOD__ .
' : Error cloning auto generated role: il_frm_moderator');
476 $this->
rbac->admin()->copyRolePermissions(
477 $src_moderator_role_id,
479 $new_obj->getRefId(),
480 $new_moderator_role_id,
484 $this->
logger->write(__METHOD__ .
' : Finished copying of role il_frm_moderator.');
487 $src_moderator_usr_ids = $moderators->getCurrentModerators();
488 foreach ($src_moderator_usr_ids as $usr_id) {
491 if ($this->
getOwner() !== $usr_id) {
492 $this->
rbac->admin()->assignUser($new_moderator_role_id, $usr_id);
497 public function delete():
bool 499 $this->Forum->setForumId($this->
getId());
501 if (!parent::delete()) {
507 $originalPageObject->delete();
512 $topData = $this->Forum->getOneTopic();
514 $threads = $this->Forum->getAllThreads($topData->getTopPk(), [
515 'is_moderator' =>
true,
517 $thread_ids_to_delete = [];
518 foreach ($threads[
'items'] as $thread) {
519 $thread_ids_to_delete[$thread->getId()] = $thread->getId();
524 $res = $this->db->query(
525 'SELECT pos_pk FROM frm_posts WHERE ' 529 while ($row =
$res->fetchObject()) {
530 $posting_ids[] = (
int) $row->pos_pk;
534 $tmp_file_obj->delete($posting_ids);
538 $res = $this->db->query(
539 'SELECT draft_id FROM frm_posts_drafts WHERE ' 543 while ($row =
$res->fetchObject()) {
544 $draft_ids[] = (
int) $row->draft_id;
548 $tmp_file_obj->delete($draft_ids);
550 $this->db->manipulate(
551 'DELETE FROM frm_posts_tree WHERE ' . $this->db->in(
553 $thread_ids_to_delete,
558 $this->db->manipulate(
559 'DELETE FROM frm_posts WHERE ' . $this->db->in(
561 $thread_ids_to_delete,
566 $this->db->manipulate(
567 'DELETE FROM frm_threads WHERE ' . $this->db->in(
569 $thread_ids_to_delete,
575 $obj_id = [$this->
getId()];
580 $this->db->manipulate(
581 'DELETE FROM frm_notification WHERE ' . $this->db->in(
583 $thread_ids_to_delete,
597 $res = $this->db->queryF(
598 'SELECT draft_id FROM frm_posts_drafts WHERE forum_id = %s',
604 while ($row = $this->db->fetchAssoc(
$res)) {
605 $draft_ids[] = (
int) $row[
'draft_id'];
608 if ($draft_ids !== []) {
610 $historyObj->deleteHistoryByDraftIds($draft_ids);
613 $draftObj->deleteDraftsByDraftIds($draft_ids);
620 'il_frm_moderator_' . $this->
getRefId(),
621 "Moderator of forum obj_no." . $this->
getId(),
631 $ilDB = $DIC->database();
633 $mod_title =
'il_frm_moderator_' . $a_ref_id;
635 $res =
$ilDB->queryF(
'SELECT obj_id FROM object_data WHERE title = %s', [
'text'], [$mod_title]);
636 while ($row =
$ilDB->fetchObject(
$res)) {
637 return (
int) $row->obj_id;
648 if ($DIC->http()->wrapper()->query()->has(
'ref_id')) {
649 $ref_id = $DIC->http()->wrapper()->query()->retrieve(
651 $DIC->refinery()->kindlyTo()->int()
657 if ($default_visibility ===
'public') {
664 $nextId = $this->db->nextId(
'frm_data');
667 'top_frm_fk' => $this->
getId(),
670 'top_num_posts' => 0,
671 'top_num_threads' => 0,
672 'top_last_post' =>
null,
674 'top_usr_id' => $this->
user->getId(),
678 $this->db->manipulateF(
693 VALUES(%s, %s, %s, %s, %s, %s, %s, %s, %s, %s)',
708 $top_data[
'top_frm_fk'],
709 $top_data[
'top_name'],
710 $top_data[
'top_description'],
711 $top_data[
'top_num_posts'],
712 $top_data[
'top_num_threads'],
713 $top_data[
'top_last_post'],
714 $top_data[
'top_mods'],
715 $top_data[
'top_date'],
716 $top_data[
'top_usr_id']
723 if (array_key_exists($obj_id, self::$obj_id_to_forum_id_cache)) {
724 return self::$obj_id_to_forum_id_cache[$obj_id];
727 self::preloadForumIdsByObjIds([$obj_id]);
729 return self::$obj_id_to_forum_id_cache[$obj_id];
734 if (array_key_exists($ref_id, self::$ref_id_to_forum_id_cache)) {
735 return self::$ref_id_to_forum_id_cache[
$ref_id];
738 self::preloadForumIdsByRefIds([$ref_id]);
740 return self::$ref_id_to_forum_id_cache[
$ref_id];
750 $ilDB = $DIC->database();
752 if (count($obj_ids) === 1) {
753 $in =
' objr.obj_id = ' .
$ilDB->quote(current($obj_ids),
'integer') .
' ';
755 $in =
$ilDB->in(
'objr.obj_id', $obj_ids,
false,
'integer');
758 SELECT frmd.top_pk, objr.ref_id, objr.obj_id 759 FROM object_reference objr 760 INNER JOIN frm_data frmd ON frmd.top_frm_fk = objr.obj_id 766 foreach ($obj_ids as $obj_id) {
767 self::$obj_id_to_forum_id_cache[$obj_id] = 0;
771 self::$obj_id_to_forum_id_cache[(
int) $row[
'obj_id']] = (
int) $row[
'top_pk'];
772 self::$ref_id_to_forum_id_cache[(
int) $row[
'ref_id']] = (
int) $row[
'top_pk'];
783 $ilDB = $DIC->database();
785 if (count($ref_ids) === 1) {
786 $in =
" objr.ref_id = " .
$ilDB->quote(current($ref_ids),
'integer') .
" ";
788 $in =
$ilDB->in(
'objr.ref_id', $ref_ids,
false,
'integer');
791 SELECT frmd.top_pk, objr.ref_id, objr.obj_id 792 FROM object_reference objr 793 INNER JOIN frm_data frmd ON frmd.top_frm_fk = objr.obj_id 799 foreach ($ref_ids as
$ref_id) {
800 if (!array_key_exists($ref_id, self::$ref_id_to_forum_id_cache)) {
801 self::$ref_id_to_forum_id_cache[
$ref_id] = 0;
806 self::$obj_id_to_forum_id_cache[(
int) $row[
'obj_id']] = (
int) $row[
'top_pk'];
807 self::$ref_id_to_forum_id_cache[(
int) $row[
'ref_id']] = (
int) $row[
'top_pk'];
818 $ilAccess = $DIC->access();
819 $ilUser = $DIC->user();
820 $ilDB = $DIC->database();
823 if (isset(self::$forum_statistics_cache[$ref_id])) {
824 return self::$forum_statistics_cache[
$ref_id];
829 'num_unread_posts' => 0,
832 $forumId = self::lookupForumIdByRefId($ref_id);
833 if ($forumId === 0) {
834 self::$forum_statistics_cache[
$ref_id] = $statistics;
835 return self::$forum_statistics_cache[
$ref_id];
839 $is_post_activation_enabled = $objProperties->isPostActivationEnabled();
843 if ($is_post_activation_enabled && !$ilAccess->checkAccess(
'moderate_frm',
'', $ref_id)) {
844 $act_clause .=
' AND (frm_posts.pos_status = ' .
$ilDB->quote(
847 ) .
' OR frm_posts.pos_author_id = ' .
$ilDB->quote($ilUser->getId(),
'integer') .
') ';
850 if (!$ilUser->isAnonymous()) {
852 (SELECT COUNT(frm_posts.pos_pk) cnt 854 INNER JOIN frm_posts_tree tree1 855 ON tree1.pos_fk = frm_posts.pos_pk 856 AND tree1.parent_pos != 0 857 INNER JOIN frm_threads ON frm_posts.pos_thr_fk = frm_threads.thr_pk 858 WHERE frm_threads.thr_top_fk = %s $act_clause) 862 (SELECT COUNT(DISTINCT(frm_user_read.post_id)) cnt 864 INNER JOIN frm_posts ON frm_user_read.post_id = frm_posts.pos_pk 865 INNER JOIN frm_posts_tree tree1 866 ON tree1.pos_fk = frm_posts.pos_pk 867 AND tree1.parent_pos != 0 868 INNER JOIN frm_threads ON frm_threads.thr_pk = frm_posts.pos_thr_fk 869 WHERE frm_user_read.usr_id = %s AND frm_posts.pos_top_fk = %s $act_clause) 872 $types = [
'integer',
'integer',
'integer'];
873 $values = [$forumId, $ilUser->getId(), $forumId];
875 $mapping = array_keys($statistics);
881 for ($i = 0; $i < 2; $i++) {
884 $statistics[$mapping[$i]] = (
int) ((is_array($row) ? $row[
'cnt'] : 0));
888 $statistics[$mapping[$i]] = $statistics[$mapping[$i - 1]] - $statistics[$mapping[$i]];
893 SELECT COUNT(frm_posts.pos_pk) cnt 895 INNER JOIN frm_posts_tree tree1 896 ON tree1.pos_fk = frm_posts.pos_pk 897 AND tree1.parent_pos != 0 898 INNER JOIN frm_threads ON frm_posts.pos_thr_fk = frm_threads.thr_pk 899 WHERE frm_threads.thr_top_fk = %s $act_clause 901 $types = [
'integer'];
902 $values = [$forumId];
911 'num_posts' => (
int) $row[
'cnt'],
912 'num_unread_posts' => (
int) $row[
'cnt'],
916 self::$forum_statistics_cache[
$ref_id] = $statistics;
918 return self::$forum_statistics_cache[
$ref_id];
925 $ilAccess = $DIC->access();
926 $ilUser = $DIC->user();
927 $ilDB = $DIC->database();
929 if (array_key_exists($ref_id, self::$forum_last_post_cache)) {
930 return self::$forum_last_post_cache[
$ref_id];
933 $forumId = self::lookupForumIdByRefId($ref_id);
934 if ($forumId === 0) {
936 return self::$forum_last_post_cache[
$ref_id];
940 if (!$ilAccess->checkAccess(
'moderate_frm',
'', $ref_id)) {
941 $act_clause .=
' AND (frm_posts.pos_status = ' .
$ilDB->quote(
944 ) .
' OR frm_posts.pos_author_id = ' .
$ilDB->quote($ilUser->getId(),
'integer') .
') ';
947 $ilDB->setLimit(1, 0);
951 INNER JOIN frm_posts_tree tree1 952 ON tree1.pos_fk = frm_posts.pos_pk 953 AND tree1.parent_pos != 0 954 WHERE pos_top_fk = %s $act_clause 955 ORDER BY pos_date DESC 966 return self::$forum_last_post_cache[
$ref_id];
970 $casted_data[
'pos_pk'] = (
int)
$data[
'pos_pk'];
971 $casted_data[
'pos_top_fk'] = (
int)
$data[
'pos_top_fk'];
972 $casted_data[
'pos_thr_fk'] = (
int)
$data[
'pos_thr_fk'];
973 $casted_data[
'pos_usr_alias'] = (string)
$data[
'pos_usr_alias'];
974 $casted_data[
'pos_subject'] = (string)
$data[
'pos_subject'];
975 $casted_data[
'pos_date'] = (string)
$data[
'pos_date'];
976 $casted_data[
'pos_update'] = (string)
$data[
'pos_update'];
977 $casted_data[
'update_user'] = (
int)
$data[
'update_user'];
978 $casted_data[
'pos_cens'] = (
int)
$data[
'pos_cens'];
979 $casted_data[
'pos_cens_com'] = (string)
$data[
'pos_cens_com'];
980 $casted_data[
'notify'] = (
int)
$data[
'notify'];
981 $casted_data[
'import_name'] = (string)
$data[
'import_name'];
982 $casted_data[
'pos_status'] = (
int)
$data[
'pos_status'];
983 $casted_data[
'pos_message'] = (string)
$data[
'pos_message'];
984 $casted_data[
'pos_author_id'] = (
int)
$data[
'pos_author_id'];
985 $casted_data[
'pos_display_user_id'] = (
int)
$data[
'pos_display_user_id'];
986 $casted_data[
'is_author_moderator'] = (
int)
$data[
'is_author_moderator'];
987 $casted_data[
'pos_cens_date'] = (string)
$data[
'pos_cens_date'];
988 $casted_data[
'pos_activation_date'] = (string)
$data[
'pos_activation_date'];
990 self::$forum_last_post_cache[
$ref_id] = $casted_data;
992 return self::$forum_last_post_cache[
$ref_id];
1003 $ilAccess = $DIC->access();
1004 $ilUser = $DIC->user();
1005 $ilDB = $DIC->database();
1008 $act_inner_clause =
'';
1009 if (!$ilAccess->checkAccess(
'moderate_frm',
'', $ref_id)) {
1010 $act_clause .=
" AND (t1.pos_status = " .
$ilDB->quote(
1013 ) .
" OR t1.pos_author_id = " .
$ilDB->quote($ilUser->getId(),
"integer") .
") ";
1014 $act_inner_clause .=
" AND (t3.pos_status = " .
$ilDB->quote(
1017 ) .
" OR t3.pos_author_id = " .
$ilDB->quote($ilUser->getId(),
"integer") .
") ";
1020 $in =
$ilDB->in(
"t1.pos_thr_fk", $thread_ids,
false,
'integer');
1021 $inner_in =
$ilDB->in(
"t3.pos_thr_fk", $thread_ids,
false,
'integer');
1024 SELECT t1.pos_display_user_id, t1.update_user 1026 INNER JOIN frm_posts_tree tree1 ON tree1.pos_fk = t1.pos_pk AND tree1.parent_pos != 0 1028 SELECT t3.pos_thr_fk, MAX(t3.pos_date) pos_date 1030 INNER JOIN frm_posts_tree tree2 ON tree2.pos_fk = t3.pos_pk AND tree2.parent_pos != 0 1031 WHERE $inner_in $act_inner_clause 1032 GROUP BY t3.pos_thr_fk 1033 ) t2 ON t2.pos_thr_fk = t1.pos_thr_fk AND t2.pos_date = t1.pos_date 1034 WHERE $in $act_clause 1035 GROUP BY t1.pos_thr_fk, t1.pos_display_user_id, t1.update_user 1041 while ($row =
$ilDB->fetchAssoc(
$res)) {
1042 if ((
int) $row[
'pos_display_user_id'] !== 0) {
1043 $usr_ids[] = (
int) $row[
'pos_display_user_id'];
1045 if ((
int) $row[
'update_user'] !== 0) {
1046 $usr_ids[] = (
int) $row[
'update_user'];
1050 return array_unique($usr_ids);
1053 public static function mergeForumUserRead(
int $merge_source_thread_id,
int $merge_target_thread_id): void
1057 $DIC->database()->update(
1059 [
'thread_id' => [
'integer', $merge_target_thread_id]],
1060 [
'thread_id' => [
'integer', $merge_source_thread_id]]
1066 $res = $this->db->query(
1067 'SELECT COUNT(is_sticky) num_sticky FROM frm_threads 1068 INNER JOIN frm_data ON top_pk = thr_top_fk 1069 WHERE frm_data.top_frm_fk = ' . $this->db->quote($this->getId(),
'integer') .
' 1070 AND is_sticky = ' . $this->db->quote(1,
'integer')
1072 if ($row = $this->db->fetchAssoc(
$res)) {
1073 return (
int) $row[
'num_sticky'];
1086 $sql =
'SELECT DISTINCT page_id FROM page_object WHERE parent_id = %s AND parent_type = %s';
1087 $res = $this->db->queryF(
1089 [
'integer',
'text'],
1093 while ($row = $this->db->fetchAssoc(
$res)) {
1094 $pageObjIds[] = (
int) $row[
'page_id'];
getAllForumParticipants()
ilClone(int $new_obj_id, int $new_posting_id)
__construct(int $a_id=0, bool $a_call_by_reference=true)
static mergeForumUserRead(int $merge_source_thread_id, int $merge_target_thread_id)
static _lookupThreadSubject(int $a_thread_id)
static array $forum_statistics_cache
updateModificationUserId(int $usr_id)
static _getDefaultVisibilityForRefId(int $a_ref_id)
Get default visibility for reference id.
static lookupForumIdByObjId(int $obj_id)
static _lookupModeratorRole(int $a_ref_id)
updateModeratorRole(int $role_id)
static getUserIdsOfLastPostsByRefIdAndThreadIds(int $ref_id, array $thread_ids)
deleteDraftsByForumId(int $forum_id)
readonly ilLogger $logger
static createDefaultRole(string $a_title, string $a_description, string $a_tpl_name, int $a_ref_id)
static preloadForumIdsByObjIds(array $obj_ids)
isParentMembershipEnabledContainer()
static lookupTranslations(string $a_parent_type, int $a_id)
Lookup translations.
static lookupForumIdByRefId(int $ref_id)
static now()
Return current timestamp in Y-m-d H:i:s format.
Properties $object_properties
markAllThreadsRead(int $a_usr_id)
static _deleteReadEntries(int $a_post_id)
Class ilForumDraftHistory.
static getInstance(int $a_obj_id=0)
while($session_entry=$r->fetchRow(ilDBConstants::FETCHMODE_ASSOC)) return null
static _deleteUser(int $a_usr_id)
static _getInstanceByObjId(int $a_obj_id)
static lookupStatisticsByRefId(int $ref_id)
static _exists(string $a_parent_type, int $a_id, string $a_lang="", bool $a_no_cache=false)
Checks whether page exists.
static getInstanceByRefId(int $ref_id, bool $stop_on_error=true)
get an instance of an Ilias object by reference id
static _write(string $a_type, string $a_setting, string $a_value, int $a_user=0, int $a_block_id=0)
Write setting to database.
static _lookupObjectId(int $ref_id)
readonly ilSetting $settings
static array $obj_id_to_forum_id_cache
setOfflineStatus(bool $status)
static array $forum_last_post_cache
getCountUnread(int $a_usr_id, int $a_thread_id=0, bool $ignoreRoot=false)
static array $ref_id_to_forum_id_cache
static lookupLastPostByRefId(int $ref_id)
static _getInstanceByObjId(int $a_obj_id)
Get singleton instance.
isRead($a_usr_id, $a_post_id)
$id
plugin.php for ilComponentBuildPluginInfoObjectiveTest::testAddPlugins
__construct(Container $dic, ilPlugin $plugin)
readonly ILIAS DI RBACServices $rbac
static _getModerators(int $a_ref_id)
static _getInstance(int $a_copy_id)
markPostUnread(int $a_user_id, int $a_post_id)
setPermissions(int $parent_ref_id)
markThreadRead(int $a_usr_id, int $a_thread_id)
static preloadForumIdsByRefIds(array $ref_ids)
markPostRead(int $a_usr_id, int $a_thread_id, int $a_post_id)
cloneAutoGeneratedRoles(self $new_obj)