19declare(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);
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')
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()]
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();
351 }
catch (OutOfBoundsException) {
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 && $new_obj->isParentMembershipEnabledContainer()) {
373 if ($this->tree->getParentId($source_ref_id) === $this->tree->getParentId($target_ref_id)) {
374 $target_notifications->cloneFromSource($source_ref_id);
377 $target_notifications->applyTypeConfigurationFor(
378 $new_obj->getAllForumParticipants(),
387 foreach ($translations as $language) {
389 $copiedXML = $originalPageObject->copyXmlContent();
392 $duplicatePageObject->setId($new_obj->getId());
393 $duplicatePageObject->setParentId($new_obj->getId());
394 $duplicatePageObject->setLanguage($language);
395 $duplicatePageObject->setXMLContent($copiedXML);
396 $duplicatePageObject->createFromXML();
402 if (!$cwo->isRootNode($this->getRefId())) {
405 $new_obj->setOfflineStatus(
true);
414 $maybe_grp_ref_id = $this->tree->checkForParentType($this->
getRefId(),
'grp');
415 if ($maybe_grp_ref_id > 0) {
419 return $this->tree->checkForParentType($this->
getRefId(),
'crs') > 0;
431 $participant_usr_ids = array_merge(
432 $participant_usr_ids,
433 $participants->getAdmins(),
434 $participants->getMembers(),
435 $participants->getTutors()
437 }
catch (DomainException) {
440 return array_unique($participant_usr_ids);
449 throw new DomainException(
'Parent is not a membership enabled container.');
452 $maybe_grp_ref_id = $this->tree->checkForParentType($this->
getRefId(),
'grp');
453 if ($maybe_grp_ref_id > 0) {
459 $crs_ref_id = $this->tree->checkForParentType($this->
getRefId(),
'crs');
471 0 === $src_moderator_role_id ||
472 0 === $new_moderator_role_id ||
474 0 === $new_obj->getRefId()
476 $this->
logger->write(__METHOD__ .
' : Error cloning auto generated role: il_frm_moderator');
479 $this->
rbac->admin()->copyRolePermissions(
480 $src_moderator_role_id,
482 $new_obj->getRefId(),
483 $new_moderator_role_id,
487 $this->
logger->write(__METHOD__ .
' : Finished copying of role il_frm_moderator.');
490 $src_moderator_usr_ids = $moderators->getCurrentModerators();
491 foreach ($src_moderator_usr_ids as $usr_id) {
494 if ($this->
getOwner() !== $usr_id) {
495 $this->
rbac->admin()->assignUser($new_moderator_role_id, $usr_id);
500 public function delete():
bool
502 $this->Forum->setForumId($this->
getId());
504 if (!parent::delete()) {
510 $originalPageObject->delete();
515 $topData = $this->Forum->getOneTopic();
517 $threads = $this->Forum->getAllThreads($topData->getTopPk(), [
518 'is_moderator' =>
true,
520 $thread_ids_to_delete = [];
521 foreach ($threads[
'items'] as $thread) {
522 $thread_ids_to_delete[$thread->getId()] = $thread->getId();
527 $res = $this->db->query(
528 'SELECT pos_pk FROM frm_posts WHERE '
532 while ($row =
$res->fetchObject()) {
533 $posting_ids[] = (
int) $row->pos_pk;
537 $tmp_file_obj->delete($posting_ids);
541 $res = $this->db->query(
542 'SELECT draft_id FROM frm_posts_drafts WHERE '
546 while ($row =
$res->fetchObject()) {
547 $draft_ids[] = (
int) $row->draft_id;
551 $tmp_file_obj->delete($draft_ids);
553 $this->db->manipulate(
554 'DELETE FROM frm_posts_tree WHERE ' . $this->db->in(
556 $thread_ids_to_delete,
561 $this->db->manipulate(
562 'DELETE FROM frm_posts WHERE ' . $this->db->in(
564 $thread_ids_to_delete,
569 $this->db->manipulate(
570 'DELETE FROM frm_threads WHERE ' . $this->db->in(
572 $thread_ids_to_delete,
578 $obj_id = [$this->
getId()];
583 $this->db->manipulate(
584 'DELETE FROM frm_notification WHERE ' . $this->db->in(
586 $thread_ids_to_delete,
600 $res = $this->db->queryF(
601 'SELECT draft_id FROM frm_posts_drafts WHERE forum_id = %s',
607 while ($row = $this->db->fetchAssoc(
$res)) {
608 $draft_ids[] = (
int) $row[
'draft_id'];
611 if ($draft_ids !== []) {
613 $historyObj->deleteHistoryByDraftIds($draft_ids);
616 $draftObj->deleteDraftsByDraftIds($draft_ids);
623 'il_frm_moderator_' . $this->
getRefId(),
624 "Moderator of forum obj_no." . $this->
getId(),
636 $mod_title =
'il_frm_moderator_' . $a_ref_id;
638 $res =
$ilDB->queryF(
'SELECT obj_id FROM object_data WHERE title = %s', [
'text'], [$mod_title]);
639 while ($row =
$ilDB->fetchObject(
$res)) {
640 return (
int) $row->obj_id;
651 if (
$DIC->http()->wrapper()->query()->has(
'ref_id')) {
652 $ref_id =
$DIC->http()->wrapper()->query()->retrieve(
654 $DIC->refinery()->kindlyTo()->int()
660 if ($default_visibility ===
'public') {
667 $nextId = $this->db->nextId(
'frm_data');
670 'top_frm_fk' => $this->
getId(),
673 'top_num_posts' => 0,
674 'top_num_threads' => 0,
675 'top_last_post' =>
null,
677 'top_usr_id' => $this->
user->getId(),
681 $this->db->manipulateF(
696 VALUES(%s, %s, %s, %s, %s, %s, %s, %s, %s, %s)',
711 $top_data[
'top_frm_fk'],
712 $top_data[
'top_name'],
713 $top_data[
'top_description'],
714 $top_data[
'top_num_posts'],
715 $top_data[
'top_num_threads'],
716 $top_data[
'top_last_post'],
717 $top_data[
'top_mods'],
718 $top_data[
'top_date'],
719 $top_data[
'top_usr_id']
726 if (array_key_exists($obj_id, self::$obj_id_to_forum_id_cache)) {
727 return self::$obj_id_to_forum_id_cache[$obj_id];
732 return self::$obj_id_to_forum_id_cache[$obj_id];
737 if (array_key_exists(
$ref_id, self::$ref_id_to_forum_id_cache)) {
738 return self::$ref_id_to_forum_id_cache[
$ref_id];
743 return self::$ref_id_to_forum_id_cache[
$ref_id];
755 if (count($obj_ids) === 1) {
756 $in =
' objr.obj_id = ' .
$ilDB->quote(current($obj_ids),
'integer') .
' ';
758 $in =
$ilDB->in(
'objr.obj_id', $obj_ids,
false,
'integer');
761 SELECT frmd.top_pk, objr.ref_id, objr.obj_id
762 FROM object_reference objr
763 INNER JOIN frm_data frmd ON frmd.top_frm_fk = objr.obj_id
769 foreach ($obj_ids as $obj_id) {
770 self::$obj_id_to_forum_id_cache[$obj_id] = 0;
774 self::$obj_id_to_forum_id_cache[(
int) $row[
'obj_id']] = (
int) $row[
'top_pk'];
775 self::$ref_id_to_forum_id_cache[(
int) $row[
'ref_id']] = (
int) $row[
'top_pk'];
788 if (count($ref_ids) === 1) {
789 $in =
" objr.ref_id = " .
$ilDB->quote(current($ref_ids),
'integer') .
" ";
791 $in =
$ilDB->in(
'objr.ref_id', $ref_ids,
false,
'integer');
794 SELECT frmd.top_pk, objr.ref_id, objr.obj_id
795 FROM object_reference objr
796 INNER JOIN frm_data frmd ON frmd.top_frm_fk = objr.obj_id
802 foreach ($ref_ids as
$ref_id) {
803 if (!array_key_exists(
$ref_id, self::$ref_id_to_forum_id_cache)) {
804 self::$ref_id_to_forum_id_cache[
$ref_id] = 0;
809 self::$obj_id_to_forum_id_cache[(
int) $row[
'obj_id']] = (
int) $row[
'top_pk'];
810 self::$ref_id_to_forum_id_cache[(
int) $row[
'ref_id']] = (
int) $row[
'top_pk'];
821 $ilAccess =
$DIC->access();
822 $ilUser =
$DIC->user();
826 if (isset(self::$forum_statistics_cache[
$ref_id])) {
827 return self::$forum_statistics_cache[
$ref_id];
832 'num_unread_posts' => 0,
836 if ($forumId === 0) {
837 self::$forum_statistics_cache[
$ref_id] = $statistics;
838 return self::$forum_statistics_cache[
$ref_id];
842 $is_post_activation_enabled = $objProperties->isPostActivationEnabled();
846 if ($is_post_activation_enabled && !$ilAccess->checkAccess(
'moderate_frm',
'',
$ref_id)) {
847 $act_clause .=
' AND (frm_posts.pos_status = ' .
$ilDB->quote(
850 ) .
' OR frm_posts.pos_author_id = ' .
$ilDB->quote($ilUser->getId(),
'integer') .
') ';
853 if (!$ilUser->isAnonymous()) {
855 (SELECT COUNT(frm_posts.pos_pk) cnt
857 INNER JOIN frm_posts_tree tree1
858 ON tree1.pos_fk = frm_posts.pos_pk
859 AND tree1.parent_pos != 0
860 INNER JOIN frm_threads ON frm_posts.pos_thr_fk = frm_threads.thr_pk
861 WHERE frm_threads.thr_top_fk = %s $act_clause)
865 (SELECT COUNT(DISTINCT(frm_user_read.post_id)) cnt
867 INNER JOIN frm_posts ON frm_user_read.post_id = frm_posts.pos_pk
868 INNER JOIN frm_posts_tree tree1
869 ON tree1.pos_fk = frm_posts.pos_pk
870 AND tree1.parent_pos != 0
871 INNER JOIN frm_threads ON frm_threads.thr_pk = frm_posts.pos_thr_fk
872 WHERE frm_user_read.usr_id = %s AND frm_posts.pos_top_fk = %s $act_clause)
875 $types = [
'integer',
'integer',
'integer'];
876 $values = [$forumId, $ilUser->getId(), $forumId];
878 $mapping = array_keys($statistics);
884 for ($i = 0; $i < 2; $i++) {
887 $statistics[$mapping[$i]] = (
int) ((is_array($row) ? $row[
'cnt'] : 0));
891 $statistics[$mapping[$i]] = $statistics[$mapping[$i - 1]] - $statistics[$mapping[$i]];
896 SELECT COUNT(frm_posts.pos_pk) cnt
898 INNER JOIN frm_posts_tree tree1
899 ON tree1.pos_fk = frm_posts.pos_pk
900 AND tree1.parent_pos != 0
901 INNER JOIN frm_threads ON frm_posts.pos_thr_fk = frm_threads.thr_pk
902 WHERE frm_threads.thr_top_fk = %s $act_clause
904 $types = [
'integer'];
905 $values = [$forumId];
914 'num_posts' => (
int) $row[
'cnt'],
915 'num_unread_posts' => (
int) $row[
'cnt'],
919 self::$forum_statistics_cache[
$ref_id] = $statistics;
921 return self::$forum_statistics_cache[
$ref_id];
928 $ilAccess =
$DIC->access();
929 $ilUser =
$DIC->user();
932 if (array_key_exists(
$ref_id, self::$forum_last_post_cache)) {
933 return self::$forum_last_post_cache[
$ref_id];
937 if ($forumId === 0) {
938 self::$forum_last_post_cache[
$ref_id] =
null;
939 return self::$forum_last_post_cache[
$ref_id];
943 if (!$ilAccess->checkAccess(
'moderate_frm',
'',
$ref_id)) {
944 $act_clause .=
' AND (frm_posts.pos_status = ' .
$ilDB->quote(
947 ) .
' OR frm_posts.pos_author_id = ' .
$ilDB->quote($ilUser->getId(),
'integer') .
') ';
950 $ilDB->setLimit(1, 0);
954 INNER JOIN frm_posts_tree tree1
955 ON tree1.pos_fk = frm_posts.pos_pk
956 AND tree1.parent_pos != 0
957 WHERE pos_top_fk = %s $act_clause
958 ORDER BY pos_date DESC
968 self::$forum_last_post_cache[
$ref_id] =
null;
969 return self::$forum_last_post_cache[
$ref_id];
973 $casted_data[
'pos_pk'] = (
int)
$data[
'pos_pk'];
974 $casted_data[
'pos_top_fk'] = (
int)
$data[
'pos_top_fk'];
975 $casted_data[
'pos_thr_fk'] = (
int)
$data[
'pos_thr_fk'];
976 $casted_data[
'pos_usr_alias'] = (string)
$data[
'pos_usr_alias'];
977 $casted_data[
'pos_subject'] = (string)
$data[
'pos_subject'];
978 $casted_data[
'pos_date'] = (string)
$data[
'pos_date'];
979 $casted_data[
'pos_update'] = (string)
$data[
'pos_update'];
980 $casted_data[
'update_user'] = (
int)
$data[
'update_user'];
981 $casted_data[
'pos_cens'] = (
int)
$data[
'pos_cens'];
982 $casted_data[
'pos_cens_com'] = (string)
$data[
'pos_cens_com'];
983 $casted_data[
'notify'] = (
int)
$data[
'notify'];
984 $casted_data[
'import_name'] = (string)
$data[
'import_name'];
985 $casted_data[
'pos_status'] = (
int)
$data[
'pos_status'];
986 $casted_data[
'pos_message'] = (string)
$data[
'pos_message'];
987 $casted_data[
'pos_author_id'] = (
int)
$data[
'pos_author_id'];
988 $casted_data[
'pos_display_user_id'] = (
int)
$data[
'pos_display_user_id'];
989 $casted_data[
'is_author_moderator'] = (
int)
$data[
'is_author_moderator'];
990 $casted_data[
'pos_cens_date'] = (string)
$data[
'pos_cens_date'];
991 $casted_data[
'pos_activation_date'] = (string)
$data[
'pos_activation_date'];
993 self::$forum_last_post_cache[
$ref_id] = $casted_data;
995 return self::$forum_last_post_cache[
$ref_id];
1006 $ilAccess =
$DIC->access();
1007 $ilUser =
$DIC->user();
1011 $act_inner_clause =
'';
1012 if (!$ilAccess->checkAccess(
'moderate_frm',
'',
$ref_id)) {
1013 $act_clause .=
" AND (t1.pos_status = " .
$ilDB->quote(
1016 ) .
" OR t1.pos_author_id = " .
$ilDB->quote($ilUser->getId(),
"integer") .
") ";
1017 $act_inner_clause .=
" AND (t3.pos_status = " .
$ilDB->quote(
1020 ) .
" OR t3.pos_author_id = " .
$ilDB->quote($ilUser->getId(),
"integer") .
") ";
1023 $in =
$ilDB->in(
"t1.pos_thr_fk", $thread_ids,
false,
'integer');
1024 $inner_in =
$ilDB->in(
"t3.pos_thr_fk", $thread_ids,
false,
'integer');
1027 SELECT t1.pos_display_user_id, t1.update_user
1029 INNER JOIN frm_posts_tree tree1 ON tree1.pos_fk = t1.pos_pk AND tree1.parent_pos != 0
1031 SELECT t3.pos_thr_fk, MAX(t3.pos_date) pos_date
1033 INNER JOIN frm_posts_tree tree2 ON tree2.pos_fk = t3.pos_pk AND tree2.parent_pos != 0
1034 WHERE $inner_in $act_inner_clause
1035 GROUP BY t3.pos_thr_fk
1036 ) t2 ON t2.pos_thr_fk = t1.pos_thr_fk AND t2.pos_date = t1.pos_date
1037 WHERE $in $act_clause
1038 GROUP BY t1.pos_thr_fk, t1.pos_display_user_id, t1.update_user
1044 while ($row =
$ilDB->fetchAssoc(
$res)) {
1045 if ((
int) $row[
'pos_display_user_id'] !== 0) {
1046 $usr_ids[] = (
int) $row[
'pos_display_user_id'];
1048 if ((
int) $row[
'update_user'] !== 0) {
1049 $usr_ids[] = (
int) $row[
'update_user'];
1053 return array_unique($usr_ids);
1056 public static function mergeForumUserRead(
int $merge_source_thread_id,
int $merge_target_thread_id): void
1060 $DIC->database()->update(
1062 [
'thread_id' => [
'integer', $merge_target_thread_id]],
1063 [
'thread_id' => [
'integer', $merge_source_thread_id]]
1069 $res = $this->db->query(
1070 'SELECT COUNT(is_sticky) num_sticky FROM frm_threads
1071 INNER JOIN frm_data ON top_pk = thr_top_fk
1072 WHERE frm_data.top_frm_fk = ' . $this->db->quote($this->getId(),
'integer') .
'
1073 AND is_sticky = ' . $this->db->quote(1,
'integer')
1075 if ($row = $this->db->fetchAssoc(
$res)) {
1076 return (
int) $row[
'num_sticky'];
1089 $sql =
'SELECT DISTINCT page_id FROM page_object WHERE parent_id = %s AND parent_type = %s';
1090 $res = $this->db->queryF(
1092 [
'integer',
'text'],
1096 while ($row = $this->db->fetchAssoc(
$res)) {
1097 $pageObjIds[] = (
int) $row[
'page_id'];
$id
plugin.php for ilComponentBuildPluginInfoObjectiveTest::testAddPlugins
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 _getInstance(int $a_copy_id)
static _getInstanceByObjId(int $a_obj_id)
Class ilForumDraftHistory.
Class ilForumNotification.
static getInstance(int $a_obj_id=0)
Class Forum core functions for forum.
static _getModerators(int $a_ref_id)
static _getInstanceByObjId(int $a_obj_id)
Get singleton instance.
Component logger with individual log levels by component id.
static _getDefaultVisibilityForRefId(int $a_ref_id)
Get default visibility for reference id.
static _deleteReadEntries(int $a_post_id)
__construct(int $a_id=0, bool $a_call_by_reference=true)
static lookupForumIdByRefId(int $ref_id)
static lookupForumIdByObjId(int $obj_id)
cloneAutoGeneratedRoles(self $new_obj)
static array $ref_id_to_forum_id_cache
markAllThreadsRead(int $a_usr_id)
initDefaultRoles()
init default roles settings Purpose of this function is to create a local role folder and local roles...
readonly ILIAS DI RBACServices $rbac
markThreadRead(int $a_usr_id, int $a_thread_id)
static _lookupModeratorRole(int $a_ref_id)
readonly ilLogger $logger
static lookupStatisticsByRefId(int $ref_id)
static preloadForumIdsByRefIds(array $ref_ids)
static getUserIdsOfLastPostsByRefIdAndThreadIds(int $ref_id, array $thread_ids)
static array $forum_statistics_cache
updateModeratorRole(int $role_id)
deleteDraftsByForumId(int $forum_id)
setPermissions(int $parent_ref_id)
isRead($a_usr_id, $a_post_id)
readonly ilSetting $settings
isParentMembershipEnabledContainer()
static lookupLastPostByRefId(int $ref_id)
getCountUnread(int $a_usr_id, int $a_thread_id=0, bool $ignoreRoot=false)
static array $obj_id_to_forum_id_cache
static _lookupThreadSubject(int $a_thread_id)
static mergeForumUserRead(int $merge_source_thread_id, int $merge_target_thread_id)
static preloadForumIdsByObjIds(array $obj_ids)
updateModificationUserId(int $usr_id)
markPostRead(int $a_usr_id, int $a_thread_id, int $a_post_id)
getAllForumParticipants()
static _deleteUser(int $a_usr_id)
static array $forum_last_post_cache
create()
note: title, description and type should be set when this function is called
markPostUnread(int $a_user_id, int $a_post_id)
static createDefaultRole(string $a_title, string $a_description, string $a_tpl_name, int $a_ref_id)
static getInstanceByRefId(int $ref_id, bool $stop_on_error=true)
get an instance of an Ilias object by reference id
Class ilObject Basic functions for all objects.
static _lookupObjectId(int $ref_id)
Properties $object_properties
setOfflineStatus(bool $status)
static _exists(string $a_parent_type, int $a_id, string $a_lang="", bool $a_no_cache=false)
Checks whether page exists.
static lookupTranslations(string $a_parent_type, int $a_id)
Lookup translations.
Base class for course and group participants.
static now()
Return current timestamp in Y-m-d H:i:s format.
__construct(Container $dic, ilPlugin $plugin)
@inheritDoc