72    public function __construct($a_id = 0, $a_is_moderator = 
false, $preventImplicitRead = 
false)
 
   76        $this->is_moderator = $a_is_moderator;
 
   77        $this->db = 
$DIC->database();
 
   78        $this->
user = $DIC->user();
 
   81        if (!$preventImplicitRead) {
 
  101        $this->
setSticky((
int) $data[
'is_sticky']);
 
  102        $this->
setClosed((
int) $data[
'is_closed']);
 
  121        if ($this->forum_id) {
 
  122            $nextId = $this->db->nextId(
'frm_threads');
 
  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)
 
  161            $this->db->manipulateF(
 
  171                array(
'integer', 
'text',
'timestamp', 
'integer', 
'text', 
'float', 
'integer'),
 
  172                array(  $this->forum_id,
 
  177                        $this->last_post_string,
 
  178                        $this->average_rating,
 
  199            $res = $this->db->queryf(
 
  201                                SELECT frm_threads.*, top_frm_fk frm_obj_id 
  203                                INNER JOIN frm_data ON top_pk = thr_top_fk 
  211            if (is_object($row)) {
 
  212                $this->thr_pk = $row->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;
 
  246        return $this->
read();
 
  257        $res = $this->db->queryf(
 
  259                        SELECT * FROM frm_posts_tree  
  261                        AND parent_pos = %s',
 
  262            array(
'integer', 
'integer'),
 
  263            array($this->
id, 
'1')
 
  268        return $row->pos_fk ? $row->pos_fk : 0;
 
  278        $checkTime = time() - (60 * 60);
 
  280        if (
$_SESSION[
'frm_visit_frm_threads_' . $this->
id] < $checkTime) {
 
  283            $this->db->manipulateF(
 
  286                                SET     visits = visits + 1 
  305        $res = $this->db->queryf(
 
  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 ' : 
''),
 
  329        $res = $this->db->queryf(
 
  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)
 
  354        $res = $this->db->queryF(
 
  358                        INNER JOIN frm_posts_tree ON pos_fk = pos_pk 
  359                        WHERE parent_pos = %s 
  361            array(
'integer', 
'integer'),
 
  365        $row = $this->db->fetchAssoc(
$res);
 
  367        $post = 
new ilForumPost($row[
'pos_pk'], $isModerator, $preventImplicitRead);
 
  368        $post->assignData($row);
 
  382            $this->db->setLimit(1);
 
  383            $res = $this->db->queryf(
 
  387                                WHERE pos_thr_fk = %s                             
  388                                ORDER BY pos_date DESC',
 
  410            $this->db->setLimit(1);
 
  411            $res = $this->db->queryf(
 
  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())
 
  436            $res = $this->db->queryf(
 
  440                                WHERE pos_thr_fk = %s',
 
  446                $posts[$row->pos_pk] = $row;
 
  450        return is_array($posts) ? $posts : array();
 
  466        $data_types = array();
 
  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, 
  475                                                        WHEN fur.post_id IS NULL ' .
 
  476                                ($this->
user->getId() == ANONYMOUS_USER_ID ? 
' AND 1 = 2 ' : 
'') . 
' 
  480                                                        firstname, lastname, title, login 
  488                                ON                      pos_display_user_id  = usr_id 
  490                        LEFT JOIN               frm_user_read fur 
  491                                ON                      fur.thread_id = pos_thr_fk 
  492                                AND                     fur.post_id = pos_pk 
  495                        WHERE                   lft > %s AND lft < %s  
  498        array_push($data_types, 
'integer', 
'integer', 
'integer', 
'integer');
 
  501        if ($this->orderField != 
"") {
 
  508        while ($row = $this->db->fetchAssoc(
$res)) {
 
  509            $post = 
new ilForumPost($row[
'pos_pk'], 
false, 
true);
 
  510            $post->assignData($row);
 
  512            if (!$this->is_moderator) {
 
  513                if (!$post->isActivated() && $post->getPosAuthorId() != $this->user->getId()) {
 
  518            if ((
int) $row[
'pos_display_user_id']) {
 
  519                $usr_ids[(int) $row[
'pos_display_user_id']] = (
int) $row[
'pos_display_user_id'];
 
  521            if ((
int) $row[
'update_user']) {
 
  522                $usr_ids[(int) $row[
'update_user']] = (
int) $row[
'update_user'];
 
  543    public function movePosts($old_obj_id, $old_pk, $new_obj_id, $new_pk)
 
  547            if (is_array($nodes)) {
 
  548                $postsMoved = array();
 
  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);
 
  555                        if (
true === $moved) {
 
  556                            $postsMoved[] = array(
 
  557                                'from' => $old_obj_id,
 
  559                                'position_id' => (
int) $node->pos_pk
 
  566                    foreach ($postsMoved as $postedInformation) {
 
  567                        $file_obj = 
new ilFileDataForum($postedInformation[
'to'], $postedInformation[
'position_id']);
 
  568                        $file_obj->moveFilesOfPost($postedInformation[
'from']);
 
  577            $ilAtomQuery = $this->db->buildAtomQuery();
 
  578            $ilAtomQuery->addTableLock(
'frm_user_read');
 
  579            $ilAtomQuery->addTableLock(
'frm_thread_access');
 
  581            $ilAtomQuery->addQueryCallable(
function (
ilDBInterface $ilDB) use ($new_obj_id, $current_id) {
 
  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)
 
  594                                WHERE thread_id = %s',
 
  595                    array(
'integer', 
'integer'),
 
  596                    array($new_obj_id, $current_id)
 
  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)
 
  609                                UPDATE frm_thread_access 
  611                                WHERE thread_id =%s',
 
  612                    array(
'integer', 
'integer'),
 
  613                    array($new_obj_id, $current_id)
 
  619            $this->db->manipulateF(
 
  623                                WHERE pos_thr_fk = %s',
 
  624                array(
'integer', 
'integer'),
 
  625                array($new_pk, $this->
id)
 
  629            $posts = $this->db->queryf(
 
  631                                SELECT * FROM frm_posts WHERE pos_thr_fk = %s',
 
  648                $news_item->setContextObjId($new_obj_id);
 
  649                $news_item->update();
 
  653            return count($nodes);
 
  663        $is_post_activation_enabled = $objProperties->isPostActivationEnabled();
 
  665        if ($pos_id !== 
null) {
 
  666            $res = $this->db->queryF(
 
  668                                SELECT          lft, rgt, depth 
  672                array(
'integer', 
'integer'),
 
  673                array($pos_id, $this->
id)
 
  689                                                        fp.pos_display_user_id, 
  693                                                        fp.is_author_moderator, 
  696                                                        WHEN fur.post_id IS NULL ' .
 
  697                                ($this->
user->getId() == ANONYMOUS_USER_ID ? 
' AND 1 = 2 ' : 
'') . 
' 
  701                                                        COUNT(fpt2.pos_fk) children 
  703                        FROM                    frm_posts_tree fpt 
  705                        INNER JOIN              frm_posts fp 
  706                                ON                      fp.pos_pk = fpt.pos_fk 
  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 ';
 
  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') . 
' 
  720                        LEFT JOIN               usr_data ud 
  721                                ON                      ud.usr_id = fp.pos_display_user_id 
  723                        WHERE                   fpt.thr_fk = ' . $this->db->quote($this->id, 
'integer');
 
  726            $query .= 
'         AND fpt.lft > ' . $this->db->quote(
$data[
'lft'], 
'integer') .
 
  727                    '           AND fpt.lft < ' . $this->db->quote(
$data[
'rgt'], 
'integer') . 
' ';
 
  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') . 
') ';
 
  733        if (
$data && is_numeric($levels)) {
 
  734            $query .= 
' AND fpt.depth <= ' . $this->db->quote(
$data[
'depth'] + $levels, 
'integer') . 
' ';
 
  737        $query .= 
' GROUP BY fpt.depth, 
  746                                                        fp.pos_display_user_id, 
  750                                                        fp.is_author_moderator, 
  752                                        ORDER BY fpt.rgt DESC 
  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');
 
  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') . 
') ';
 
  765        $queryCounter .= 
' ORDER BY fpt.rgt DESC';
 
  767        $resCounter = $this->db->query($queryCounter);
 
  770        while ($row = $this->db->fetchAssoc($resCounter)) {
 
  771            $counter[$row[
'pos_fk']] = 
$i++;
 
  777        while ($row = $this->db->fetchAssoc(
$res)) {
 
  778            if ((
int) $row[
'pos_display_user_id']) {
 
  779                $usr_ids[] = (int) $row[
'pos_display_user_id'];
 
  782            $row[
'counter'] = $counter[$row[
'pos_pk']];
 
  799        if ($this->
id && $a_user_id) {
 
  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)
 
  808            while ($record = $this->db->fetchAssoc(
$result)) {
 
  809                return (
bool) $record[
'cnt'];
 
  826        if ($this->
id && $a_user_id) {
 
  828                $nextId = $this->db->nextId(
'frm_notification');
 
  829                $this->db->manipulateF(
 
  831                                        INSERT INTO frm_notification 
  837                    array(
'integer', 
'integer', 
'integer'),
 
  838                    array($nextId, $a_user_id, $this->
id)
 
  857        if ($this->
id && $a_user_id) {
 
  858            $this->db->manipulateF(
 
  860                                DELETE FROM frm_notification 
  863                array(
'integer', 
'integer'),
 
  864                array($a_user_id, $this->
id)
 
  881        if ($this->
id && !$this->is_sticky) {
 
  882            $this->db->manipulateF(
 
  887                array(
'integer', 
'integer'),
 
  888                array(
'1', $this->
id)
 
  891            $this->is_sticky = 1;
 
  907        if ($this->
id && $this->is_sticky) {
 
  908            $this->db->manipulateF(
 
  913                array(
'integer', 
'integer'),
 
  914                array(
'0', $this->
id)
 
  917            $this->is_sticky = 0;
 
  933        if ($this->
id && !$this->is_closed) {
 
  934            $this->db->manipulateF(
 
  939                array(
'integer', 
'integer'),
 
  940                array(
'1', $this->
id)
 
  943            $this->is_closed = 1;
 
  959        if ($this->
id && $this->is_closed) {
 
  960            $this->db->manipulateF(
 
  965                array(
'integer', 
'integer'),
 
  966                array(
'0', $this->
id)
 
  969            $this->is_closed = 0;
 
 1003        $this->forum_id = $a_forum_id;
 
 1011        $this->display_user_id = $a_user_id;
 
 1019        $this->user_alias = $a_user_alias;
 
 1027        $this->subject = $a_subject;
 
 1035        $this->createdate = $a_createdate;
 
 1043        if ($a_changedate == 
'0000-00-00 00:00:00') {
 
 1044            $this->changedate = 
null;
 
 1046            $this->changedate = $a_changedate;
 
 1055        $this->import_name = $a_import_name;
 
 1063        if ($a_last_post == 
'') {
 
 1064            $a_last_post = 
null;
 
 1067        $this->last_post_string = $a_last_post;
 
 1075        $this->visits = $a_visits;
 
 1083        $this->is_sticky = $a_sticky;
 
 1087        return $this->is_sticky == 1 ? true : 
false;
 
 1091        $this->is_closed = $a_closed;
 
 1095        return $this->is_closed == 1 ? true : 
false;
 
 1099        $this->orderField = $a_order_field;
 
 1107        $this->is_moderator = $bool;
 
 1157        if (is_object($row)) {
 
 1158            return $row->thr_subject;
 
 1168            array(
'thr_subject' => array(
'text',$this->
getSubject())),
 
 1169            array(
'thr_pk' => array(
'integer', $this->
getId()))
 
 1173        $first_node->setSubject($this->
getSubject());
 
 1174        $first_node->update();
 
 1183        $this->num_posts = $a_num_posts;
 
 1201        $this->num_new_posts = $num_new_posts;
 
 1210        return $this->num_new_posts;
 
 1219        $this->num_unread_posts = $num_unread_posts;
 
 1228        return $this->num_unread_posts;
 
 1237        $this->user_notification_enabled = $user_notification_enabled;
 
 1246        return $this->user_notification_enabled;
 
 1251        if (!in_array(strtoupper($direction), self::$possibleOrderDirections)) {
 
 1252            $direction = current(self::$possibleOrderDirections);
 
 1255        $this->orderDirection = $direction;
 
 1270            'SELECT thr_top_fk FROM frm_threads WHERE thr_pk = %s',
 
 1277        return $row[
'thr_top_fk'];
 
 1282        return $this->thread_sorting;
 
 1289                'thr_num_posts' => array(
'integer', $this->
getNumPosts()),
 
 1290                'visits' => array(
'integer', $this->
getVisits()),
 
 1292                'thr_subject' => array(
'text', $this->
getSubject())
 
 1294            array(
'thr_pk' => array(
'integer', $this->
getId()))
 
 1308            'SELECT thr_date FROM frm_threads WHERE thr_pk = %s',
 
 1310            array((
int) $thread_id)
 
 1315        return $row[
'thr_date'] ? $row[
'thr_date'] : 
'0000-00-00 00:00:00';
 
 1331        $this->last_post = $post;
 
An exception for terminatinating execution or to throw for unit testing.
This class handles all operations on files for the forum object.
Class to report exception.
static getInstance($a_obj_id=0)
static lookupForumIdByTopicId($a_topic_id)
reload()
Calls the private method read() to load the topic data from database into the object.
__construct($a_id=0, $a_is_moderator=false, $preventImplicitRead=false)
Constructor.
setOrderField($a_order_field)
setUserNotificationEnabled($user_notification_enabled)
setNumNewPosts($num_new_posts)
setThrAuthorId($thr_author_id)
isNotificationEnabled($a_user_id)
Check whether a user's notification about new posts in a thread is enabled (result > 0) or not (resul...
reopen()
Reopens the current topic.
static _lookupDate($thread_id)
unmakeSticky()
Sets the current topic non-sticky.
getPostTree(ilForumPost $a_post_node)
Fetches and returns an array of posts from the post tree, starting with the node object passed by the...
setOrderDirection($direction)
getUserNotificationEnabled()
setChangeDate($a_changedate)
updateVisits()
Updates the visit counter of the current topic.
setNumPosts($a_num_posts)
countPosts($ignoreRoot=false)
Fetches and returns the number of posts for the given user id.
update()
Updates an existing topic.
insert()
Inserts the object data into database.
setUserAlias($a_user_alias)
setDisplayUserId($a_user_id)
read()
Reads the data of the current object id from database and loads it into the object.
getNestedSetPostChildren($pos_id=null, $levels=null)
static _lookupTitle($a_topic_id)
Looks up the title/subject of a topic/thread.
setAverageRating($average_rating)
getFirstPostNode($isModerator=false, $preventImplicitRead=false)
Fetches and returns an object of the first post in the current topic.
setImportName($a_import_name)
getFirstPostId()
Fetches the primary key of the first post node of the current topic from database and returns it.
makeSticky()
Sets the current topic sticky.
movePosts($old_obj_id, $old_pk, $new_obj_id, $new_pk)
Moves all posts within the current thread to a new forum.
disableNotification($a_user_id)
Disable a user's notification about new posts in a thread.
getLastPostForThreadOverview()
setLastPostString($a_last_post)
getLastPost()
Fetches and returns an object of the last post in the current topic.
static $possibleOrderDirections
getLastActivePost()
Fetches and returns an object of the last active post in the current topic.
countActivePosts($ignoreRoot=false)
Fetches and returns the number of active posts for the given user id.
enableNotification($a_user_id)
Enable a user's notification about new posts in a thread.
setCreateDate($a_createdate)
setNumUnreadPosts($num_unread_posts)
close()
Closes the current topic.
setLastPostForThreadOverview(ilForumPost $post)
static _lookupObjIdForForumId($a_for_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.
foreach($_POST as $key=> $value) $res