3 * GForge Forums Facility
5 * Copyright 2002 GForge, LLC
13 By Tim Perdue, Sourceforge, 11/99
15 Massive rewrite by Tim Perdue 7/2000 (nested/views/save)
17 Complete OO rewrite by Tim Perdue 12/2002
19 Heavy RBAC changes 3/17/2004
22 require_once('../../env.inc.php');
23 require_once $gfcommon.'include/pre.php';
24 require_once $gfwww.'forum/include/ForumHTML.class.php';
25 require_once $gfcommon.'forum/Forum.class.php';
26 require_once $gfwww.'forum/admin/ForumAdmin.class.php';
27 require_once $gfcommon.'forum/ForumFactory.class.php';
28 require_once $gfcommon.'forum/ForumMessageFactory.class.php';
29 require_once $gfcommon.'forum/ForumMessage.class.php';
30 require_once $gfcommon.'include/TextSanitizer.class.php'; // to make the HTML input by the user safe to store
32 $group_id = getIntFromRequest('group_id');
33 $group_forum_id = getIntFromRequest('group_forum_id');
34 $deleteforum = getStringFromRequest('deleteforum');
35 $feedback = getStringFromRequest('feedback');
44 // Set up local objects
46 $g =& group_get_object($group_id);
47 if (!$g || !is_object($g) || $g->isError()) {
51 session_require_perm ('forum_admin', $group_id) ;
53 if (getStringFromRequest('post_changes')) {
55 Update the DB to reflect the changes
62 $fa = new ForumAdmin($group_id);
63 $feedback .= $fa->ExecuteAction("delete_forum");
66 } else if (getStringFromRequest('add_forum')) {
67 if (!form_key_is_valid(getStringFromRequest('form_key'))) {
68 exit_form_double_submit();
71 if (check_email_available($g, $g->getUnixName() . '-' . getStringFromRequest('forum_name'), $error_msg)) {
72 $fa = new ForumAdmin($group_id);
73 $feedback .= $fa->ExecuteAction("add_forum");
75 } else if (getStringFromRequest('change_status')) {
76 $fa = new ForumAdmin($group_id);
77 $feedback .= $fa->ExecuteAction("change_status");
81 if (getStringFromRequest('add_forum')) {
83 Show the form for adding forums
85 forum_header(array('title'=>_('Add forum')));
89 <form method="post" action="'.getStringFromServer('PHP_SELF').'">
90 <input type="hidden" name="post_changes" value="y" />
91 <input type="hidden" name="add_forum" value="y" />
92 <input type="hidden" name="group_id" value="'.$group_id.'" />
93 <input type="hidden" name="form_key" value="' . form_generate_key() . '" />
94 <strong>'._('Forum Name').':</strong><br />
95 <input type="text" name="forum_name" value="" size="20" maxlength="30" /><br />
96 <strong>'._('Description').':</strong><br />
97 <input type="text" name="description" value="" size="40" maxlength="80" /><br />
98 <strong>'._('Is Public?').'</strong><br />
99 <input type="radio" name="is_public" value="1" checked="checked" />'._('Yes').' <br />
100 <input type="radio" name="is_public" value="0" />'._('No').'
102 <strong>'._('Allow Anonymous Posts?').'</strong><br />
103 <input type="radio" name="allow_anonymous" value="1" />'._('Yes').'<br />
104 <input type="radio" name="allow_anonymous" value="0" checked="checked" />'._('No').'
106 html_build_select_box_from_assoc(array("0" => _('No Moderation') ,"1" => _('Moderated Level 1'),"2" => _('Moderated Level 2') ),"moderation_level",0) . '
107 <br />' . _('Moderated Level 1') . ': ' . _('To moderate anonymous posts (if allowed in public forum) and posts from non-member users.') . '<br />' . _('Moderated Level 2') . ': ' . _('To moderate ALL posts.') . '<p>
109 <strong>'._('Email All Posts To:').'</strong><br />
110 <input type="text" name="send_all_posts_to" value="" size="60" />
112 <input type="submit" name="submit" value="'._('Add This Forum').'" />
116 forum_footer(array());
118 } else if (getStringFromRequest('change_status')) {
123 $f = new Forum ($g,$group_forum_id);
125 forum_header(array('title'=>_('Change forum status')));
126 echo '<p>'._('You can adjust forum features from here. Please note that private forums can still be viewed by members of your project, not the general public.').'</p>';
127 $fa = new ForumAdmin($f->Group->getID());
128 $fa->PrintAdminPendingOption($group_forum_id);
131 <form action="'.getStringFromServer('PHP_SELF').'" method="post">
132 <input type="hidden" name="post_changes" value="y" />
133 <input type="hidden" name="change_status" value="y" />
134 <input type="hidden" name="group_forum_id" value="'. $f->getID() .'" />
135 <input type="hidden" name="group_id" value="'.$group_id.'" />
137 <strong>'._('Allow Anonymous Posts?').'</strong><br />
138 <input type="radio" name="allow_anonymous" value="1"'.(($f->AllowAnonymous() == 1)?' checked="checked"':'').' /> '._('Yes').'<br />
139 <input type="radio" name="allow_anonymous" value="0"'.(($f->AllowAnonymous() == 0)?' checked="checked"':'').'/> '._('No').'<br />
142 <strong>'._('Is Public?').'</strong><br />
143 <input type="radio" name="is_public" value="1"'.(($f->isPublic() == 1)?' checked="checked"':'').' /> '._('Yes').'<br />
144 <input type="radio" name="is_public" value="0"'.(($f->isPublic() == 0)?' checked="checked"':'').' /> '._('No').'<br />
145 <input type="radio" name="is_public" value="9"'.(($f->isPublic() == 9)?' checked="checked"':'').' />'._('Suspended').'<br />
147 html_build_select_box_from_assoc(array("0" => _('No Moderation') ,"1" => _('Moderated Level 1'),"2" => _('Moderated Level 2') ),"moderation_level",$f->getModerationLevel()) . '
148 <br />' . _('Moderated Level 1') . ': ' . _('To moderate anonymous posts (if allowed in public forum) and posts from non-member users.') . '<br />' . _('Moderated Level 2') . ': ' . _('To moderate ALL posts.') . '<p>
151 <strong>'._('Forum Name').':</strong><br />
152 <input type="text" name="forum_name" value="'. $f->getName() .'" size="20" maxlength="30" />
154 <strong>'._('Email All Posts To:').'</strong><br />
155 <input type="text" name="send_all_posts_to" value="'. $f->getSendAllPostsTo() .'" size="60" />
157 <strong>'._('Description').':</strong><br />
158 <input type="text" name="description" value="'. $f->getDescription() .'" size="60" maxlength="80" /><br />
160 <input type="submit" name="submit" value="'._('Update').'" />
162 //echo '<a href="'.getStringFromServer('PHP_SELF').'?group_id='.$group_id.'&group_forum_id='.$group_forum_id.'&delete=1">'._('Delete Message').'</a><br />';
163 echo '<a href="'.getStringFromServer('PHP_SELF').'?group_id='.$group_id.'&group_forum_id='.$group_forum_id.'&deleteforum=1">'._('Delete entire forum and all content').'</a><br />';
164 forum_footer(array());
166 } elseif ($deleteforum && $group_forum_id) {
168 $f = new Forum ($g,$group_forum_id);
170 forum_header(array('title'=>_('Delete')));
172 <strong>'._('You are about to permanently and irretrievably delete this entire forum and all its contents!').'</strong><br />
174 <form method="post" action="'.getStringFromServer('PHP_SELF').'">
175 <input type="hidden" name="post_changes" value="y" />
176 <input type="hidden" name="deleteforum" value="y" />
177 <input type="hidden" name="group_id" value="'.$group_id.'" />
178 <input type="hidden" name="group_forum_id" value="'.$group_forum_id.'" />
179 <input type="checkbox" name="sure" value="1" />'._('I\'m Sure').'<br />
180 <input type="checkbox" name="really_sure" value="1" />'._('I\'m Really Sure').'<br />
181 <input type="submit" name="submit" value="'._('Delete').'" />
183 forum_footer(array());
185 } elseif ( getStringFromRequest("deletemsg") ) {
186 // delete message handling
188 $forum_id = getStringFromRequest("forum_id");
189 $thread_id = getStringFromRequest("thread_id");
190 $msg_id = getStringFromRequest("deletemsg");
192 $f = forum_get_object ($forum_id) ;
194 $fa = new ForumAdmin($f->Group->getID());
196 if (getStringFromRequest("ok")) {
197 //actually delete the message
198 $feedback .= $fa->ExecuteAction("delete");
199 forum_header(array('title'=>_('Delete a Message')));
200 echo '<p>'.util_make_link ('/forum/forum.php?forum_id=' . $forum_id, _("Return to the forum")) . '</p>';
201 forum_footer(array());
202 } elseif (getStringFromRequest("cancel")) {
203 // the user cancelled the request, go back to forum
204 //if thread_id is 0, then we came from message.php. else, we came from forum.php
206 header("Location: /forum/message.php?msg_id=$msg_id");
208 header("Location: /forum/forum.php?thread_id=$thread_id&forum_id=$forum_id");
212 //print the delete message confirmation
213 forum_header(array('title'=>_('Delete a Message')));
215 <form action="'.getStringFromServer('PHP_SELF').'" method="post">
216 <h3>' . _('WARNING! You are about to permanently delete a message and all of its followups!!') . '</h3><p>
218 <input type="submit" name="ok" value="' . _('Yes') . '" />
219 <input type="submit" name="cancel" value="' . _('No') . '" />
220 <input type="hidden" name="deletemsg" value="'.$msg_id.'" />
221 <input type="hidden" name="group_id" value="'.$group_id.'" />
222 <input type="hidden" name="forum_id" value="'.$forum_id.'" />
223 <input type="hidden" name="thread_id" value="'.$thread_id.'" />
227 forum_footer(array());
229 } elseif (getStringFromRequest("editmsg")) {
230 // edit message handling
231 $forum_id = getStringFromRequest("forum_id");
232 $thread_id = getStringFromRequest("thread_id");
233 $msg_id = getStringFromRequest("editmsg");
235 $f = forum_get_object ($forum_id) ;
236 $fa = new ForumAdmin($f->Group->getID());
238 if (getStringFromRequest("ok")) {
239 //actually finish editing the message and save the contents
240 $f = new Forum ($fa->GetGroupObject(),$forum_id);
241 if (!$f || !is_object($f)) {
242 exit_error('Error','Error Getting Forum');
243 } elseif ($f->isError()) {
244 exit_error('Error',$f->getErrorMessage());
246 $fm=new ForumMessage($f,$msg_id,false,false);
247 if (!$fm || !is_object($fm)) {
248 exit_error(_('Error'),_('Error getting new forum message'));
249 } elseif ($fm->isError()) {
250 exit_error(_('Error'),$fm->getErrorMessage());
252 $subject = getStringFromRequest('subject');
253 $body = getStringFromRequest('body');
255 $sanitizer = new TextSanitizer();
256 $body = $sanitizer->SanitizeHtml($body);
258 $is_followup_to = getStringFromRequest('is_followup_to');
259 $form_key = getStringFromRequest('form_key');
260 $posted_by = getStringFromRequest('posted_by');
261 $post_date = getStringFromRequest('post_date');
262 $is_followup_to = getStringFromRequest('is_followup_to');
263 $has_followups = getStringFromRequest('has_followups');
264 $most_recent_date = getStringFromRequest('most_recent_date');
265 if ($fm->updatemsg($forum_id,$posted_by,$subject,$body,$post_date,$is_followup_to,$thread_id,$has_followups,$most_recent_date)) {
266 $feedback .= _('Message Edited Successfully');
268 $feedback .= $fm->getErrorMessage();
270 forum_header(array('title'=>_('Edit a Message')));
271 echo '<p>'.util_make_link ('/forum/forum.php?forum_id=' . $forum_id, _("Return to the forum")) ;
272 forum_footer(array());
273 } elseif (getStringFromRequest("cancel")) {
274 // the user cancelled the request, go back to forum
275 header("Location: /forum/message.php?msg_id=$msg_id");
278 //print the edit message confirmation
280 $f = new Forum ($fa->GetGroupObject(),$forum_id);
281 if (!$f || !is_object($f)) {
282 exit_error('Error','Error Getting Forum');
283 } elseif ($f->isError()) {
284 exit_error('Error',$f->getErrorMessage());
287 $fm=new ForumMessage($f,$msg_id,false,false);
288 if (!$fm || !is_object($fm)) {
289 exit_error(_('Error'),_('Error Getting ForumMessage'));
290 } elseif ($fm->isError()) {
291 exit_error(_('Error'),$fm->getErrorMessage());
294 $fh = new ForumHTML($f);
295 if (!$fh || !is_object($fh)) {
296 exit_error(_('Error'),_('Error Getting ForumHTML'));
297 } elseif ($fh->isError()) {
298 exit_error(_('Error'),$fh->getErrorMessage());
301 forum_header(array('title'=>_('Edit a Message')));
302 $fh->showEditForm($fm);
303 forum_footer(array());
305 } elseif (getStringFromRequest("movethread")) {
306 $thread_id = getIntFromRequest("movethread");
307 $msg_id = getStringFromRequest("msg_id");
308 $forum_id = getIntFromRequest("forum_id");
309 $return_to_message = getIntFromRequest("return_to_message");
310 $new_forum_id = getIntFromRequest("new_forum_id");
311 $f = forum_get_object ($forum_id) ;
312 $fa = new ForumAdmin($f->Group->getID());
314 if (getStringFromRequest("ok")) {
315 if ($forum_id == $new_forum_id) {
316 $feedback .= _('Thread not moved');
319 // Move message in another forum
320 $f_from = new Forum ($fa->GetGroupObject(),$forum_id);
321 if (!$f_from || !is_object($f_from)) {
322 exit_error('Error','Could Not Get Forum Object');
323 } elseif ($f_from->isError()) {
324 exit_error('Error',$f_from->getErrorMessage());
326 $f_to = new Forum ($fa->GetGroupObject(),$new_forum_id);
327 if (!$f_to || !is_object($f_to)) {
328 exit_error('Error','Could Not Get Forum Object');
329 } elseif ($f_to->isError()) {
330 exit_error('Error',$f_to->getErrorMessage());
333 $ff = new ForumFactory($g);
334 if (!$ff || !is_object($ff) || $ff->isError()) {
335 exit_error(_('Error'),$ff->getErrorMessage());
338 if ($ff->moveThread($new_forum_id,$thread_id,$forum_id)) {
339 $feedback .= sprintf(_('Thread successfully moved from %1$s forum to %2$s forum'), $f_from->getName(),$f_to->getName());
341 $feedback .= $ff->getErrorMessage();
345 forum_header(array('title'=>_('Edit a Message')));
346 echo '<p><a href="/forum/forum.php?forum_id=' . $new_forum_id . '">Return to the forum</a></p>';
347 echo '<p><a href="/forum/forum.php?thread_id='.$thread_id.'&forum_id=' . $new_forum_id . '">Return to the thread</a></p>';
348 forum_footer(array());
349 } elseif (getStringFromRequest("cancel")) {
350 // the user cancelled the request, go back to forum
351 if ($return_to_message) {
352 header("Location: /forum/message.php?msg_id=$msg_id");
354 header("Location: /forum/forum.php?thread_id=$thread_id&forum_id=$forum_id");
358 // Display select box to select new forum
360 forum_header(array('title'=>_('Forums: Administration')));
362 $ff = new ForumFactory($g);
363 if (!$ff || !is_object($ff) || $ff->isError()) {
364 exit_error(_("Error"),$ff->getErrorMessage());
367 $farr =& $ff->getForums();
369 if ($ff->isError()) {
370 echo '<h1>'.sprintf(_('No Forums Found For %s'), $g->getPublicName()) .'</h1>';
371 echo $ff->getErrorMessage();
372 forum_footer(array());
377 List the existing forums so they can be edited.
381 for ($j = 0; $j < count($farr); $j++) {
382 if (!is_object($farr[$j])) {
383 //just skip it - this object should never have been placed here
384 } elseif ($farr[$j]->isError()) {
385 echo $farr[$j]->getErrorMessage();
387 $forums[$farr[$j]->getID()] = $farr[$j]->getName();
391 $f_from = new Forum ($fa->GetGroupObject(),$forum_id);
392 if (!$f_from || !is_object($f_from)) {
393 exit_error('Error','Could Not Get Forum Object');
394 } elseif ($f_from->isError()) {
395 exit_error('Error',$f_from->getErrorMessage());
399 <form action="'.getStringFromServer('PHP_SELF').'" method="post">
400 <h3>' . sprintf(_('Move thread from %s forum to the following forum:'), $f_from->getName()) . '</h3>
402 <input type="hidden" name="movethread" value="'.$thread_id.'" />
403 <input type="hidden" name="group_id" value="'.$group_id.'" />
404 <input type="hidden" name="forum_id" value="'.$forum_id.'" />
405 <input type="hidden" name="msg_id" value="'.$msg_id.'" />
406 <input type="hidden" name="return_to_message" value="'.$return_to_message.'" />' .
407 html_build_select_box_from_assoc($forums,'new_forum_id',$forum_id) .
409 <input type="submit" name="ok" value="' . _("Submit") . '" />
410 <input type="submit" name="cancel" value="' . _("Cancel") . '" />
415 forum_footer(array());
420 Show main page for choosing
421 either moderator or delete
423 forum_header(array('title'=>_('Forums: Administration')));
428 $fa = new ForumAdmin($g->getID());
430 $fa->PrintAdminOptions();
433 plugin_hook ("blocks", "forum index");
436 // Get existing forums
438 $ff=new ForumFactory($g);
439 if (!$ff || !is_object($ff) || $ff->isError()) {
440 exit_error(_('Error'),$ff->getErrorMessage());
443 $farr =& $ff->getForumsAdmin();
445 if ($ff->isError()) {
446 echo '<h1>'.sprintf(_('No Forums Found For %1$s'), $g->getPublicName()) .'</h1>';
447 echo $ff->getErrorMessage();
448 forum_footer(array());
453 List the existing forums so they can be edited.
456 for ($j = 0; $j < count($farr); $j++) {
457 if (!is_object($farr[$j])) {
458 //just skip it - this object should never have been placed here
459 } elseif ($farr[$j]->isError()) {
460 echo $farr[$j]->getErrorMessage();
462 echo '<p><a href="'.getStringFromServer('PHP_SELF').'?group_id='.$group_id.'&change_status=1&group_forum_id='. $farr[$j]->getID() .'">'.
463 $farr[$j]->getName() .'</a><br />'.$farr[$j]->getDescription().'<br /><a href="monitor.php?group_id='.$group_id.'&group_forum_id='. $farr[$j]->getID() .'">'.
464 _('Monitoring Users').'</a></p>';
468 forum_footer(array());
473 // c-file-style: "bsd"