00001 <?php
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00034 class ilForum
00035 {
00041 var $ilias;
00042 var $lng;
00043
00050 var $dbTable;
00051
00057 var $className="ilForum";
00058
00065 var $orderField;
00066
00067 var $whereCondition = "1";
00068
00069 var $txtQuote1 = "[quote]";
00070 var $txtQuote2 = "[/quote]";
00071 var $replQuote1 = '<blockquote class="ilForumQuote">';
00072 var $replQuote2 = '</blockquote>';
00073
00074
00075 var $pageHits = 30;
00076
00077
00078 var $id;
00079
00080 var $anonymized;
00081
00086 function ilForum()
00087 {
00088 global $ilias,$lng;
00089
00090 $this->ilias =& $ilias;
00091 $this->lng =& $lng;
00092 }
00093
00094 function setLanguage($lng)
00095 {
00096 $this->lng =& $lng;
00097 }
00098
00104 function setForumId($a_obj_id)
00105 {
00106 if (!isset($a_obj_id))
00107 {
00108 $message = get_class($this)."::setForumId(): No obj_id given!";
00109 $this->ilias->raiseError($message,$this->ilias->error_obj->WARNING);
00110 }
00111
00112 $this->id = $a_obj_id;
00113 }
00114
00120 function setForumRefId($a_ref_id)
00121 {
00122 if (!isset($a_ref_id))
00123 {
00124 $message = get_class($this)."::setForumRefId(): No ref_id given!";
00125 $this->ilias->raiseError($message,$this->ilias->error_obj->WARNING);
00126 }
00127
00128 $this->ref_id = $a_ref_id;
00129 }
00130
00136 function getForumId()
00137 {
00138 return $this->id;
00139 }
00140
00146 function getForumRefId()
00147 {
00148 return $this->ref_id;
00149 }
00150
00157 function setOrderField($orderField)
00158 {
00159 if ($orderField == "")
00160 {
00161 die($this->className . "::setOrderField(): No orderField given.");
00162 }
00163 else
00164 {
00165 $this->orderField = $orderField;
00166 }
00167 }
00168
00175 function getOrderField()
00176 {
00177 return $this->orderField;
00178 }
00179
00186 function setDbTable($dbTable)
00187 {
00188 if ($dbTable == "")
00189 {
00190 die($this->className . "::setDbTable(): No database table given.");
00191 }
00192 else
00193 {
00194 $this->dbTable = $dbTable;
00195 }
00196 }
00197
00204 function getDbTable()
00205 {
00206 return $this->dbTable;
00207 }
00208
00215 function setWhereCondition($whereCondition = "1")
00216 {
00217 $this->whereCondition = $whereCondition;
00218 return true;
00219 }
00220
00227 function getWhereCondition()
00228 {
00229 return $this->whereCondition;
00230 }
00231
00238 function setPageHits($pageHits)
00239 {
00240 if ($pageHits < 1)
00241 {
00242 die($this->className . "::setPageHits(): No int pageHits given.");
00243 }
00244 else
00245 {
00246 $this->pageHits = $pageHits;
00247 return true;
00248 }
00249 }
00250
00257 function getPageHits()
00258 {
00259 return $this->pageHits;
00260 }
00261
00262
00263
00269 function getOneDataset()
00270 {
00271
00272 $q = "SELECT * FROM ".$this->dbTable." WHERE ( ".$this->whereCondition." )";
00273
00274 if ($this->orderField != "")
00275 $q .= " ORDER BY ".$this->orderField;
00276
00277 $res = $this->ilias->db->getRow($q, DB_FETCHMODE_ASSOC);
00278
00279 $this->setWhereCondition("1");
00280
00281 return $res;
00282 }
00283
00289 function getOneTopic()
00290 {
00291 $query = "SELECT * FROM frm_data WHERE ( ".$this->whereCondition." )";
00292
00293 $result = $this->ilias->db->getRow($query, DB_FETCHMODE_ASSOC);
00294
00295 $this->setWhereCondition("1");
00296
00297 $result["top_name"] = trim(stripslashes($result["top_name"]));
00298 $result["top_description"] = nl2br(stripslashes($result["top_description"]));
00299
00300 return $result;
00301 }
00302
00307 function fixThreadNumber($a_top_pk, $a_num_threads)
00308 {
00309 global $ilDB;
00310
00311 if ($a_top_pk > 0)
00312 {
00313 $query = "UPDATE frm_data SET top_num_threads = ".
00314 $ilDB->quote($a_num_threads)." WHERE top_pk = ".
00315 $ilDB->quote($a_top_pk);
00316
00317 $ilDB->query($query);
00318 }
00319 }
00320
00324 function _lookupForumData($a_obj_id)
00325 {
00326 global $ilDB;
00327
00328 $query = "SELECT * FROM frm_data WHERE top_frm_fk = ".$ilDB->quote($a_obj_id);
00329
00330 $result = $ilDB->getRow($query, DB_FETCHMODE_ASSOC);
00331 $result["top_name"] = trim(stripslashes($result["top_name"]));
00332 $result["top_description"] = nl2br(stripslashes($result["top_description"]));
00333
00334 return $result;
00335 }
00336
00342 function getOneThread()
00343 {
00344 $query = "SELECT * FROM frm_threads WHERE ( ".$this->whereCondition." )";
00345
00346 $result = $this->ilias->db->getRow($query, DB_FETCHMODE_ASSOC);
00347
00348 $this->setWhereCondition("1");
00349
00350 $result["thr_subject"] = trim(stripslashes($result["thr_subject"]));
00351
00352 return $result;
00353 }
00354
00361 function getOnePost($post)
00362 {
00363 $q = "SELECT frm_posts.*, usr_data.lastname FROM frm_posts, usr_data WHERE ";
00364 $q .= "pos_pk = '".$post."' AND ";
00365 $q .= "pos_usr_id = usr_id";
00366
00367 $result = $this->ilias->db->getRow($q, DB_FETCHMODE_ASSOC);
00368
00369 $result["pos_date"] = $this->convertDate($result["pos_date"]);
00370 $result["pos_message"] = nl2br(stripslashes($result["pos_message"]));
00371
00372 return $result;
00373 }
00374
00375 function getPostById($a_id)
00376 {
00377 $query = "SELECT * FROM frm_posts WHERE pos_pk = '".$a_id."'";
00378
00379 $res = $this->ilias->db->query($query);
00380 while($row = $res->fetchRow(DB_FETCHMODE_ASSOC))
00381 {
00382 return $row;
00383 }
00384 return array();
00385 }
00386
00387 function _lookupPostMessage($a_id)
00388 {
00389 global $ilDB;
00390
00391 $query = "SELECT * FROM frm_posts WHERE pos_pk = '".$a_id."'";
00392 $res = $ilDB->query($query);
00393 while($row = $res->fetchRow(DB_FETCHMODE_OBJECT))
00394 {
00395 return $row->pos_message;
00396 }
00397 return '';
00398 }
00399
00400
00415 function generatePost($topic, $thread, $user, $message, $parent_pos,$notify,$anonymize,$subject,$date = "")
00416 {
00417 $date = $date ? $date : date("Y-m-d H:i:s");
00418 if ($anonymize == 1)
00419 {
00420 $user = 0;
00421 }
00422 $pos_data = array(
00423 "pos_top_fk" => $topic,
00424 "pos_thr_fk" => $thread,
00425 "pos_usr_id" => $user,
00426 "pos_message"=> strip_tags(addslashes($message)),
00427 "pos_subject" => addslashes($subject),
00428 "pos_date" => $date
00429 );
00430
00431
00432 $q = "INSERT INTO frm_posts ";
00433 $q .= "(pos_top_fk,pos_thr_fk,pos_usr_id,pos_message,pos_subject,pos_date,notify,import_name) ";
00434 $q .= "VALUES ";
00435 $q .= "('".$pos_data["pos_top_fk"]."','".$pos_data["pos_thr_fk"]."','".$pos_data["pos_usr_id"]."','";
00436 $q .= $pos_data["pos_message"]."','".$pos_data["pos_subject"]."','".$pos_data["pos_date"]."','".$notify."','";
00437 $q .= ilUtil::prepareDBString($this->getImportName())."')";
00438
00439 $result = $this->ilias->db->query($q);
00440
00441
00442 $lastInsert = $this->ilias->db->getLastInsertId();
00443 $pos_data["pos_pk"] = $lastInsert;
00444
00445
00446 if ($parent_pos == 0)
00447 {
00448 $this->addPostTree($thread, $lastInsert);
00449 }
00450 else
00451 {
00452 $this->insertPostNode($lastInsert,$parent_pos,$thread);
00453 }
00454
00455
00456 $lastPost = $topic."#".$thread."#".$lastInsert;
00457
00458
00459 $q = "UPDATE frm_threads SET thr_num_posts = thr_num_posts + 1, ";
00460 $q .= "thr_last_post = '".$lastPost. "' ";
00461 $q .= "WHERE thr_pk = '" . $thread . "'";
00462 $result = $this->ilias->db->query($q);
00463
00464
00465 $q = "UPDATE frm_data SET top_num_posts = top_num_posts + 1, ";
00466 $q .= "top_last_post = '" .$lastPost. "' ";
00467 $q .= "WHERE top_pk = '" . $topic . "'";
00468 $result = $this->ilias->db->query($q);
00469
00470
00471 $forum_obj = ilObjectFactory::getInstanceByRefId($this->getForumRefId());
00472 $forum_obj->markPostRead($user,$thread,$lastInsert);
00473
00474 $pos_data["ref_id"] = $this->getForumRefId();
00475
00476
00477 $this->__sendMessage($parent_pos, $pos_data);
00478
00479
00480 if($this->ilias->getSetting("forum_notification") == 1)
00481 {
00482 $pos_data["top_name"] = $forum_obj->getTitle();
00483 $this->sendNotifications($pos_data);
00484 }
00485
00486 return $lastInsert;
00487 }
00488
00502 function generateThread($topic, $user, $subject, $message, $notify, $notify_posts, $anonymize, $date = '')
00503 {
00504 $date = $date ? $date : date("Y-m-d H:i:s");
00505
00506 if ($anonymize == 1)
00507 {
00508 $user = 0;
00509 }
00510
00511 $thr_data = array(
00512 "thr_top_fk" => $topic,
00513 "thr_usr_id" => $user,
00514 "thr_subject" => addslashes($subject),
00515 "thr_date" => $date
00516 );
00517
00518
00519 $q = "INSERT INTO frm_threads ";
00520 $q .= "(thr_top_fk,thr_usr_id,thr_subject,thr_date,thr_update,import_name) ";
00521 $q .= "VALUES ";
00522 $q .= "('".$thr_data["thr_top_fk"]."','".$thr_data["thr_usr_id"]."','".
00523 $thr_data["thr_subject"]."','".$thr_data["thr_date"]."','".$thr_data["thr_date"]."','".
00524 ilUtil::prepareDBString($this->getImportName())."')";
00525
00526 $result = $this->ilias->db->query($q);
00527
00528
00529 $lastInsert = $this->ilias->db->getLastInsertId();
00530
00531
00532 $q = "UPDATE frm_data SET top_num_threads = top_num_threads + 1 ";
00533 $q .= "WHERE top_pk = '" . $topic . "'";
00534 $result = $this->ilias->db->query($q);
00535
00536 if ($notify_posts == 1)
00537 {
00538
00539 $q = "INSERT INTO frm_notification ";
00540 $q .= "(user_id, thread_id) ";
00541 $q .= "VALUES ";
00542 $q .= "('".$user."','".$lastInsert."')";
00543
00544 $result = $this->ilias->db->query($q);
00545 }
00546
00547
00548 $forum_obj = ilObjectFactory::getInstanceByRefId($this->getForumRefId());
00549
00550
00551 return $this->generatePost($topic, $lastInsert, $user, $message, 0, $notify, $anonymize, $subject, $date);
00552 }
00553
00561 function updatePost($message, $pos_pk,$notify,$subject,$thr_pk=0)
00562 {
00563 $q = "UPDATE frm_posts ".
00564 "SET ".
00565 "pos_message = '".addslashes($message)."',".
00566 "pos_subject = '".addslashes($subject)."',".
00567 "pos_update = '".date("Y-m-d H:i:s")."',".
00568 "update_user = '".$_SESSION["AccountId"]."', ".
00569 "notify = '".$notify."' ".
00570 "WHERE pos_pk = '".$pos_pk."'";
00571 $this->ilias->db->query($q);
00572
00573 if ($thr_pk > 0 &&
00574 $pos_pk == $this->getFirstPostByThread($thr_pk))
00575 {
00576 $this->updateThread($thr_pk,$subject);
00577 }
00578
00579 return true;
00580 }
00581
00582
00590 function updateThread($thr_pk,$subject)
00591 {
00592 global $ilDB;
00593
00594 $q = "UPDATE frm_threads ".
00595 "SET ".
00596 "thr_subject = ".$ilDB->quote($subject)." ".
00597 "WHERE thr_pk = ".$ilDB->quote($thr_pk)."";
00598 $this->ilias->db->query($q);
00599
00600 return true;
00601 }
00602
00603
00611 function postCensorship($message, $pos_pk, $cens = 0)
00612 {
00613 $q = "UPDATE frm_posts ".
00614 "SET ".
00615 "pos_cens_com = '".addslashes($message)."',".
00616 "pos_update = '".date("Y-m-d H:i:s")."',".
00617 "pos_cens = '".$cens."',".
00618 "update_user = '".$_SESSION["AccountId"]."' ".
00619 "WHERE pos_pk = '".$pos_pk."'";
00620 $this->ilias->db->query($q);
00621
00622 return true;
00623 }
00624
00631 function deletePost($post)
00632 {
00633 include_once "./classes/class.ilObjForum.php";
00634
00635
00636 $p_node = $this->getPostNode($post);
00637 $del_id = $this->deletePostTree($p_node);
00638
00639
00640 foreach($del_id as $post_id)
00641 {
00642 ilObjForum::_deleteReadEntries($post_id);
00643 }
00644
00645
00646 $this->__deletePostFiles($del_id);
00647
00648 $dead_pos = count($del_id);
00649 $dead_thr = 0;
00650
00651
00652 if ($p_node["parent"] == 0)
00653 {
00654
00655 include_once './classes/class.ilObjForum.php';
00656
00657 ilObjForum::_deleteAccessEntries($p_node['tree']);
00658
00659
00660 $dead_thr = $p_node["tree"];
00661 $query = "DELETE FROM frm_threads ".
00662 "WHERE thr_pk = '".$p_node["tree"]."'";
00663 $this->ilias->db->query($query);
00664
00665 $query2 = "UPDATE frm_data ".
00666 "SET ".
00667 "top_num_threads = top_num_threads - 1 ".
00668 "WHERE top_frm_fk = '".$this->id."'";
00669 $this->ilias->db->query($query2);
00670
00671
00672 $query3 = "DELETE FROM frm_posts ".
00673 "WHERE pos_thr_fk = '".$p_node["tree"]."'";
00674 $this->ilias->db->query($query3);
00675 }
00676 else
00677 {
00678
00679 for ($i = 0; $i < $dead_pos; $i++)
00680 {
00681 $query = "DELETE FROM frm_posts ".
00682 "WHERE pos_pk = '".$del_id[$i]."'";
00683 $this->ilias->db->query($query);
00684 }
00685
00686
00687 $query2 = "UPDATE frm_threads ".
00688 "SET ".
00689 "thr_num_posts = thr_num_posts - $dead_pos ".
00690 "WHERE thr_pk = '".$p_node["tree"]."'";
00691 $this->ilias->db->query($query2);
00692
00693
00694 $q = "SELECT * FROM frm_posts WHERE ";
00695 $q .= "pos_thr_fk = '".$p_node["tree"]."' ";
00696 $q .= "ORDER BY pos_date DESC";
00697
00698 $res1 = $this->ilias->db->query($q);
00699
00700 if ($res1->numRows() == 0)
00701 {
00702 $lastPost_thr = "";
00703 }
00704 else
00705 {
00706 $z = 0;
00707
00708 while ($selData = $res1->fetchRow(DB_FETCHMODE_ASSOC))
00709 {
00710 if ($z > 0)
00711 {
00712 break;
00713 }
00714
00715 $lastPost_thr = $selData["pos_top_fk"]."#".$selData["pos_thr_fk"]."#".$selData["pos_pk"];
00716 $z ++;
00717 }
00718 }
00719
00720 $query4 = "UPDATE frm_threads ".
00721 "SET ".
00722 "thr_last_post = '".$lastPost_thr."' ".
00723 "WHERE thr_pk = '".$p_node["tree"]."'";
00724 $this->ilias->db->query($query4);
00725 }
00726
00727
00728 $qu = "UPDATE frm_data ".
00729 "SET ".
00730 "top_num_posts = top_num_posts - $dead_pos ".
00731 "WHERE top_frm_fk = '".$this->id."'";
00732 $this->ilias->db->query($qu);
00733
00734
00735 $q = "SELECT * FROM frm_posts, frm_data WHERE ";
00736 $q .= "pos_top_fk = top_pk AND ";
00737 $q .= "top_frm_fk ='".$this->id."' ";
00738 $q .= "ORDER BY pos_date DESC";
00739
00740 $res2 = $this->ilias->db->query($q);
00741
00742 if ($res2->numRows() == 0)
00743 {
00744 $lastPost_top = "";
00745 }
00746 else
00747 {
00748 $z = 0;
00749
00750 while ($selData = $res2->fetchRow(DB_FETCHMODE_ASSOC))
00751 {
00752 if ($z > 0)
00753 {
00754 break;
00755 }
00756
00757 $lastPost_top = $selData["pos_top_fk"]."#".$selData["pos_thr_fk"]."#".$selData["pos_pk"];
00758 $z ++;
00759 }
00760 }
00761
00762 $query5 = "UPDATE frm_data ".
00763 "SET ".
00764 "top_last_post = '".$lastPost_top."' ".
00765 "WHERE top_frm_fk = '".$this->id."'";
00766 $this->ilias->db->query($query5);
00767
00768 return $dead_thr;
00769 }
00770
00777 function getThreadList($topic)
00778 {
00779 $query = "SELECT frm_threads.* FROM frm_threads WHERE ".
00780 "thr_top_fk = '".$topic."' ";
00781
00782
00783
00784
00785
00786
00787
00788 if ($this->orderField != "")
00789 {
00790 $query .= " ORDER BY ".$this->orderField;
00791 }
00792
00793 $res = $this->ilias->db->query($query);
00794
00795 return $res;
00796 }
00797
00798
00807 function getPostList($topic, $thread)
00808 {
00809 $q = "SELECT frm_posts.*, usr_data.lastname FROM frm_posts, usr_data WHERE ";
00810 $q .= "pos_top_fk ='".$topic."' AND ";
00811 $q .= "pos_thr_fk ='".$thread."' AND ";
00812 $q .= "pos_usr_id = usr_id";
00813
00814 if ($this->orderField != "")
00815 {
00816 $q .= " ORDER BY ".$this->orderField;
00817 }
00818
00819 $res = $this->ilias->db->query($q);
00820
00821 return $res;
00822 }
00823
00830 function getLastPost($lastPost)
00831 {
00832 $LP = explode("#", $lastPost);
00833
00834 $q = "SELECT DISTINCT frm_posts.* FROM frm_posts WHERE ";
00835
00836 $q .= "pos_top_fk = '".$LP[0]."' AND ";
00837 $q .= "pos_thr_fk = '".$LP[1]."' AND ";
00838 $q .= "pos_pk = '".$LP[2]."'";
00839
00840
00841 $result = $this->ilias->db->getRow($q, DB_FETCHMODE_ASSOC);
00842
00843
00844 $result["pos_message"] = $this->prepareText($result["pos_message"],2);
00845
00846 if (strpos($result["pos_message"], $this->txtQuote2) > 0)
00847 {
00848 $viewPos = strrpos($result["pos_message"], $this->txtQuote2) + strlen($this->txtQuote2);
00849 $result["pos_message"] = substr($result["pos_message"], $viewPos);
00850 }
00851
00852 if (strlen($result["pos_message"]) > 40)
00853 $result["pos_message"] = substr($result["pos_message"], 0, 37)."...";
00854
00855 $result["pos_message"] = stripslashes($result["pos_message"]);
00856
00857
00858 $result["pos_date"] = $this->convertDate($result["pos_date"]);
00859
00860 return $result;
00861 }
00862
00870 function getUser($a_user_id)
00871 {
00872 $userObj = new ilObjUser($a_user_id);
00873
00874 return $userObj;
00875 }
00876
00883 function getModerators()
00884 {
00885 global $rbacreview;
00886
00887 return ilObjForum::_getModerators($this->getForumRefId());
00888 }
00889
00897 function _getModerators($a_ref_id)
00898 {
00899 global $rbacreview;
00900
00901 $rolf = $rbacreview->getRoleFolderOfObject($a_ref_id);
00902 $role_arr = $rbacreview->getRolesOfRoleFolder($rolf["ref_id"]);
00903
00904 foreach ($role_arr as $role_id)
00905 {
00906 $roleObj =& $this->ilias->obj_factory->getInstanceByObjId($role_id);
00907
00908 if ($roleObj->getTitle() == "il_frm_moderator_".$a_ref_id)
00909 {
00910 return $rbacreview->assignedUsers($roleObj->getId());
00911 }
00912 }
00913
00914 return array();
00915 }
00916
00925 function _isModerator($a_ref_id, $a_usr_id)
00926 {
00927 return in_array($a_usr_id, ilForum::_getModerators($a_ref_id));
00928 }
00929
00937 function checkEditRight($post_id)
00938 {
00939 global $rbacsystem;
00940
00941
00942 $q = "SELECT * FROM frm_posts WHERE ";
00943 $q .= "pos_usr_id ='".$_SESSION["AccountId"]."' ";
00944 $q .= "AND pos_pk ='".$post_id."'";
00945 $res = $this->ilias->db->query($q);
00946
00947
00948 if ($res->numRows() > 0)
00949 {
00950 return true;
00951 }
00952 elseif ($rbacsystem->checkAccess("delete_post", $this->getForumRefId()))
00953 {
00954 return true;
00955 }
00956 else
00957 {
00958 return false;
00959 }
00960 }
00961
00962
00970 function countUserArticles($user)
00971 {
00972 $q = "SELECT * FROM frm_posts WHERE ";
00973 $q .= "pos_usr_id ='".$user."'";
00974
00975 $res = $this->ilias->db->query($q);
00976
00977 return $res->numRows();
00978 }
00979
00986 function getForumPath($a_ref_id)
00987 {
00988 global $tree;
00989
00990 $path = "";
00991
00992 $tmpPath = $tree->getPathFull($a_ref_id);
00993
00994 for ($i = 0; $i < (count($tmpPath)-1); $i++)
00995 {
00996 if ($path != "")
00997 {
00998 $path .= " > ";
00999 }
01000
01001 $path .= $tmpPath[$i]["title"];
01002 }
01003
01004 return $path;
01005 }
01006
01013 function convertDate($date)
01014 {
01015 global $lng;
01016
01017 if ($date > date("Y-m-d H:i:s", mktime(0, 0, 0, date("m"), date("d"), date("Y"))))
01018 {
01019 return $lng->txt("today").", ".ilFormat::formatDate($date,"time", true);
01020 }
01021
01022 return ilFormat::formatDate($date, "datetime", true);
01023 }
01024
01032 function addPostTree($a_tree_id,$a_node_id = -1)
01033 {
01034 if ($a_node_id <= 0)
01035 {
01036 $a_node_id = $a_tree_id;
01037 }
01038
01039 $query = "INSERT INTO frm_posts_tree (thr_fk, pos_fk, parent_pos, lft, rgt, depth, date) ".
01040 "VALUES ".
01041 "('".$a_tree_id."','".$a_node_id."', 0, 1, 2, 1, '".date("Y-m-d H:i:s")."')";
01042 $this->ilias->db->query($query);
01043
01044 return true;
01045 }
01046
01054 function insertPostNode($a_node_id,$a_parent_id,$tree_id)
01055 {
01056
01057 $query = "SELECT * FROM frm_posts_tree ".
01058 "WHERE pos_fk = '".$a_parent_id."' ".
01059 "AND thr_fk = '".$tree_id."'";
01060 $res = $this->ilias->db->getRow($query);
01061
01062 $left = $res->lft;
01063
01064 $lft = $left + 1;
01065 $rgt = $left + 2;
01066
01067
01068 $query = "UPDATE frm_posts_tree SET ".
01069 "lft = CASE ".
01070 "WHEN lft > ".$left." ".
01071 "THEN lft + 2 ".
01072 "ELSE lft ".
01073 "END, ".
01074 "rgt = CASE ".
01075 "WHEN rgt > ".$left." ".
01076 "THEN rgt + 2 ".
01077 "ELSE rgt ".
01078 "END ".
01079 "WHERE thr_fk = '".$tree_id."'";
01080 $this->ilias->db->query($query);
01081
01082 $depth = $this->getPostDepth($a_parent_id, $tree_id) + 1;
01083
01084
01085 $query = "INSERT INTO frm_posts_tree (thr_fk,pos_fk,parent_pos,lft,rgt,depth,date) ".
01086 "VALUES ".
01087 "('".$tree_id."','".$a_node_id."','".$a_parent_id."','".$lft."','".$rgt."','".$depth."','".date("Y-m-d H:i:s")."')";
01088 $this->ilias->db->query($query);
01089 }
01090
01098 function getPostDepth($a_node_id, $tree_id)
01099 {
01100 if ($tree_id)
01101 {
01102 $query = "SELECT depth FROM frm_posts_tree ".
01103 "WHERE pos_fk = '".$a_node_id."' ".
01104 "AND thr_fk = '".$tree_id."'";
01105
01106 $res = $this->ilias->db->getRow($query);
01107
01108 return $res->depth;
01109 }
01110 else
01111 {
01112 return 0;
01113 }
01114 }
01115
01123 function getPostTree($a_node)
01124 {
01125 $subtree = array();
01126
01127 $query = "SELECT * FROM frm_posts_tree ".
01128 "LEFT JOIN frm_posts ON frm_posts.pos_pk = frm_posts_tree.pos_fk ".
01129 "WHERE frm_posts_tree.lft BETWEEN '".$a_node["lft"]."' AND '".$a_node["rgt"]."' ".
01130 "AND thr_fk = '".$a_node["tree"]."'";
01131 if ($this->orderField == "frm_posts_tree.date")
01132 $query .= " ORDER BY ".$this->orderField." ASC";
01133 else if ($this->orderField != "")
01134 $query .= " ORDER BY ".$this->orderField." DESC";
01135
01136 $res = $this->ilias->db->query($query);
01137
01138 while ($row = $res->fetchRow(DB_FETCHMODE_OBJECT))
01139 {
01140 $subtree[] = $this->fetchPostNodeData($row);
01141 }
01142
01143 return $subtree;
01144 }
01145
01154 function getPostChilds($a_node_id, $a_thr_id)
01155 {
01156
01157 $childs = array();
01158
01159
01160 $count = 0;
01161
01162 $q = "SELECT * FROM frm_posts_tree,frm_posts ".
01163 "WHERE frm_posts.pos_pk = frm_posts_tree.pos_fk ".
01164 "AND frm_posts_tree.parent_pos = '".$a_node_id."' ".
01165 "AND frm_posts_tree.thr_fk = '".$a_thr_id."' ".
01166 "ORDER BY frm_posts_tree.lft DESC";
01167 $r = $this->ilias->db->query($q);
01168
01169 $count = $r->numRows();
01170
01171 if ($count > 0)
01172 {
01173 while ($row = $r->fetchRow(DB_FETCHMODE_OBJECT))
01174 {
01175 $childs[] = $this->fetchPostNodeData($row);
01176 }
01177
01178
01179 $childs[$count - 1]["last"] = true;
01180
01181 return $childs;
01182 }
01183 else
01184 {
01185 return $childs;
01186 }
01187 }
01188
01196 function getFirstPostByThread($a_thread_id)
01197 {
01198 global $ilDB;
01199
01200 $query = "SELECT * FROM frm_posts_tree ".
01201 "WHERE thr_fk = ".$ilDB->quote($a_thread_id)." ".
01202 "AND parent_pos = 0";
01203 $res = $ilDB->query($query);
01204 $row = $res->fetchRow(DB_FETCHMODE_OBJECT);
01205
01206 return $row->pos_fk ? $row->pos_fk : 0;
01207 }
01208
01209
01216 function getFirstPostNode($tree_id)
01217 {
01218 $query = "SELECT * FROM frm_posts, frm_posts_tree ".
01219 "WHERE pos_pk = pos_fk ".
01220 "AND parent_pos = 0 ".
01221 "AND thr_fk = '".$tree_id."'";
01222
01223 $res = $this->ilias->db->query($query);
01224
01225 $row = $res->fetchRow(DB_FETCHMODE_OBJECT);
01226
01227 return $this->fetchPostNodeData($row);
01228 }
01229
01236 function getPostNode($post_id)
01237 {
01238 $query = "SELECT * FROM frm_posts, frm_posts_tree ".
01239 "WHERE pos_pk = pos_fk ".
01240 "AND pos_pk = '".$post_id."'";
01241 $res = $this->ilias->db->query($query);
01242
01243 $row = $res->fetchRow(DB_FETCHMODE_OBJECT);
01244
01245 return $this->fetchPostNodeData($row);
01246 }
01247
01254 function fetchPostNodeData($a_row)
01255 {
01256 global $lng;
01257
01258 require_once("./classes/class.ilObjUser.php");
01259
01260 if (ilObject::_exists($a_row->pos_usr_id))
01261 {
01262 $tmp_user = new ilObjUser($a_row->pos_usr_id);
01263 $fullname = $tmp_user->getFullname();
01264 $loginname = $tmp_user->getLogin();
01265 }
01266
01267 $fullname = $fullname ? $fullname : ($a_row->import_name ? $a_row->import_name : $lng->txt("unknown"));
01268
01269 $data = array(
01270 "pos_pk" => $a_row->pos_pk,
01271 "child" => $a_row->pos_pk,
01272 "author" => $a_row->pos_usr_id,
01273 "title" => $fullname,
01274 "loginname" => $loginname,
01275 "type" => "post",
01276 "message" => $a_row->pos_message,
01277 "subject" => $a_row->pos_subject,
01278 "pos_cens_com" => $a_row->pos_cens_com,
01279 "pos_cens" => $a_row->pos_cens,
01280 "date" => $a_row->date,
01281 "create_date" => $a_row->pos_date,
01282 "update" => $a_row->pos_update,
01283 "update_user" => $a_row->update_user,
01284 "tree" => $a_row->thr_fk,
01285 "parent" => $a_row->parent_pos,
01286 "lft" => $a_row->lft,
01287 "rgt" => $a_row->rgt,
01288 "depth" => $a_row->depth,
01289 "id" => $a_row->fpt_pk,
01290 "notify" => $a_row->notify,
01291 "import_name" => $a_row->import_name
01292 );
01293
01294
01295
01296
01297 return $data ? $data : array();
01298 }
01299
01305 function getPostMaximumDepth($a_thr_id)
01306 {
01307 $q = "SELECT MAX(depth) FROM frm_posts_tree ".
01308 "WHERE thr_fk = '".$a_thr_id."'";
01309 $r = $this->ilias->db->query($q);
01310
01311 $row = $r->fetchRow();
01312
01313 return $row[0];
01314 }
01315
01316
01323 function deletePostTree($a_node)
01324 {
01325
01326 $query = "SELECT * FROM frm_posts_tree ".
01327 "WHERE thr_fk = '".$a_node["tree"]."' ".
01328 "AND pos_fk = '".$a_node["pos_pk"]."' ".
01329 "AND parent_pos = '".$a_node["parent"]."'";
01330 $res = $this->ilias->db->query($query);
01331
01332 while($row = $res->fetchRow(DB_FETCHMODE_OBJECT))
01333 {
01334 $a_node["lft"] = $row->lft;
01335 $a_node["rgt"] = $row->rgt;
01336 }
01337
01338 $diff = $a_node["rgt"] - $a_node["lft"] + 1;
01339
01340
01341 $query = "SELECT * FROM frm_posts_tree ".
01342 "WHERE lft BETWEEN '".$a_node["lft"]."' AND '".$a_node["rgt"]." '".
01343 "AND thr_fk = '".$a_node["tree"]."'";
01344 $result = $this->ilias->db->query($query);
01345
01346 $del_id = array();
01347
01348 while ($treeData = $result->fetchRow(DB_FETCHMODE_ASSOC))
01349 {
01350 $del_id[] = $treeData["pos_fk"];
01351 }
01352
01353
01354 $query = "DELETE FROM frm_posts_tree ".
01355 "WHERE lft BETWEEN '".$a_node["lft"]."' AND '".$a_node["rgt"]." '".
01356 "AND thr_fk = '".$a_node["tree"]."'";
01357 $this->ilias->db->query($query);
01358
01359
01360 $query = "UPDATE frm_posts_tree SET ".
01361 "lft = CASE ".
01362 "WHEN lft > '".$a_node["lft"]." '".
01363 "THEN lft - '".$diff." '".
01364 "ELSE lft ".
01365 "END, ".
01366 "rgt = CASE ".
01367 "WHEN rgt > '".$a_node["lft"]." '".
01368 "THEN rgt - '".$diff." '".
01369 "ELSE rgt ".
01370 "END ".
01371 "WHERE thr_fk = '".$a_node["tree"]."'";
01372 $this->ilias->db->query($query);
01373
01374 return $del_id;
01375 }
01376
01382 function updateVisits($ID)
01383 {
01384 $checkTime = time() - (60*60);
01385
01386 if ($_SESSION["frm_visit_".$this->dbTable."_".$ID] < $checkTime)
01387 {
01388 $_SESSION["frm_visit_".$this->dbTable."_".$ID] = time();
01389
01390 $q = "UPDATE ".$this->dbTable." SET ";
01391 $q .= "visits = visits + 1 ";
01392 $q .= "WHERE ( ".$this->whereCondition." )";
01393
01394 $this->ilias->db->query($q);
01395 }
01396
01397 $this->setWhereCondition("1");
01398 }
01399
01407 function prepareText($text,$edit=0)
01408 {
01409 global $lng;
01410
01411 if ($edit == 1)
01412 {
01413
01414
01415
01416 $text = $this->txtQuote1.$text.$this->txtQuote2;
01417 }
01418 else
01419 {
01420
01421 $startZ = substr_count ($text, $this->txtQuote1);
01422 $endZ = substr_count ($text, $this->txtQuote2);
01423
01424
01425 if ($startZ > 0 || $endZ > 0)
01426 {
01427 if ($startZ > $endZ)
01428 {
01429 $diff = $startZ - $endZ;
01430
01431 for ($i = 0; $i < $diff; $i++)
01432 {
01433 $text .= $this->txtQuote2;
01434 }
01435 }
01436 elseif ($startZ < $endZ)
01437 {
01438 $diff = $endZ - $startZ;
01439
01440 for ($i = 0; $i < $diff; $i++)
01441 {
01442 $text = $this->txtQuote1.$text;
01443 }
01444 }
01445
01446
01447
01448
01449
01450
01451
01452
01453
01454
01455
01456
01457
01458
01459
01460
01461
01462 if ($edit == 0)
01463 {
01464 $text = str_replace($this->txtQuote1, $this->replQuote1.'<div class="ilForumQuoteHead">'.$lng->txt("quote").'</div>', $text);
01465 $text = str_replace($this->txtQuote2, $this->replQuote2, $text);
01466 }
01467 }
01468 }
01469
01470
01471
01472 if ($edit == 0)
01473 {
01474 $text = ilUtil::insertLatexImages($text);
01475 }
01476
01477
01478
01479
01480 $text = str_replace("{", "{", $text);
01481 $text = str_replace("}", "}", $text);
01482
01483 return $text;
01484 }
01485
01486
01493 function getModeratorFromPost($pos_pk) {
01494
01495 $q = "SELECT frm_data.* FROM frm_data, frm_posts WHERE ";
01496 $q .= "pos_pk = '".$pos_pk."' AND ";
01497 $q .= "pos_top_fk = top_pk";
01498
01499 $result = $this->ilias->db->getRow($q, DB_FETCHMODE_ASSOC);
01500
01501 return $result;
01502 }
01503
01504 function __deletePostFiles($a_ids)
01505 {
01506 if(!is_array($a_ids))
01507 {
01508 return false;
01509 }
01510 include_once "classes/class.ilFileDataForum.php";
01511
01512 $tmp_file_obj =& new ilFileDataForum($this->getForumId());
01513 foreach($a_ids as $pos_id)
01514 {
01515 $tmp_file_obj->setPosId($pos_id);
01516 $files = $tmp_file_obj->getFilesOfPost();
01517 foreach($files as $file)
01518 {
01519 $tmp_file_obj->unlinkFile($file["name"]);
01520 }
01521 }
01522 unset($tmp_file_obj);
01523 return true;
01524 }
01525
01526
01527 function __sendMessage($a_parent_pos, $post_data = array())
01528 {
01529 global $ilUser;
01530
01531 $parent_data = $this->getOnePost($a_parent_pos);
01532
01533
01534 if($parent_data["notify"] && $parent_data["pos_usr_id"] != $ilUser->getId())
01535 {
01536
01537 include_once "./classes/class.ilMail.php";
01538 include_once "./classes/class.ilObjUser.php";
01539
01540 $tmp_user =& new ilObjUser($parent_data["pos_usr_id"]);
01541
01542
01543 $this->setWhereCondition("thr_pk='".$parent_data["pos_thr_fk"]."'");
01544 $thread_data = $this->getOneThread();
01545
01546 #var_dump("<pre>",$thread_data,"<pre>");
01547 #var_dump("<pre>",$parent_data,"<pre>");
01548 $tmp_mail_obj = new ilMail($_SESSION["AccountId"]);
01549 $message = $tmp_mail_obj->sendMail($tmp_user->getLogin(),"","",
01550 $this->__formatSubject($thread_data),
01551 $this->__formatMessage($thread_data, $post_data),
01552 array(),array("normal"));
01553
01554 unset($tmp_user);
01555 unset($tmp_mail_obj);
01556 }
01557 }
01558
01559 function __formatSubject($thread_data)
01560 {
01561 return $this->lng->txt("forums_notification_subject");
01562 }
01563
01564 function __formatMessage($thread_data, $post_data = array())
01565 {
01566 include_once "./classes/class.ilObjectFactory.php";
01567
01568
01569 $frm_obj =& ilObjectFactory::getInstanceByRefId($this->getForumRefId());
01570 $title = $frm_obj->getTitle();
01571 unset($frm_obj);
01572
01573 $message = $this->lng->txt("forum").": ".$title." -> ".$thread_data["thr_subject"]."\n\n";
01574 $message .= $this->lng->txt("forum_post_replied");
01575
01576 $message .= "\n------------------------------------------------------------\n";
01577 $message .= sprintf($this->lng->txt("forums_notification_show_post"), "http://".$_SERVER["HTTP_HOST"].dirname($_SERVER["PHP_SELF"])."/goto.php?target=frm_".$post_data["ref_id"]."_".$post_data["pos_thr_fk"]);
01578
01579 return $message;
01580 }
01581
01582 function getUserData($a_id,$a_import_name = 0)
01583 {
01584 global $lng;
01585
01586 if($a_id && ilObject::_exists($a_id) && ilObjectFactory::getInstanceByObjId($a_id,false))
01587 {
01588 $query = "SELECT * FROM usr_data WHERE usr_id = '".$a_id."'";
01589 $res = $this->ilias->db->query($query);
01590 while($row = $res->fetchRow(DB_FETCHMODE_OBJECT))
01591 {
01592 $tmp_array["usr_id"] = $row->usr_id;
01593 $tmp_array["login"] = $row->login;
01594 $tmp_array["login"] = $row->login;
01595 $tmp_array["firstname"] = $row->firstname;
01596 $tmp_array["lastname"] = $row->lastname;
01597 }
01598 return $tmp_array ? $tmp_array : array();
01599 }
01600 else
01601 {
01602 $login = $a_import_name ? $a_import_name." (".$lng->txt("imported").")" : $lng->txt("unknown");
01603
01604 return array("usr_id" => 0, "login" => $login, "firstname" => "", "lastname" => "");
01605 }
01606 }
01607
01608
01609 function getImportName()
01610 {
01611 return $this->import_name;
01612 }
01613 function setImportName($a_import_name)
01614 {
01615 $this->import_name = $a_import_name;
01616 }
01617
01625 function enableNotification($user_id, $thread_id)
01626 {
01627 if (!$this->isNotificationEnabled($user_id, $thread_id))
01628 {
01629 $q = "INSERT INTO frm_notification (user_id, thread_id) VALUES (";
01630 $q .= "'" . $user_id . "', ";
01631 $q .= "'" . $thread_id . "')";
01632 $this->ilias->db->query($q);
01633 }
01634
01635 return true;
01636 }
01637
01645 function disableNotification($user_id, $thread_id)
01646 {
01647 $q = "DELETE FROM frm_notification WHERE ";
01648 $q .= "user_id = '" . $user_id . "' AND ";
01649 $q .= "thread_id = '". $thread_id . "'";
01650 $this->ilias->db->query($q);
01651
01652 return true;
01653 }
01654
01662 function isNotificationEnabled($user_id, $thread_id)
01663 {
01664 $q = "SELECT COUNT(*) FROM frm_notification WHERE ";
01665 $q .= "user_id = '" . $user_id . "' AND ";
01666 $q .= "thread_id = '". $thread_id . "'";
01667 return $this->ilias->db->getOne($q);
01668 }
01669
01670 function sendNotifications($post_data)
01671 {
01672 include_once "./classes/class.ilMail.php";
01673 include_once "./classes/class.ilObjUser.php";
01674
01675
01676 $q = "SELECT thr_subject FROM frm_threads WHERE ";
01677 $q .= "thr_pk = '" . $post_data["pos_thr_fk"] . "'";
01678 $thread_subject = $this->ilias->db->getOne($q);
01679 $post_data["thr_subject"] = $thread_subject;
01680
01681
01682 $post_data["pos_usr_name"] = ilObjUser::_lookupLogin($post_data["pos_usr_id"]);
01683
01684
01685 $q = "SELECT user_id FROM frm_notification WHERE ";
01686 $q .= "thread_id = '" . $post_data["pos_thr_fk"] . "' AND ";
01687 $q .= "user_id <> '" . $_SESSION["AccountId"] . "'";
01688 $res = $this->ilias->db->query($q);
01689 if (!DB::isError($res) &&
01690 is_object($res) &&
01691 $res->numRows() > 0)
01692 {
01693 while($row = $res->fetchRow(DB_FETCHMODE_ASSOC))
01694 {
01695
01696 $tmp_mail_obj = new ilMail($_SESSION["AccountId"]);
01697 $message = $tmp_mail_obj->sendMail(ilObjUser::_lookupLogin($row["user_id"]),"","",
01698 $this->formatNotificationSubject(),
01699 $this->formatNotification($post_data),
01700 array(),array("normal"));
01701 unset($tmp_mail_obj);
01702 }
01703 }
01704 }
01705
01706 function formatNotificationSubject()
01707 {
01708 return $this->lng->txt("forums_notification_subject");
01709 }
01710
01711 function formatNotification($post_data, $cron = 0)
01712 {
01713 if ($cron == 1)
01714 {
01715 $message = sprintf($this->lng->txt("forums_notification_intro"), $this->ilias->ini->readVariable("client","name"), ILIAS_HTTP_PATH)."\n\n";
01716 }
01717 else
01718 {
01719 $message = sprintf($this->lng->txt("forums_notification_intro"), $this->ilias->ini->readVariable("client","name"), "http://".$_SERVER["HTTP_HOST"].dirname($_SERVER["PHP_SELF"]))."\n\n";
01720 }
01721 $message .= $this->lng->txt("forum").": ".$post_data["top_name"]."\n\n";
01722 $message .= $this->lng->txt("thread").": ".$post_data["thr_subject"]."\n\n";
01723 $message .= $this->lng->txt("new_post").":\n------------------------------------------------------------\n";
01724 $message .= $this->lng->txt("author").": ".$post_data["pos_usr_name"]."\n";
01725 $message .= $this->lng->txt("date").": ".$post_data["pos_date"]."\n";
01726 $message .= $this->lng->txt("subject").": ".$post_data["pos_subject"]."\n\n";
01727 if ($post_data["pos_cens"] == 1)
01728 {
01729 $message .= $post_data["pos_cens_com"]."\n";
01730 }
01731 else
01732 {
01733 $message .= $post_data["pos_message"]."\n";
01734 }
01735 $message .= "------------------------------------------------------------\n";
01736 if ($cron == 1)
01737 {
01738 $message .= sprintf($this->lng->txt("forums_notification_show_post"), ILIAS_HTTP_PATH."/goto.php?target=frm_".$post_data["ref_id"]."_".$post_data["pos_thr_fk"]);
01739 }
01740 else
01741 {
01742 $message .= sprintf($this->lng->txt("forums_notification_show_post"), "http://".$_SERVER["HTTP_HOST"].dirname($_SERVER["PHP_SELF"])."/goto.php?target=frm_".$post_data["ref_id"]."_".$post_data["pos_thr_fk"]);
01743 }
01744
01745 return $message;
01746 }
01747
01748 function isAnonymized()
01749 {
01750 $q = "SELECT anonymized FROM frm_settings WHERE ";
01751 $q .= "obj_id = '" . $this->getForumId() . "'";
01752 return $this->ilias->db->getOne($q);
01753 }
01754
01755 }