4require_once
'./Modules/Forum/classes/class.ilForumProperties.php';
5require_once
'./Modules/Forum/classes/class.ilObjForum.php';
6require_once
'./Modules/Forum/classes/class.ilForumTopic.php';
7require_once
'./Modules/Forum/classes/class.ilForumPost.php';
105 static $lngCache = array();
110 if(!isset($lngCache[$languageShorthandle]))
112 $lngCache[$languageShorthandle] =
new ilLanguage($languageShorthandle);
113 $lngCache[$languageShorthandle]->loadLanguageModule(
'forum');
116 return $lngCache[$languageShorthandle];
127 if (!isset($a_obj_id))
129 $message = get_class($this).
"::setForumId(): No obj_id given!";
130 $this->
ilias->raiseError($message,$this->
ilias->error_obj->WARNING);
133 $this->
id = $a_obj_id;
143 if (!isset($a_ref_id))
145 $message = get_class($this).
"::setForumRefId(): No ref_id given!";
146 $this->
ilias->raiseError($message,$this->
ilias->error_obj->WARNING);
149 $this->ref_id = $a_ref_id;
182 die($this->className .
"::setOrderField(): No orderField given.");
211 die($this->className .
"::setDbTable(): No database table given.");
242 $this->mdb2Query = $query_string;
243 $this->mdb2DataValue = $data_value;
244 $this->mdb2DataType = $data_type;
257 if($this->mdb2Query !=
'')
271 if($this->mdb2DataValue !=
'')
284 if($this->mdb2DataType !=
'')
327 $data_type = array();
328 $data_value = array();
330 $query =
'SELECT * FROM frm_data WHERE ';
334 $query .=
''.$this->getMDB2Query().
'';
338 $res = $ilDB->queryf(
$query, $data_type, $data_value);
341 if(is_null(
$row))
return NULL;
343 $row[
"top_name"] = trim(
$row[
"top_name"]);
344 $row[
"top_description"] = nl2br(
$row[
"top_description"]);
356 if(!is_array(
$row) || !count(
$row))
return null;
358 $row[
'top_name'] = trim(
$row[
'top_name']);
359 $row[
'top_description'] = nl2br(
$row[
'top_description']);
374 $data_type = array();
375 $data_value = array();
377 $query =
'SELECT * FROM frm_threads WHERE ';
385 $sql_res =
$ilDB->queryf(
$query, $data_type, $data_value);
404 SELECT frm_posts.*, usr_data.lastname FROM frm_posts, usr_data
406 AND pos_display_user_id = usr_id',
407 array(
'integer'), array($post));
413 $row[
"pos_message"] = nl2br(
$row[
"pos_message"]);
423 SELECT * FROM frm_posts WHERE pos_pk = %s',
424 array(
'integer'), array($a_id));
428 return $row->pos_message;
448 public function generatePost($forum_id, $thread_id, $author_id, $display_user_id, $message, $parent_pos, $notify, $subject =
'', $alias =
'', $date =
'', $status = 1, $send_activation_mail = 0)
453 $objNewPost->setForumId($forum_id);
454 $objNewPost->setThreadId($thread_id);
455 $objNewPost->setSubject($subject);
456 $objNewPost->setMessage($message);
457 $objNewPost->setDisplayUserId($display_user_id);
458 $objNewPost->setUserAlias($alias);
459 $objNewPost->setPosAuthorId($author_id);
462 $objNewPost->setIsAuthorModerator($is_moderator);
466 $objNewPost->setCreateDate(date(
"Y-m-d H:i:s"));
470 if (strpos($date,
"-") > 0)
472 $objNewPost->setCreateDate($date);
476 $objNewPost->setCreateDate(date(
"Y-m-d H:i:s", $date));
481 $objNewPost->setPostActivationDate($objNewPost->getCreateDate());
485 $objNewPost->setNotification($notify);
486 $objNewPost->setStatus($status);
487 $objNewPost->insert();
490 if ($parent_pos == 0)
492 $this->
addPostTree($objNewPost->getThreadId(), $objNewPost->getId(), $objNewPost->getCreateDate());
496 $this->
insertPostNode($objNewPost->getId(), $parent_pos, $objNewPost->getThreadId(), $objNewPost->getCreateDate());
500 $lastPost = $objNewPost->getForumId().
"#".$objNewPost->getThreadId().
"#".$objNewPost->getId();
505 SET thr_num_posts = thr_num_posts + 1,
508 array(
'text',
'integer'),
509 array($lastPost, $objNewPost->getThreadId()));
514 SET top_num_posts = top_num_posts + 1,
517 array(
'text',
'integer'),
518 array($lastPost, $objNewPost->getForumId()));
522 $forum_obj->markPostRead($objNewPost->getPosAuthorId(), $objNewPost->getThreadId(), $objNewPost->getId());
527 require_once
'Services/RTE/classes/class.ilRTE.php';
528 include_once(
"./Services/News/classes/class.ilNewsItem.php");
530 $news_item->setContext($forum_obj->getId(),
'frm', $objNewPost->getId(),
'pos');
532 $news_item->setTitle($objNewPost->getSubject());
534 $news_item->setUserId($display_user_id);
536 $news_item->create();
539 return $objNewPost->getId();
556 public function generateThread($forum_id, $author_id, $display_user_id, $subject, $message, $notify, $notify_posts, $alias =
'', $date =
'', $status = 1)
561 $objNewThread->setForumId($forum_id);
562 $objNewThread->setDisplayUserId($display_user_id);
563 $objNewThread->setSubject($subject);
564 $objNewThread->setThrAuthorId($author_id);
568 $objNewThread->setCreateDate(date(
"Y-m-d H:i:s"));
572 if (strpos($date,
"-") > 0)
574 $objNewThread->setCreateDate($date);
578 $objNewThread->setCreateDate(date(
"Y-m-d H:i:s", $date));
582 $objNewThread->setUserAlias($alias);
583 $objNewThread->insert();
585 if ($notify_posts == 1)
587 $objNewThread->enableNotification($author_id);
591 $statement =
$ilDB->manipulateF(
'
593 SET top_num_threads = top_num_threads + 1
595 array(
'integer'), array($forum_id));
597 return $this->
generatePost($forum_id, $objNewThread->getId(), $author_id, $display_user_id, $message, 0, $notify, $subject, $alias, $objNewThread->getCreateDate(), $status, 0);
608 public function moveThreads($thread_ids = array(), $src_ref_id = 0, $dest_top_frm_fk = 0)
614 if (is_numeric($src_top_frm_fk) && $src_top_frm_fk > 0 && is_numeric($dest_top_frm_fk) && $dest_top_frm_fk > 0)
625 if ($oldFrmData[
'top_pk'] && $newFrmData[
'top_pk'])
630 foreach ($thread_ids as
$id)
634 $numPosts = $objTmpThread->movePosts($src_top_frm_fk, $oldFrmData[
'top_pk'], $dest_top_frm_fk, $newFrmData[
'top_pk']);
635 if (($last_post_string = $objTmpThread->getLastPostString()) !=
'')
637 $last_post_string = explode(
'#', $last_post_string);
638 $last_post_string[0] = $newFrmData[
'top_pk'];
639 $last_post_string = implode(
'#', $last_post_string);
640 $objTmpThread->setLastPostString($last_post_string);
643 $visits += $objTmpThread->getVisits();
645 $moved_posts += $numPosts;
648 $objTmpThread->setForumId($newFrmData[
'top_pk']);
649 $objTmpThread->update();
651 unset($objTmpThread);
657 SELECT pos_thr_fk, pos_pk
659 WHERE pos_top_fk = %s
660 ORDER BY pos_date DESC',
661 array(
'integer'), array($oldFrmData[
'top_pk']));
664 $last_post_src = $oldFrmData[
'top_pk'] .
'#' .
$row->pos_thr_fk .
'#' .
$row->pos_pk;
666 $statement =
$ilDB->manipulateF(
'
668 SET top_num_posts = top_num_posts - %s,
669 top_num_threads = top_num_threads - %s,
670 visits = visits - %s,
673 array(
'integer',
'integer',
'integer',
'text',
'integer'),
678 $oldFrmData[
'top_pk']));
684 SELECT pos_thr_fk, pos_pk
686 WHERE pos_top_fk = %s
687 ORDER BY pos_date DESC',
688 array(
'integer'), array($newFrmData[
'top_kp']));
691 $last_post_dest = $newFrmData[
'top_pk'] .
'#' .
$row->pos_thr_fk .
'#' .
$row->pos_pk;
693 $statement =
$ilDB->manipulateF(
'
695 SET top_num_posts = top_num_posts + %s,
696 top_num_threads = top_num_threads + %s,
697 visits = visits + %s,
700 array(
'integer',
'integer',
'integer',
'text',
'integer'),
701 array($moved_posts, $moved_threads, $visits, $last_post_dest, $newFrmData[
'top_pk']));
735 $cens_date = date(
"Y-m-d H:i:s");
739 SET pos_cens_com = %s,
744 array(
'text',
'timestamp',
'integer',
'integer',
'integer'),
745 array($message, $cens_date, $cens,
$_SESSION[
'AccountId'], $pos_pk));
748 include_once(
"./Services/News/classes/class.ilNewsItem.php");
750 "frm", $pos_pk,
"pos");
757 $news_item->setContent(nl2br($this->
prepareText($message, 0)));
758 $news_item->update();
764 SELECT * FROM frm_posts
766 array(
'integer'), array($pos_pk));
772 $news_item->setContent(nl2br($this->
prepareText($rec[
"pos_message"], 0)));
773 $news_item->update();
777 require_once
'Modules/Forum/classes/class.ilForumPost.php';
778 $GLOBALS[
'ilAppEventHandler']->raise(
800 include_once
"./Modules/Forum/classes/class.ilObjForum.php";
804 $GLOBALS[
'ilAppEventHandler']->raise(
810 'thread_deleted' => ($p_node[
"parent"] == 0)?
true :
false
818 foreach($del_id as $post_id)
820 ilObjForum::_deleteReadEntries($post_id);
826 $dead_pos = count($del_id);
830 if ($p_node[
"parent"] == 0)
833 include_once
'./Modules/Forum/classes/class.ilObjForum.php';
835 ilObjForum::_deleteAccessEntries($p_node[
'tree']);
838 $dead_thr = $p_node[
"tree"];
840 $statement =
$ilDB->manipulateF(
'
841 DELETE FROM frm_threads
843 array(
'integer'), array($p_node[
'tree']));
846 $statement =
$ilDB->manipulateF(
'
848 SET top_num_threads = top_num_threads - 1
849 WHERE top_frm_fk = %s',
850 array(
'integer'), array($this->
id));
853 $posset =
$ilDB->queryf(
'
854 SELECT * FROM frm_posts
855 WHERE pos_thr_fk = %s',
856 array(
'integer'), array($p_node[
'tree']));
858 while ($posrec =
$ilDB->fetchAssoc($posset))
860 include_once(
"./Services/News/classes/class.ilNewsItem.php");
862 "frm", $posrec[
"pos_pk"],
"pos");
866 $news_item->delete();
871 include_once
'Services/MediaObjects/classes/class.ilObjMediaObject.php';
873 foreach(
$mobs as $mob)
890 $statement =
$ilDB->manipulateF(
'
891 DELETE FROM frm_posts
892 WHERE pos_thr_fk = %s',
893 array(
'integer'), array($p_node[
'tree']));
900 for ($i = 0; $i < $dead_pos; $i++)
902 $statement =
$ilDB->manipulateF(
'
903 DELETE FROM frm_posts
905 array(
'integer'), array($del_id[$i]));
908 include_once(
"./Services/News/classes/class.ilNewsItem.php");
910 "frm", $del_id[$i],
"pos");
914 $news_item->delete();
919 include_once
'Services/MediaObjects/classes/class.ilObjMediaObject.php';
921 foreach(
$mobs as $mob)
937 $statement =
$ilDB->manipulateF(
'
939 SET thr_num_posts = thr_num_posts - %s
941 array(
'integer',
'integer'),
942 array($dead_pos, $p_node[
'tree']));
946 $res1 =
$ilDB->queryf(
'
947 SELECT * FROM frm_posts
948 WHERE pos_thr_fk = %s
949 ORDER BY pos_date DESC',
950 array(
'integer'), array($p_node[
'tree']));
952 if ($res1->numRows() == 0)
960 while ($selData =
$ilDB->fetchAssoc($res1))
967 $lastPost_thr = $selData[
"pos_top_fk"].
"#".$selData[
"pos_thr_fk"].
"#".$selData[
"pos_pk"];
972 $statement =
$ilDB->manipulateF(
'
974 SET thr_last_post = %s
976 array(
'text',
'integer'), array($lastPost_thr, $p_node[
'tree']));
980 $statement =
$ilDB->manipulateF(
'
982 SET top_num_posts = top_num_posts - %s
983 WHERE top_frm_fk = %s',
984 array(
'integer',
'integer'), array($dead_pos, $this->
id));
988 $res2 =
$ilDB->queryf(
'
989 SELECT * FROM frm_posts, frm_data
990 WHERE pos_top_fk = top_pk
992 ORDER BY pos_date DESC',
993 array(
'integer'), array($this->
id));
995 if ($res2->numRows() == 0)
1003 while ($selData =
$ilDB->fetchAssoc($res2))
1010 $lastPost_top = $selData[
"pos_top_fk"].
"#".$selData[
"pos_thr_fk"].
"#".$selData[
"pos_pk"];
1015 $statement =
$ilDB->manipulateF(
'
1017 SET top_last_post = %s
1018 WHERE top_frm_fk = %s',
1019 array(
'text',
'integer'), array($lastPost_top, $this->
id));
1031 public function getAllThreads($a_topic_id, array
$params = array(), $limit = 0, $offset = 0)
1040 $frm_overview_setting = (int)$ilSetting::_lookupValue(
'frma',
'forum_overview');
1043 $excluded_ids_condition =
'';
1046 $excluded_ids_condition =
' AND ' .
$ilDB->in(
'thr_pk',
$params[
'excluded_ids'],
true,
'integer').
' ';
1049 if(!in_array(strtolower(
$params[
'order_column']), array(
'lp_date',
'rating')))
1051 $params[
'order_column'] =
'post_date';
1053 if(!in_array(strtolower(
$params[
'order_direction']), array(
'asc',
'desc')))
1055 $params[
'order_direction'] =
'desc';
1059 $query =
"SELECT COUNT(thr_pk) cnt
1061 WHERE thr_top_fk = %s {$excluded_ids_condition}";
1064 $cnt = (int)
$data[
'cnt'];
1069 $data_types = array();
1072 $active_inner_query =
'';
1073 $is_post_activation_enabled = $frm_props->isPostActivationEnabled();
1074 if($is_post_activation_enabled && !
$params[
'is_moderator'])
1076 $active_query =
' AND (pos_status = %s OR pos_author_id = %s) ';
1077 $active_inner_query =
' AND (ipos.pos_status = %s OR ipos.pos_author_id = %s) ';
1080 $optional_fields =
'';
1081 if($frm_props->isIsThreadRatingEnabled())
1083 $optional_fields =
',avg_rating';
1085 if($frm_props->getThreadSorting() == 1)
1087 $optional_fields =
',thread_sorting';
1090 $additional_sort =
'';
1091 if($frm_props->getThreadSorting())
1093 $additional_sort .=
' ,thread_sorting ASC ';
1096 $dynamic_columns = array(
1097 ' ,post_date ' .
$params[
'order_direction']
1099 if($frm_props->isIsThreadRatingEnabled())
1101 $dynamic_columns[] =
' ,avg_rating ' .
$params[
'order_direction'];
1103 if(
'rating' == strtolower(
$params[
'order_column']))
1105 $dynamic_columns = array_reverse($dynamic_columns);
1107 $additional_sort .= implode(
' ', $dynamic_columns);
1112 (CASE WHEN COUNT(DISTINCT(notification_id)) > 0 THEN 1 ELSE 0 END) usr_notification_is_enabled,
1113 MAX(pos_date) post_date,
1114 COUNT(DISTINCT(pos_pk)) num_posts,
1115 COUNT(DISTINCT(pos_pk)) - COUNT(DISTINCT(postread.post_id)) num_unread_posts, ";
1121 (SELECT COUNT(DISTINCT(ipos.pos_pk))
1123 LEFT JOIN frm_user_read iread ON iread.post_id = ipos.pos_pk AND iread.usr_id = %s
1124 LEFT JOIN frm_thread_access iacc ON (iacc.thread_id = ipos.pos_thr_fk AND iacc.usr_id = %s)
1125 WHERE ipos.pos_thr_fk = thr_pk
1127 AND (ipos.pos_update > iacc.access_old_ts
1129 (iacc.access_old IS NULL AND (ipos.pos_update > " .
$ilDB->quote(date(
'Y-m-d H:i:s', NEW_DEADLINE),
'timestamp') .
"))
1132 AND ipos.pos_author_id != %s
1133 AND iread.usr_id IS NULL $active_inner_query
1137 $query .=
" thr_pk, thr_top_fk, thr_subject, thr_author_id, thr_display_user_id, thr_usr_alias, thr_num_posts, thr_last_post, thr_date, thr_update, visits, frm_threads.import_name, is_sticky, is_closed
1141 LEFT JOIN frm_notification
1142 ON frm_notification.thread_id = thr_pk
1143 AND frm_notification.user_id = %s
1146 ON pos_thr_fk = thr_pk $active_query
1148 LEFT JOIN frm_user_read postread
1149 ON postread.post_id = pos_pk
1150 AND postread.usr_id = %s";
1152 $query .=
" WHERE thr_top_fk = %s
1153 {$excluded_ids_condition}
1154 GROUP BY thr_pk, thr_top_fk, thr_subject, thr_author_id, thr_display_user_id, thr_usr_alias, thr_num_posts, thr_last_post, thr_date, thr_update, visits, frm_threads.import_name, is_sticky, is_closed
1156 ORDER BY is_sticky DESC {$additional_sort}, thr_date DESC";
1162 $data_types[] =
'integer';
1163 $data_types[] =
'integer';
1164 $data_types[] =
'integer';
1165 if($is_post_activation_enabled && !
$params[
'is_moderator'])
1167 array_push($data_types,
'integer',
'integer');
1170 $data_types[] =
'integer';
1171 if($is_post_activation_enabled && !
$params[
'is_moderator'])
1173 array_push($data_types,
'integer',
'integer');
1175 $data_types[] =
'integer';
1176 $data_types[] =
'integer';
1184 if($is_post_activation_enabled && !
$params[
'is_moderator'])
1190 if($is_post_activation_enabled && !
$params[
'is_moderator'])
1195 $data[] = $a_topic_id;
1200 0 usr_notification_is_enabled,
1201 MAX(pos_date) post_date,
1202 COUNT(DISTINCT(pos_pk)) num_posts,
1203 COUNT(DISTINCT(pos_pk)) num_unread_posts,
1204 COUNT(DISTINCT(pos_pk)) num_new_posts,
1205 thr_pk, thr_top_fk, thr_subject, thr_author_id, thr_display_user_id, thr_usr_alias, thr_num_posts, thr_last_post, thr_date, thr_update, visits, frm_threads.import_name, is_sticky, is_closed
1210 ON pos_thr_fk = thr_pk $active_query";
1212 $query .=
" WHERE thr_top_fk = %s
1213 {$excluded_ids_condition}
1214 GROUP BY thr_pk, thr_top_fk, thr_subject, thr_author_id, thr_display_user_id, thr_usr_alias, thr_num_posts, thr_last_post, thr_date, thr_update, visits, frm_threads.import_name, is_sticky, is_closed
1216 ORDER BY is_sticky DESC {$additional_sort}, thr_date DESC";
1218 if($is_post_activation_enabled && !
$params[
'is_moderator'])
1220 array_push($data_types,
'integer',
'integer');
1222 $data_types[] =
'integer';
1223 if($is_post_activation_enabled && !
$params[
'is_moderator'])
1227 $data[] = $a_topic_id;
1230 if($limit || $offset)
1232 $ilDB->setLimit($limit, $offset);
1238 $thread->assignData(
$row);
1239 $threads[] = $thread;
1243 'items' => $threads,
1252 $statistic = array();
1254 $data_types = array();
1257 $query =
"SELECT COUNT(f.pos_display_user_id) ranking, u.login, p.value, u.lastname, u.firstname
1259 INNER JOIN frm_posts_tree t
1260 ON f.pos_pk = t.pos_fk
1261 INNER JOIN frm_threads th
1262 ON t.thr_fk = th.thr_pk
1263 INNER JOIN usr_data u
1264 ON u.usr_id = f.pos_display_user_id
1265 INNER JOIN frm_data d
1266 ON d.top_pk = f.pos_top_fk
1267 LEFT JOIN usr_pref p
1268 ON p.usr_id = u.usr_id AND p.keyword = %s
1271 array_push($data_types,
'text');
1272 array_push(
$data,
'public_profile');
1276 $query .=
' AND (pos_status = %s
1278 AND pos_author_id = %s ))';
1280 array_push($data_types,
'integer',
'integer',
'integer');
1284 $query .=
' AND d.top_frm_fk = %s
1285 GROUP BY pos_display_user_id, u.login, p.value,u.lastname, u.firstname';
1287 array_push($data_types,
'integer');
1297 $statistic[$counter][] =
$row[
'ranking'];
1298 $statistic[$counter][] =
$row[
'login'];
1302 if(!
$ilUser->isAnonymous() && in_array(
$row[
'value'], array(
'y',
'g')) ||
1305 $lastname =
$row[
'lastname'];
1306 $firstname =
$row[
'firstname'];
1309 $statistic[$counter][] = $lastname;
1310 $statistic[$counter][] = $firstname;
1315 return is_array($statistic) ? $statistic : array();
1331 SELECT * FROM frm_posts_tree
1333 AND parent_pos = %s',
1334 array(
'integer',
'integer'), array($a_thread_id,
'0'));
1338 return $row->pos_fk ?
$row->pos_fk : 0;
1365 $role_arr = $rbacreview->getRolesOfRoleFolder($a_ref_id);
1367 foreach ($role_arr as $role_id)
1371 if ($title ==
"il_frm_moderator_".$a_ref_id)
1373 #return $rbacreview->assignedUsers($roleObj->getId());
1374 return $title = $rbacreview->assignedUsers($role_id);
1391 if(!self::$moderators_by_ref_id_map[$a_ref_id])
1395 return in_array($a_usr_id, self::$moderators_by_ref_id_map[$a_ref_id]);
1410 SELECT * FROM frm_data
1411 INNER JOIN frm_posts ON pos_top_fk = top_pk
1412 WHERE top_frm_fk = %s
1413 AND pos_author_id = %s',
1414 array(
'integer',
'integer'),
1417 return $res->numRows();
1425 SELECT * FROM frm_data
1426 INNER JOIN frm_posts ON pos_top_fk = top_pk
1427 WHERE top_frm_fk = %s
1428 AND (pos_status = %s
1430 AND pos_author_id = %s
1433 AND pos_author_id = %s',
1434 array(
'integer',
'integer',
'integer',
'integer',
'integer'),
1435 array($this->
getForumId(),
'1',
'0', $ilUser->getId(), $a_user_id));
1437 return $res->numRows();
1458 public function addPostTree($a_tree_id, $a_node_id = -1, $a_date =
'')
1462 $a_date = $a_date ? $a_date : date(
"Y-m-d H:i:s");
1464 if ($a_node_id <= 0)
1466 $a_node_id = $a_tree_id;
1469 $nextId =
$ilDB->nextId(
'frm_posts_tree');
1471 $statement =
$ilDB->manipulateF(
'
1472 INSERT INTO frm_posts_tree
1482 VALUES(%s, %s, %s, %s, %s, %s, %s, %s )',
1483 array(
'integer',
'integer',
'integer',
'integer',
'integer',
'integer',
'integer',
'timestamp'),
1484 array($nextId, $a_tree_id, $a_node_id,
'0',
'1',
'2',
'1', $a_date));
1500 $a_date = $a_date ? $a_date : date(
"Y-m-d H:i:s");
1503 $sql_res =
$ilDB->queryf(
'
1504 SELECT * FROM frm_posts_tree
1507 array(
'integer',
'integer'),
1508 array($a_parent_id, $tree_id));
1518 $statement =
$ilDB->manipulateF(
'
1519 UPDATE frm_posts_tree
1531 array(
'integer',
'integer',
'integer'),
1532 array($left, $left, $tree_id));
1534 $depth = $this->
getPostDepth($a_parent_id, $tree_id) + 1;
1537 $nextId =
$ilDB->nextId(
'frm_posts_tree');
1538 $statement =
$ilDB->manipulateF(
'
1539 INSERT INTO frm_posts_tree
1549 VALUES(%s,%s,%s, %s, %s, %s,%s, %s)',
1550 array(
'integer',
'integer',
'integer',
'integer',
'integer',
'integer',
'integer',
'timestamp'),
1576 $sql_res =
$ilDB->queryf(
'
1577 SELECT depth FROM frm_posts_tree
1580 array(
'integer',
'integer'),
1581 array($a_node_id, $tree_id));
1604 SELECT * FROM frm_posts, frm_posts_tree
1605 WHERE pos_pk = pos_fk
1608 array(
'integer',
'integer'),
1609 array(
'0', $tree_id));
1627 SELECT * FROM frm_posts, frm_posts_tree
1628 WHERE pos_pk = pos_fk
1648 require_once(
'./Services/User/classes/class.ilObjUser.php');
1652 $tmp_user =
new ilObjUser($a_row->pos_display_user_id);
1653 $fullname = $tmp_user->getFullname();
1654 $loginname = $tmp_user->getLogin();
1657 $fullname = $fullname ? $fullname : ($a_row->import_name ? $a_row->import_name :
$lng->txt(
"unknown"));
1660 "pos_pk" => $a_row->pos_pk,
1661 "child" => $a_row->pos_pk,
1662 "author" => $a_row->pos_display_user_id,
1663 "alias" => $a_row->pos_usr_alias,
1664 "title" => $fullname,
1665 "loginname" => $loginname,
1667 "message" => $a_row->pos_message,
1668 "subject" => $a_row->pos_subject,
1669 "pos_cens_com" => $a_row->pos_cens_com,
1670 "pos_cens" => $a_row->pos_cens,
1672 "date" => $a_row->fpt_date,
1673 "create_date" => $a_row->pos_date,
1674 "update" => $a_row->pos_update,
1675 "update_user" => $a_row->update_user,
1676 "tree" => $a_row->thr_fk,
1677 "parent" => $a_row->parent_pos,
1678 "lft" => $a_row->lft,
1679 "rgt" => $a_row->rgt,
1680 "depth" => $a_row->depth,
1681 "id" => $a_row->fpt_pk,
1682 "notify" => $a_row->notify,
1683 "import_name" => $a_row->import_name,
1684 "pos_status" => $a_row->pos_status
1705 SELECT * FROM frm_posts_tree
1708 AND parent_pos = %s',
1709 array(
'integer',
'integer',
'integer'),
1710 array($a_node[
'tree'], $a_node[
'pos_pk'], $a_node[
'parent']));
1714 $a_node[
"lft"] =
$row->lft;
1715 $a_node[
"rgt"] =
$row->rgt;
1718 $diff = $a_node[
"rgt"] - $a_node[
"lft"] + 1;
1722 SELECT * FROM frm_posts_tree
1723 WHERE lft BETWEEN %s AND %s
1725 array(
'integer',
'integer',
'integer'),
1726 array($a_node[
'lft'], $a_node[
'rgt'], $a_node[
'tree']));
1732 $del_id[] = $treeData[
"pos_fk"];
1736 $statement =
$ilDB->manipulateF(
'
1737 DELETE FROM frm_posts_tree
1738 WHERE lft BETWEEN %s AND %s
1740 array(
'integer',
'integer',
'integer'),
1741 array($a_node[
'lft'], $a_node[
'rgt'], $a_node[
'tree']));
1745 $statement =
$ilDB->manipulateF(
'
1746 UPDATE frm_posts_tree
1758 array(
'integer',
'integer',
'integer',
'integer',
'integer'),
1759 array($a_node[
'lft'], $diff, $a_node[
'lft'], $diff, $a_node[
'tree']));
1775 $checkTime = time() - (60*60);
1777 if (
$_SESSION[
"frm_visit_".$this->dbTable.
"_".$ID] < $checkTime)
1780 $_SESSION[
"frm_visit_".$this->dbTable.
"_".$ID] = time();
1781 $query =
'UPDATE '.$this->dbTable.
' SET visits = visits + 1 WHERE ';
1783 $data_type = array();
1784 $data_value = array();
1792 $res = $ilDB->queryf(
$query, $data_type, $data_value);
1808 if($type ==
'export')
1810 $this->replQuote1 =
"<blockquote class=\"quote\"><hr size=\"1\" color=\"#000000\">";
1811 $this->replQuote2 =
"<hr size=\"1\" color=\"#000000\"/></blockquote>";
1817 $lname = ($quote_user !=
"")
1818 ?
'="'.$quote_user.
'"'
1821 $text =
"[quote$lname]".$text.
"[/quote]";
1826 $startZ = substr_count (
$text,
"[quote");
1827 $endZ = substr_count (
$text,
"[/quote]");
1829 if ($startZ > 0 || $endZ > 0)
1832 if ($startZ > $endZ)
1834 $diff = $startZ - $endZ;
1836 for ($i = 0; $i < $diff; $i++)
1839 else $text .=
"[/quote]";
1842 elseif ($startZ < $endZ)
1844 $diff = $endZ - $startZ;
1846 for ($i = 0; $i < $diff; $i++)
1848 if ($type ==
'export')
$text = $this->txtQuote1.$text;
1849 else $text =
"[quote]".$text;
1855 $ws=
"[ \t\r\f\v\n]*";
1857 $text = eregi_replace(
"\[(quote$ws=$ws\"([^\"]*)\"$ws)\]",
1858 $this->replQuote1.
'<div class="ilForumQuoteHead">'.
$lng->txt(
"quote").
" (\\2)".
'</div>',
$text);
1860 $text = str_replace(
"[quote]",
1861 $this->replQuote1.
'<div class="ilForumQuoteHead">'.
$lng->txt(
"quote").
'</div>',
$text);
1863 $text = str_replace(
"[/quote]", $this->replQuote2,
$text);
1868 if($type !=
'export')
1898 SELECT frm_data.* FROM frm_data, frm_posts
1900 AND pos_top_fk = top_pk',
1901 array(
'integer'), array($pos_pk));
1911 if(!is_array($a_ids))
1915 include_once
"./Modules/Forum/classes/class.ilFileDataForum.php";
1918 foreach($a_ids as $pos_id)
1920 $tmp_file_obj->setPosId($pos_id);
1921 $files = $tmp_file_obj->getFilesOfPost();
1922 foreach($files as
$file)
1924 $tmp_file_obj->unlinkFile(
$file[
"name"]);
1927 unset($tmp_file_obj);
1933 return $this->import_name;
1937 $this->import_name = $a_import_name;
1955 SELECT frm_notification.thread_id FROM frm_data, frm_notification, frm_threads
1956 WHERE frm_notification.user_id = %s
1957 AND frm_notification.thread_id = frm_threads.thr_pk
1958 AND frm_threads.thr_top_fk = frm_data.top_pk
1959 AND frm_data.top_frm_fk = %s
1960 GROUP BY frm_notification.thread_id',
1961 array(
'integer',
'integer'),
1962 array($user_id, $this->
id));
1964 if (is_object(
$res) &&
$res->numRows() > 0)
1966 $thread_data = array();
1967 $thread_data_types = array();
1969 $query =
' DELETE FROM frm_notification
1971 AND thread_id IN (';
1973 array_push($thread_data, $user_id);
1974 array_push($thread_data_types,
'integer');
1980 if($counter < $res->numRows())
1983 array_push($thread_data,
$row[
'thread_id']);
1984 array_push($thread_data_types,
'integer');
1987 if($counter ==
$res->numRows())
1990 array_push($thread_data,
$row[
'thread_id']);
1991 array_push($thread_data_types,
'integer');
1997 $statement =
$ilDB->manipulateF(
$query, $thread_data_types, $thread_data);
2002 $nextId =
$ilDB->nextId(
'frm_notification');
2004 $statement =
$ilDB->manipulateF(
'
2005 INSERT INTO frm_notification
2010 VALUES(%s, %s, %s)',
2011 array(
'integer',
'integer',
'integer'),
2012 array($nextId, $user_id, $this->
id));
2029 $statement =
$ilDB->manipulateF(
'
2030 DELETE FROM frm_notification
2033 array(
'integer',
'integer'),
2034 array($user_id, $this->
id));
2049 $result =
$ilDB->queryf(
'SELECT COUNT(*) cnt FROM frm_notification WHERE user_id = %s AND frm_id = %s',
2050 array(
'integer',
'integer'), array($user_id, $this->
id));
2054 return (
bool)$record[
'cnt'];
2073 $nextId =
$ilDB->nextId(
'frm_notification');
2074 $statement =
$ilDB->manipulateF(
'
2075 INSERT INTO frm_notification
2080 VALUES (%s, %s, %s)',
2081 array(
'integer',
'integer',
'integer'), array($nextId, $user_id, $thread_id));
2100 SELECT COUNT(*) cnt FROM frm_notification
2102 AND thread_id = %s',
2103 array(
'integer',
'integer'),
2104 array($user_id, $thread_id));
2109 return (
bool)$record[
'cnt'];
2124 public static function _getThreads($a_obj_id,$a_sort_mode = self::SORT_DATE)
2128 switch($a_sort_mode)
2136 $sort =
'thr_subject';
2141 SELECT * FROM frm_threads
2142 JOIN frm_data ON top_pk = thr_top_fk
2143 WHERE top_frm_fk = %s
2145 array(
'integer',
'text'), array($a_obj_id, $sort));
2149 $threads[
$row->thr_pk] =
$row->thr_subject;
2151 return $threads ? $threads : array();
2159 SELECT top_frm_fk FROM frm_data
2161 array(
'integer'), array($a_for_id));
2165 return $fdata[
"top_frm_fk"];
2175 $res2 =
$ilDB->queryf(
'
2176 SELECT pos_top_fk, pos_thr_fk, pos_pk FROM frm_posts, frm_data
2177 WHERE pos_top_fk = top_pk
2179 ORDER BY pos_date DESC',
2180 array(
'integer'), array($a_obj_id));
2182 if ($res2->numRows() == 0)
2190 while ($selData =
$ilDB->fetchAssoc($res2))
2197 $lastPost_top = $selData[
"pos_top_fk"].
"#".$selData[
"pos_thr_fk"].
"#".$selData[
"pos_pk"];
2202 $ilDB->update(
'frm_data',
2203 array(
'top_last_post' => array(
'text', $lastPost_top)),
2204 array(
'top_frm_fk' => array(
'integer', $a_obj_id))
2218 $source_thread_obj =
new ilForumTopic((
int)$source_id);
2221 if($source_thread_obj->getForumId() != $target_thread_obj->getForumId())
2223 throw new ilException(
'not_allowed_to_merge_into_another_forum');
2226 if($source_thread_obj->getCreateDate() > $target_thread_obj->getCreateDate())
2228 $merge_thread_source = $source_thread_obj;
2229 $merge_thread_target = $target_thread_obj;
2233 $merge_thread_source = $target_thread_obj;
2234 $merge_thread_target = $source_thread_obj;
2237 $thread_subject = $target_thread_obj->getSubject();
2240 $targed_was_closed = $merge_thread_target->isClosed();
2242 $merge_thread_source->close();
2244 if($targed_was_closed ==
false)
2246 $merge_thread_target->close();
2249 $source_all_posts = $merge_thread_source->getAllPosts();
2250 $source_root_node = $merge_thread_source->getFirstPostNode();
2251 $target_root_node = $merge_thread_target->getFirstPostNode();
2253 $add_difference = $target_root_node->getRgt();
2256 include_once
'Modules/Forum/classes/class.ilForumPostsTree.php';
2258 $new_target_rgt = ($target_root_node->getRgt() + $source_root_node->getRgt());
2261 $new_target_root = $target_root_node->getId();
2264 foreach($source_all_posts as $post)
2269 $posts_tree_obj->setPosFk($post->pos_pk);
2271 if($post_obj->getParentId() == 0)
2273 $posts_tree_obj->setParentPos($new_target_root);
2276 $posts_tree_obj->setRgt(($post_obj->getRgt() + $add_difference) - 1);
2277 $posts_tree_obj->setLft($target_root_node->getRgt());
2279 $posts_tree_obj->setDepth(($post_obj->getDepth() + 1));
2280 $posts_tree_obj->setSourceThreadId($merge_thread_source->getId());
2282 $posts_tree_obj->setTargetThreadId($merge_thread_target->getId());
2284 $posts_tree_obj->mergeParentPos();
2288 $posts_tree_obj->setRgt(($post_obj->getRgt() + $add_difference) - 1);
2289 $posts_tree_obj->setLft(($post_obj->getLft() + $add_difference) - 1);
2291 $posts_tree_obj->setDepth(($post_obj->getDepth() + 1));
2292 $posts_tree_obj->setSourceThreadId($merge_thread_source->getId());
2294 $posts_tree_obj->setParentPos($post_obj->getParentId());
2295 $posts_tree_obj->setTargetThreadId($merge_thread_target->getId());
2297 $posts_tree_obj->merge();
2302 include_once
'Modules/Forum/classes/class.ilForumPost.php';
2306 include_once
'Modules/Forum/classes/class.ilForumNotification.php';
2310 include_once
'./Modules/Forum/classes/class.ilObjForum.php';
2311 ilObjForum::_deleteAccessEntries($merge_thread_source->getId());
2317 $post_date_source = $merge_thread_source->getLastPost()->getCreateDate();
2318 $post_date_target = $merge_thread_target->getLastPost()->getCreateDate();
2320 $target_last_post = $merge_thread_target->getLastPostString();
2321 $exp = explode(
'#', $target_last_post);
2323 if($post_date_source > $post_date_target)
2325 $exp[2] = $merge_thread_source->getLastPost()->getId();
2329 $exp[2] = $merge_thread_target->getLastPost()->getId();
2331 $new_thr_last_post = implode(
'#', $exp);
2333 $num_posts_source = (int)$merge_thread_source->getNumPosts();
2334 $num_visits_source = (int)$merge_thread_source->getVisits();
2335 $num_posts_target = (int)$merge_thread_target->getNumPosts();
2336 $num_visits_target = (int)$merge_thread_source->getVisits();
2339 $frm_topic_obj->setNumPosts(($num_posts_source + $num_posts_target));
2340 $frm_topic_obj->setVisits(($num_visits_source + $num_visits_target));
2341 $frm_topic_obj->setLastPostString($new_thr_last_post);
2342 $frm_topic_obj->setSubject($thread_subject);
2343 $frm_topic_obj->setId($merge_thread_target->getId());
2345 $frm_topic_obj->updateMergedThread();
2351 if(!$targed_was_closed)
2353 $merge_thread_target->reopen();
static formatDate(ilDateTime $date)
Format a date @access public.
@classDescription Date and time handling
Base class for ILIAS Exception handling.
This class handles all operations on files for the forum object.
static mergeThreadNotificiations($merge_source_thread_id, $merge_target_thread_id)
static mergePosts($source_thread_id, $target_thread_id)
static updateTargetRootRgt($root_node_id, $rgt)
const FORUM_OVERVIEW_WITH_NEW_POSTS
static getInstance($a_obj_id=0)
static deleteByThreadId($thr_id)
Class Forum core functions for forum.
countUserArticles($a_user_id)
get number of articles from given user-ID
getOnePost($post)
get one post-dataset
disableForumNotification($user_id)
Disable a user's notification about new posts in this forum.
generateThread($forum_id, $author_id, $display_user_id, $subject, $message, $notify, $notify_posts, $alias='', $date='', $status=1)
generate new dataset in frm_threads
getFirstPostNode($tree_id)
get data of the first node from frm_posts_tree and frm_posts @access public
fetchPostNodeData($a_row)
get data of parent node from frm_posts_tree and frm_posts @access private
countActiveUserArticles($a_user_id)
deletePostTree($a_node)
delete node and the whole subtree under this node @access public
__deletePostFiles($a_ids)
addPostTree($a_tree_id, $a_node_id=-1, $a_date='')
create a new post-tree
enableThreadNotification($user_id, $thread_id)
Enable a user's notification about new posts in a thread.
__construct()
Constructor @access public.
setForumId($a_obj_id)
set object id which refers to ILIAS obj_id
updateVisits($ID)
update page hits of given forum- or thread-ID @access public
getPostNode($post_id)
get data of given node from frm_posts_tree and frm_posts @access public
static $moderators_by_ref_id_map
setImportName($a_import_name)
getPostDepth($a_node_id, $tree_id)
Return depth of an object @access private.
_getModerators($a_ref_id)
get all users assigned to local role il_frm_moderator_<frm_ref_id> (static)
static _isModerator($a_ref_id, $a_usr_id)
checks whether a user is moderator of a given forum object
getOneTopic()
get one topic-dataset by WhereCondition
prepareText($text, $edit=0, $quote_user='', $type='')
prepares given string @access public
getForumId()
get forum id @access public
postCensorship($message, $pos_pk, $cens=0)
update dataset in frm_posts with censorship info
generatePost($forum_id, $thread_id, $author_id, $display_user_id, $message, $parent_pos, $notify, $subject='', $alias='', $date='', $status=1, $send_activation_mail=0)
generate new dataset in frm_posts
static updateLastPostByObjId($a_obj_id)
static _getLanguageInstanceByUsrId($usr_id)
Get the ilLanguage instance for the passed user id.
convertDate($date)
converts the date format
isThreadNotificationEnabled($user_id, $thread_id)
Check whether a user's notification about new posts in a thread is enabled (result > 0) or not (resul...
moveThreads($thread_ids=array(), $src_ref_id=0, $dest_top_frm_fk=0)
Moves all chosen threads and their posts to a new forum.
getMDB2Query()
get content of additional condition
deletePost($post)
delete post and sub-posts
getOneThread()
get one thread-dataset by WhereCondition
setOrderField($orderField)
set database field for sorting results
getDbTable()
get name of database table
getPageHits()
get number of max.
getModeratorFromPost($pos_pk)
get one post-dataset
setMDB2WhereCondition($query_string, $data_type, $data_value)
set content for additional condition
static _getThreads($a_obj_id, $a_sort_mode=self::SORT_DATE)
Get thread infos of object.
getUserStatistic($is_moderator=false)
static mergeThreads($obj_id, $source_id, $target_id)
isForumNotificationEnabled($user_id)
Check whether a user's notification about new posts in this forum is enabled (result > 0) or not (res...
getMDB2DataType()
get content of additional condition
static _lookupObjIdForForumId($a_for_id)
getFirstPostByThread($a_thread_id)
Get first post of thread.
setForumRefId($a_ref_id)
set reference id which refers to ILIAS obj_id
enableForumNotification($user_id)
Enable a user's notification about new posts in this forum.
getMDB2DataValue()
/* get content of additional condition
getModerators()
get all users assigned to local role il_frm_moderator_<frm_ref_id>
getForumRefId()
get forum ref_id @access public
setDbTable($dbTable)
set database table
getOrderField()
get name of orderField
_lookupPostMessage($a_id)
insertPostNode($a_node_id, $a_parent_id, $tree_id, $a_date='')
insert node under parent node @access public
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.
static mergeForumUserRead($merge_source_thread_id, $merge_target_thread_id)
static _lookupLanguage($a_usr_id)
getInstanceByRefId($a_ref_id, $stop_on_error=true)
get an instance of an Ilias object by reference id
static _lookupTitle($a_id)
lookup object title
static _lookupObjectId($a_ref_id)
lookup object id
static _exists($a_id, $a_reference=false, $a_type=null)
checks if an object exists in object_data@access public
static _replaceMediaObjectImageSrc($a_text, $a_direction=0, $nic=IL_INST_ID)
replaces image source from mob image urls with the mob id or replaces mob id with the correct image s...
static insertLatexImages($a_text, $a_start="\[tex\]", $a_end="\[\/tex\]")
replace [text]...[/tex] tags with formula image code
$GLOBALS['PHPCAS_CLIENT']
This global variable is used by the interface class phpCAS.
redirection script todo: (a better solution should control the processing via a xml file)