remove old readme
[atutor.git] / mods / _standard / forums / lib / forums.inc.php
1 <?php
2 /****************************************************************************/
3 /* ATutor                                                                                                                                       */
4 /****************************************************************************/
5 /* Copyright (c) 2002-2010                                                  */
6 /* Inclusive Design Institute                                               */
7 /* http://atutor.ca                                                                                                                     */
8 /*                                                                                                                                                      */
9 /* This program is free software. You can redistribute it and/or                        */
10 /* modify it under the terms of the GNU General Public License                          */
11 /* as published by the Free Software Foundation.                                                        */
12 /****************************************************************************/
13 // $Id$
14
15 if (!defined('AT_INCLUDE_PATH')) { exit; }
16
17 /**
18 * Returns an array of (shared and non-shared) forums belonging to the given course
19 * @access  public
20 * @param   integer $course              id of the course
21 * @return  string array                 each row is a forum 
22 * @see     $db                                  in include/vitals.inc.php
23 * @see     is_shared_forum()
24 * @author  Heidi Hazelton
25 * @author  Joel Kronenberg
26 */
27 function get_forums($course) {
28         global $db;
29
30         if ($course) {
31                 $sql    = "SELECT F.*, DATE_FORMAT(F.last_post, '%Y-%m-%d %H:%i:%s') AS last_post FROM ".TABLE_PREFIX."forums_courses FC INNER JOIN ".TABLE_PREFIX."forums F USING (forum_id) WHERE FC.course_id=$course GROUP BY FC.forum_id ORDER BY F.title";
32         } else {
33                 $sql    = "SELECT F.*, FC.course_id, DATE_FORMAT(F.last_post, '%Y-%m-%d %H:%i:%s') AS last_post FROM ".TABLE_PREFIX."forums_courses FC INNER JOIN ".TABLE_PREFIX."forums F USING (forum_id) GROUP BY FC.forum_id ORDER BY F.title";
34         }
35
36         // 'nonshared' forums are always listed first:
37         $forums['nonshared'] = array();
38         $forums['shared']    = array();
39         $forums['group']     = array();
40
41         $result = mysql_query($sql, $db);
42         while ($row = mysql_fetch_assoc($result)) {
43                 // for each forum, check if it's shared or not:
44
45                 if (is_shared_forum($row['forum_id'])) {
46                         $forums['shared'][] = $row;
47                 } else {
48                         $forums['nonshared'][] = $row;
49                 }
50         }
51                 
52         // retrieve the group forums if course is given
53
54         if (!$_SESSION['groups'] || !$course) {
55                 return $forums;
56         }
57
58         // filter out the groups that do not belong to the given course
59         foreach ($_SESSION['groups'] as $group) {
60                 $sql = "SELECT * FROM ".TABLE_PREFIX."groups g, ". TABLE_PREFIX."groups_types gt
61                          WHERE g.group_id=".$group."
62                            AND g.type_id = gt.type_id
63                            AND gt.course_id=".$course;
64                 $result = mysql_query($sql, $db);
65                 
66                 if (mysql_num_rows($result) > 0){
67                         $groups = $group .',';
68                 }
69         }
70         if (isset($groups)) {
71                 $groups = substr($groups, 0, -1);
72                 $sql = "SELECT F.*, G.group_id FROM ".TABLE_PREFIX."forums_groups G 
73                          INNER JOIN ".TABLE_PREFIX."forums F 
74                          USING (forum_id) 
75                          WHERE G.group_id IN ($groups) 
76                          ORDER BY F.title";
77                 
78                 $result = mysql_query($sql, $db);
79                 while ($row = mysql_fetch_assoc($result)) {
80                         $row['title'] = get_group_title($row['group_id']);
81                         $forums['group'][] = $row;
82                 }
83         }
84         
85         return $forums; 
86 }
87
88 /**
89 * Returns true/false whether or not this forum is shared.
90 * @access  public
91 * @param   integer $forum_id    id of the forum
92 * @return  boolean                              true if this forum is shared, false otherwise
93 * @see     $db                                  in include/vitals.inc.php
94 * @author  Joel Kronenberg
95 */
96 function is_shared_forum($forum_id) {
97         global $db;
98
99         $sql = "SELECT COUNT(*) AS cnt FROM ".TABLE_PREFIX."forums_courses WHERE forum_id=$forum_id";
100         $result = mysql_query($sql, $db);
101         $row = mysql_fetch_assoc($result);
102
103         if ($row['cnt'] > 1) {
104                 return TRUE;
105         } // else:
106         
107         return FALSE;
108 }
109
110
111 /**
112 * Returns forum information for given forum_id 
113 * @access  public
114 * @param   integer $forum_id    id of the forum
115 * @param   integer $course              id of the course (for non-admins)
116 * @return  string array                 each row is a forum 
117 * @see     $db                                  in include/vitals.inc.php
118 * @author  Heidi Hazelton
119 */
120 function get_forum($forum_id, $course = '') {
121         global $db;
122
123         if (!empty($course)) {
124                 $sql    = "SELECT * FROM ".TABLE_PREFIX."forums_courses fc, ".TABLE_PREFIX."forums f WHERE (fc.course_id=$course OR fc.course_id=0) AND fc.forum_id=f.forum_id and fc.forum_id=$forum_id ORDER BY title";
125                 $result = mysql_query($sql, $db);
126                 $forum = mysql_fetch_assoc($result);
127         } else if (empty($course)) {    //only admins should be retrieving forums w/o a course!  add this check
128                 $sql = "SELECT * FROM ".TABLE_PREFIX."forums WHERE forum_id=$forum_id";
129                 $result = mysql_query($sql, $db);
130                 $forum = mysql_fetch_assoc($result);
131         } else {
132
133                 return;
134         }
135
136         return $forum;  
137 }
138
139 /**
140 * Checks to see if signed in member is allowed to view the forum page
141 * @access  public
142 * @param   integer $forum_id    id of the forum
143 * @return  boolean                              view (true) or not view (false)
144 * @see     $db                                  in include/vitals.inc.php
145 * @author  Heidi Hazelton
146 */
147 function valid_forum_user($forum_id) {
148         global $db;
149
150         $sql    = "SELECT forum_id FROM ".TABLE_PREFIX."forums_courses WHERE (course_id=$_SESSION[course_id] OR course_id=0) AND forum_id=$forum_id";
151         $result = mysql_query($sql, $db);
152         $row = mysql_fetch_assoc($result);
153
154         if (empty($row)) {
155                 // not a course forum, let's check group:
156                 if (!empty($_SESSION['groups'])){
157                         $groups = implode(',', $_SESSION['groups']);
158                         $sql    = "SELECT forum_id FROM ".TABLE_PREFIX."forums_groups WHERE group_id IN ($groups) AND forum_id=$forum_id";
159                         $result = mysql_query($sql, $db);
160                         if ($row = mysql_fetch_assoc($result)) {
161                                 return TRUE;
162                         }
163                 }
164
165                 return FALSE;
166         }
167
168         return TRUE;    
169 }
170
171 /**
172 * Adds a forum
173 * @access  public
174 * @param   array $_POST                 add-forum form variables
175 * @see     $db                                  in include/vitals.inc.php
176 * @see     $addslashes                  in include/vitals.inc.php
177 * @author  Heidi Hazelton
178 */
179 function add_forum($_POST) {
180         global $db;
181         global $addslashes;
182
183         $_POST['title'] = $addslashes($_POST['title']);
184         $_POST['body']  = $addslashes($_POST['body']);
185         $_POST['edit']  = intval($_POST['edit']);
186
187         $sql    = "INSERT INTO ".TABLE_PREFIX."forums VALUES (NULL,'$_POST[title]', '$_POST[body]', 0, 0, NOW(), $_POST[edit])";
188         $result = mysql_query($sql,$db);
189
190         $sql    = "INSERT INTO ".TABLE_PREFIX."forums_courses VALUES (LAST_INSERT_ID(),  $_SESSION[course_id])";
191         $result = mysql_query($sql,$db);
192
193         return;
194 }
195
196 /**
197 * Edits a forum
198 * @access  public
199 * @param   array $_POST                 add-forum form variables
200 * @see     $db                                  in include/vitals.inc.php
201 * @see     $addslashes                  in include/vitals.inc.php
202 * @author  Heidi Hazelton
203 */
204 function edit_forum($_POST) {
205         global $db;
206         global $addslashes;
207
208         $_POST['title']  = $addslashes($_POST['title']);
209         $_POST['body']   = $addslashes($_POST['body']);
210
211         $_POST['fid']    = intval($_POST['fid']);
212         $_POST['edit']    = intval($_POST['edit']);
213
214         $sql    = "UPDATE ".TABLE_PREFIX."forums SET title='$_POST[title]', description='$_POST[body]', last_post=last_post, mins_to_edit=$_POST[edit] WHERE forum_id=$_POST[fid]";
215         $result = mysql_query($sql,$db);
216
217         return;
218 }
219
220 /**
221 * Deletes a forum (checks if its shared).
222 * Assumes the forum is not shared.
223 * Assumes the user has the priv to delete this forum.
224 * @access  public
225 * @param   array $_POST                 add-forum form variables
226 * @see     $db                                  in include/vitals.inc.php
227 * @see     $addslashes                  in include/vitals.inc.php
228 * @author  Heidi Hazelton
229 */
230 function delete_forum($forum_id) {
231         global $db;
232
233         $sql    = "SELECT post_id FROM ".TABLE_PREFIX."forums_threads WHERE forum_id=$forum_id";
234         $result = mysql_query($sql, $db);
235         while ($row = mysql_fetch_array($result)) {
236                 $sql     = "DELETE FROM ".TABLE_PREFIX."forums_accessed WHERE post_id=$row[post_id]";
237                 $result2 = mysql_query($sql, $db);
238         }
239
240         $sql    = "DELETE FROM ".TABLE_PREFIX."forums_subscriptions WHERE forum_id=$forum_id";
241         $result = mysql_query($sql, $db);
242
243         $sql    = "DELETE FROM ".TABLE_PREFIX."forums_threads WHERE forum_id=$forum_id";
244         $result = mysql_query($sql, $db);
245
246         $sql = "DELETE FROM ".TABLE_PREFIX."forums_courses WHERE forum_id=$forum_id";
247         $result = mysql_query($sql, $db);
248
249         $sql    = "DELETE FROM ".TABLE_PREFIX."forums WHERE forum_id=$forum_id";
250         $result = mysql_query($sql, $db);
251
252         $sql    = "DELETE FROM ".TABLE_PREFIX."content_forums_assoc WHERE forum_id=$forum_id";
253         $result = mysql_query($sql, $db);
254
255         $sql = "OPTIMIZE TABLE ".TABLE_PREFIX."forums_threads";
256         $result = mysql_query($sql, $db);
257
258 }
259
260 function print_entry($row) {
261         global $page, $system_courses, $forum_info;
262         static $counter;
263         $counter++;
264
265         $reply_link = '<a href="mods/_standard/forums/forum/view.php?fid='.$row['forum_id'].SEP.'pid=';
266         if ($row['parent_id'] == 0) {
267                 $reply_link .= $row['post_id'];
268         } else {
269                 $reply_link .= $row['parent_id'];
270         }
271         $reply_link .= SEP.'reply='.$row['post_id'].SEP.'page='.$page.'#post" >'._AT('reply').'</a>';
272
273 ?>
274
275         <li class="<?php if ($counter %2) { echo 'odd'; } else { echo 'even'; } ?>">
276                 <a name="<?php echo $row['post_id']; ?>"></a>
277                 <div class="forum-post-author">
278                         <a href="profile.php?id=<?php echo $row['member_id']; ?>" class="title"><?php echo htmlspecialchars(get_display_name($row['member_id'])); ?></a><br />
279                         <?php print_profile_img($row['member_id']); ?>
280                 </div>
281
282                 <div class="forum-post-content">
283                         <h3><?php echo AT_print($row['subject'], 'forums_threads.subject'); ?></h3>
284                         <div>
285                                 <div class="forum-post-ctrl">
286                                         <?php if (authenticate(AT_PRIV_FORUMS, AT_PRIV_RETURN)): ?>
287                                                 <?php echo $reply_link; ?> | <a href="mods/_standard/forums/edit_post.php?fid=<?php echo $row['forum_id'].SEP.'pid='.$row['post_id']; ?>"><?php echo _AT('edit'); ?></a> | <a href="mods/_standard/forums/forum/delete_thread.php?fid=<?php echo $row['forum_id'].SEP.'pid='.$row['post_id'].SEP.'ppid='.$row['parent_id'].SEP; ?>nest=1"><?php echo _AT('delete'); ?></a>
288                                         <?php elseif (($row['member_id'] == $_SESSION['member_id']) && (($row['udate'] + $forum_info['mins_to_edit'] * 60) > time())): ?>
289                                                 <?php echo $reply_link; ?> | <a href="mods/_standard/forums/edit_post.php?fid=<?php echo $row['forum_id'].SEP.'pid='.$row['post_id']; ?>"><?php echo _AT('edit'); ?></a> <span>(<?php echo _AT('edit_for_minutes', round((($row['udate'] + $forum_info['mins_to_edit'] * 60) - time())/60)); ?>)</span>
290                                         <?php elseif ($_SESSION['valid_user']): ?>
291                                                 <?php echo $reply_link; ?>
292                                         <?php endif; ?>
293                                 </div>
294                                 <p class="date">&nbsp;&nbsp;<?php echo AT_date(_AT('forum_date_format'), $row['date'], AT_DATE_MYSQL_DATETIME); ?></p>
295
296                         </div>
297
298                         <div class="body">
299                                 <p><?php echo AT_print($row['body'], 'forums_threads.body'); ?></p>
300                         </div>
301                 </div>
302         </li>
303 <?php
304 }
305 ?>