acl_get('a_forum')) { return; } $file = basename(__FILE__); $module['Forums']['Manage'] = $file . $SID; return; } define('IN_PHPBB', 1); // // Include files // $phpbb_root_path = '../'; require($phpbb_root_path . 'extension.inc'); require('pagestart.' . $phpEx); include($phpbb_root_path . 'includes/functions_admin.'.$phpEx); // // Do we have forum admin permissions? // if (!$auth->acl_get('a_forum')) { message_die(MESSAGE, $lang['No_admin']); } // // Mode setting // if (isset($_POST['mode']) || isset($_GET['mode'])) { $mode = (!empty($_POST['mode'])) ? $_POST['mode'] : $_GET['mode']; } else { $mode = ''; } switch ($mode) { case 'move_up': case 'move_down': $show_index = TRUE; $forum_id = intval($_GET['f']); $result = $db->sql_query('SELECT parent_id, left_id, right_id FROM ' . FORUMS_TABLE . " WHERE forum_id = $forum_id"); if (!$row = $db->sql_fetchrow($result)) { message_die(ERROR, 'Forum does not exist'); } extract($row); $forum_info = array($forum_id => $row); // // Get the adjacent forum // if ($mode == 'move_up') { $sql = 'SELECT forum_id, left_id, right_id FROM ' . FORUMS_TABLE . " WHERE parent_id = $parent_id AND right_id < $right_id ORDER BY right_id DESC"; } else { $sql = 'SELECT forum_id, left_id, right_id FROM ' . FORUMS_TABLE . " WHERE parent_id = $parent_id AND left_id > $left_id ORDER BY left_id ASC"; } $result = $db->sql_query_limit($sql, 1); if (!$row = $db->sql_fetchrow($result)) { // // already on top or at bottom // break; } if ($mode == 'move_up') { $up_id = $forum_id; $down_id = $row['forum_id']; } else { $up_id = $row['forum_id']; $down_id = $forum_id; } $forum_info[$row['forum_id']] = $row; $diff_up = $forum_info[$up_id]['right_id'] - $forum_info[$up_id]['left_id']; $diff_down = $forum_info[$down_id]['right_id'] - $forum_info[$down_id]['left_id']; // // I should consider using transactions here // $forum_ids = array(); $sql = 'SELECT forum_id FROM ' . FORUMS_TABLE . ' WHERE left_id > ' . $forum_info[$up_id]['left_id'] . ' AND right_id < ' . $forum_info[$up_id]['right_id']; $result = $db->sql_query($sql); while ($row = $db->sql_fetchrow($result)) { $forum_ids[] = $row['forum_id']; } $sql = 'UPDATE ' . FORUMS_TABLE . ' SET left_id = left_id + ' . ($diff_up + 1) . ', right_id = right_id + ' . ($diff_up + 1) . ' WHERE left_id > ' . $forum_info[$down_id]['left_id'] . ' AND right_id < ' . $forum_info[$down_id]['right_id']; $db->sql_query($sql); if (count($forum_ids)) { $sql = 'UPDATE ' . FORUMS_TABLE . ' SET left_id = left_id - ' . ($diff_down + 1) . ', right_id = right_id - ' . ($diff_down + 1) . ' WHERE forum_id IN (' . implode(', ', $forum_ids) . ')'; $db->sql_query($sql); } $sql = 'UPDATE ' . FORUMS_TABLE . ' SET left_id = ' . $forum_info[$down_id]['left_id'] . ', right_id = ' . ($forum_info[$down_id]['left_id'] + $diff_up) . ' WHERE forum_id = ' . $up_id; $db->sql_query($sql); $sql = 'UPDATE ' . FORUMS_TABLE . ' SET left_id = ' . ($forum_info[$up_id]['right_id'] - $diff_down) . ', right_id = ' . $forum_info[$up_id]['right_id'] . ' WHERE forum_id = ' . $down_id; $db->sql_query($sql); break; case 'create': if (!trim($_POST['forum_name'])) { message_die(ERROR, 'Cannot create a forum without a name'); } $parent_id = (!empty($_POST['parent_id'])) ? $_POST['parent_id'] : 0; $forum_status = (!empty($_POST['is_category'])) ? ITEM_CATEGORY : $_POST['forum_status']; $forum_name = str_replace("\'", "''", $_POST['forum_name']); $forum_desc = str_replace("\'", "''", $_POST['forum_desc']); $forum_style = (!empty($_POST['forum_style'])) ? intval($_POST['forum_style']) : 'NULL'; $post_count_inc = (!empty($_POST['disable_post_count'])) ? 0 : 1; $prune_enable = (!empty($_POST['prune_enable'])) ? 1 : 0; $prune_days = intval($_POST['prune_days']); $prune_freq = intval($_POST['prune_freq']); $result = $db->sql_query('SELECT MAX(forum_id) AS max_id FROM ' . FORUMS_TABLE); $forum_id = $db->sql_fetchfield('max_id', 0, $result) + 1; if ($parent_id) { $result = $db->sql_query('SELECT left_id, right_id FROM ' . FORUMS_TABLE . " WHERE forum_id = $parent_id"); if (!$row = $db->sql_fetchrow($result)) { message_die(ERROR, 'Parent does not exist'); } extract($row); $db->sql_query('UPDATE ' . FORUMS_TABLE . " SET left_id = left_id + 2, right_id = right_id + 2 WHERE left_id > $right_id"); $db->sql_query('UPDATE ' . FORUMS_TABLE . " SET right_id = right_id + 2 WHERE $left_id BETWEEN left_id AND right_id"); $left_id = $right_id; ++$right_id; } else { $result = $db->sql_query('SELECT MAX(right_id) AS right_id FROM ' . FORUMS_TABLE); $left_id = $db->sql_fetchfield('right_id', 0, $result) + 1; $right_id = $left_id + 1; } $sql = 'INSERT INTO ' . FORUMS_TABLE . " (forum_id, forum_name, forum_desc, parent_id, left_id, right_id, forum_status, forum_style, post_count_inc, prune_enable, prune_days, prune_freq) VALUES ($forum_id, '$forum_name', '$forum_desc', $parent_id, $left_id, $right_id, $forum_status, $forum_style, $post_count_inc, $prune_enable, $prune_days, $prune_freq)"; $db->sql_query($sql); $message = $lang['Forums_updated'] . "

" . sprintf($lang['Click_return_forumadmin'], '', '') . '

' . sprintf($lang['Click_return_admin_index'], '', ''); message_die(MESSAGE, $message); break; case 'modify': if (!$forum_id = intval($_POST['forum_id'])) { message_die(ERROR, 'No forum specified'); } $row = get_forum_info($forum_id); $parent_id = intval($_POST['parent_id']); $action = (!empty($_POST['action'])) ? $_POST['action'] : ''; if (($row['parent_id'] != $parent_id) && ($parent_id != -1)) { move_forum($forum_id, $parent_id); } $sql = array( 'forum_name' => (!empty($_POST['forum_name'])) ? stripslashes($_POST['forum_name']) : $row['forum_name'], 'forum_desc' => (!empty($_POST['forum_desc'])) ? stripslashes($_POST['forum_desc']) : $row['forum_desc'], 'forum_status' => (!empty($_POST['set_category']) && $action) ? ITEM_CATEGORY : intval($_POST['forum_status']), 'forum_style' => (!empty($_POST['forum_style'])) ? $_POST['forum_style'] : NULL, 'parent_id' => $parent_id, 'prune_enable' => (!empty($_POST['prune_enable'])) ? 1 : 0, 'prune_days' => intval($_POST['prune_days']), 'prune_freq' => intval($_POST['prune_freq']), 'display_on_index' => (!isset($_POST['display_on_index']) || !empty($_POST['display_on_index'])) ? 1 : 0, 'post_count_inc' => (!empty($_POST['disable_post_count'])) ? 0 : 1 ); if (!empty($_POST['set_category']) && $action) { if ($action == 'move' && $_POST['to_forum_id']) { move_forum_content($forum_id, $_POST['to_forum_id']); } elseif ($action == 'delete') { delete_forum_content($forum_id); } $sql['forum_posts'] = 0; $sql['forum_topics'] = 0; } $db->sql_query_array('UPDATE ' . FORUMS_TABLE . " SET WHERE forum_id = $forum_id", $sql); $message = $lang['Forums_updated'] . "

" . sprintf($lang['Click_return_forumadmin'], '', '') . '

' . sprintf($lang['Click_return_admin_index'], '', ''); message_die(MESSAGE, $message); break; case 'remove': if (empty($_POST['submit'])) { // // wasn't this form submitted? is anyone trying to remotely delete forums // message_die(ERROR, 'Did not submit'); } $action_subforums = (!empty($_POST['action_subforums'])) ? $_POST['action_subforums'] : ''; $action_posts = (!empty($_POST['action_posts'])) ? $_POST['action_posts'] : ''; $row = get_forum_info($_GET['f']); extract($row); if ($action_posts == 'delete') { delete_forum_content($forum_id); } elseif ($action_posts == 'move') { if (empty($_POST['posts_to_id'])) { $message = $lang['No_destination_forum'] . '

' . sprintf($lang['Click_return_forumadmin'], '', ''); message_die(ERROR, $message); } move_forum_content($forum_id, $_POST['posts_to_id']); } if ($action_subforums == 'delete') { $forum_ids = array($forum_id); $rows = get_forum_branch($forum_id, 'children', 'descending', FALSE); foreach ($rows as $row) { $forum_ids[] = $row['forum_id']; delete_forum_content($row['forum_id']); } $diff = count($forum_ids) * 2; $db->sql_query('DELETE FROM ' . FORUMS_TABLE . ' WHERE forum_id IN (' . implode(', ', $forum_ids) . ')'); } elseif ($action_subforums == 'move') { if (empty($_POST['subforums_to_id'])) { $message = $lang['No_destination_forum'] . '

' . sprintf($lang['Click_return_forumadmin'], '', ''); message_die(ERROR, $message); } $result = $db->sql_query('SELECT forum_id FROM ' . FORUMS_TABLE . " WHERE parent_id = $forum_id"); while ($row = $db->sql_fetchrow($result)) { move_forum($row['forum_id'], $_POST['subforums_to_id']); } $db->sql_query('UPDATE ' . FORUMS_TABLE . ' SET parent_id = ' . $_POST['subforums_to_id'] . " WHERE parent_id = $forum_id"); $diff = 2; $db->sql_query('DELETE FROM ' . FORUMS_TABLE . " WHERE forum_id = $forum_id"); } else { $diff = 2; $db->sql_query('DELETE FROM ' . FORUMS_TABLE . " WHERE forum_id = $forum_id"); } // // Resync tree // $sql = 'UPDATE ' . FORUMS_TABLE . " SET right_id = right_id - $diff WHERE left_id < $right_id AND right_id > $right_id"; $db->sql_query($sql); $sql = 'UPDATE ' . FORUMS_TABLE . " SET left_id = left_id - $diff, right_id = right_id - $diff WHERE left_id > $right_id"; $db->sql_query($sql); $return_id = (!empty($_POST['subforums_to_id'])) ? $_POST['subforums_to_id'] : $parent_id; $message = $lang['Forum_deleted'] . '

' . sprintf($lang['Click_return_forumadmin'], '', ''); message_die(MESSAGE, $message); break; case 'forum_sync': sync('forum', intval($_GET[POST_FORUM_URL])); $show_index = TRUE; break; case 'add': case 'edit': // // Show form to create/modify a forum // if ($mode == 'edit') { $forum_id = intval($_GET['f']); $row = get_forum_info($forum_id); extract($row); $subforums_id = array(); $subforums = get_forum_branch($forum_id, 'children'); foreach ($subforums as $row) { $subforums_id[] = $row['forum_id']; } $parents_list = make_forums_list('all', $parent_id, $subforums_id); $l_title = ($forum_status != ITEM_CATEGORY) ? $lang['Edit_forum'] : $lang['Edit_category']; $newmode = 'modify'; $buttonvalue = $lang['Update']; $prune_enabled = ($prune_enable) ? 'checked="checked" ' : ''; if ($forum_status != ITEM_CATEGORY) { $forums_list = make_forums_list('forums', 0, $forum_id); } } else { $parent_id = 0; if (!empty($_POST['parent_id'])) { list($parent_id) = each($_POST['parent_id']); } $parents_list = make_forums_list('all', $parent_id); $l_title = $lang['Create_forum']; $newmode = 'create'; $buttonvalue = $lang['Create_forum']; $forum_desc = ''; $forum_style = ''; $forum_status = ITEM_UNLOCKED; $forum_name = (!empty($_POST['forum_name'][$parent_id])) ? htmlspecialchars($_POST['forum_name'][$parent_id]) : ''; $post_count_inc = TRUE; $prune_enabled = ''; $prune_days = 7; $prune_freq = 1; } $styles_list = make_styles_list($forum_style); $forumlocked = ($forum_status == ITEM_LOCKED) ? ' selected="selected"' : ''; $forumunlocked = ($forum_status == ITEM_UNLOCKED || $forum_status == ITEM_CATEGORY) ? ' selected="selected"' : ''; $forum_checked = ($forum_status != ITEM_CATEGORY) ? 'checked="checked" ' : ''; $category_checked = ($forum_status == ITEM_CATEGORY) ? 'checked="checked" ' : ''; $statuslist = '\n"; $statuslist .= '\n"; page_header($l_title); ?>

" method="post">
/>   />
/> 0) { // // if this forum is a subforum put the "display on index" checkbox // if ($parent_info = get_forum_info($parent_id)) { if ($parent_info['parent_id'] > 0 || $parent_info['forum_status'] != ITEM_CATEGORY) { ?>
/>

     
     
/>
  
  

1) { ?>
Forum Index'; $forums_nav = get_forum_branch($parent_id, 'parents', 'descending'); foreach ($forums_nav as $row) { if ($row['forum_id'] == $parent_id) { $navigation .= ' -> ' . htmlspecialchars($row['forum_name']); } else { $navigation .= ' -> ' . htmlspecialchars($row['forum_name']) . ''; } } } ?>

Manage

Here you can add, edit, delete, lock, unlock individual forums as well as set certain additional controls. If your posts and topics have got out of sync you can also resynchronise a forum. In phpBB 2.2 there are no categories, everything is forum based. Each forum can have an unlimited number of sub-forums and you can determine whether each may be posted to or not (i.e. whether it acts like an old category).


">sql_query('SELECT * FROM ' . FORUMS_TABLE . " WHERE parent_id = $parent_id ORDER BY left_id"); while ($row = $db->sql_fetchrow($result)) { // // DEBUG // $forum_title = htmlspecialchars($row['forum_name']); $forum_desc = htmlspecialchars($row['forum_desc']); $url = $phpEx . $SID . '&f=' . $row['forum_id']; $subforums = ($row['right_id'] - $row['left_id'] - 1) / 2; if ($row['forum_status'] != ITEM_CATEGORY) { $colspan = ' colspan="2"'; $forum_stats = ' '; } else { $colspan = ' colspan="4"'; $forum_stats = ' '; } if ($row['left_id'] + 1 != $row['right_id']) { $forum_title = '' . $forum_title . ''; } if ($row['forum_status'] == ITEM_CATEGORY) { ?> sql_query('SELECT * FROM ' . FORUMS_TABLE . ' WHERE parent_id = ' . $row['forum_id'] . ' ORDER BY left_id'); while ($sub_row = $db->sql_fetchrow($sub_result)) { $url = $phpEx . $SID . '&f=' . $sub_row['forum_id']; $forum_title = htmlspecialchars($sub_row['forum_name']); $forum_desc = htmlspecialchars($sub_row['forum_desc']); $subforums = ($sub_row['right_id'] - $sub_row['left_id'] - 1) / 2; if ($sub_row['forum_status'] != ITEM_CATEGORY) { $colspan = ''; $forum_stats = ' '; } else { $colspan = ' colspan="3"'; $forum_stats = ' '; } if ($sub_row['left_id'] + 1 != $sub_row['right_id']) { $forum_title = '' . $forum_title . ''; } ?>
' . $row['forum_topics'] . ' ' . $row['forum_posts'] . ' ' . $subforums . '' . $subforums . '
 
' . $sub_row['forum_topics'] . ' ' . $sub_row['forum_posts'] . ' ' . $subforums . '' . $subforums . '
>

>

sql_query($sql); if (!$row = $db->sql_fetchrow($result)) { message_die(ERROR, "Forum #$forum_id does not exist"); } return $row; } function make_forums_list($mode='all', $selected_id=0, $exclude_id=array()) { global $db; if (!is_array($exclude_id)) { $exclude_id = array($exclude_id); } $sql = 'SELECT f2.* FROM ' . FORUMS_TABLE . ' f1, ' . FORUMS_TABLE . ' f2 WHERE f1.parent_id = 0 AND f2.left_id BETWEEN f1.left_id AND f1.right_id ORDER BY f2.left_id'; $result = $db->sql_query($sql); $list = ''; $indent = array(); $current_indent = 0; while ($row = $db->sql_fetchrow($result)) { if ($row['parent_id'] == 0) { $current_indent = 0; } elseif (!isset($indent[$row['parent_id']])) { ++$current_indent; $indent[$row['parent_id']] = $current_indent; } else { $current_indent = $indent[$row['parent_id']]; } if (($mode == 'forums' && $row['forum_status'] == ITEM_CATEGORY) || ($mode == 'categories' && $row['forum_status'] != ITEM_CATEGORY) || (in_array($row['forum_id'], $exclude_id))) { continue; } if ($mode == 'all' && !$row['parent_id']) { $list .= "\n"; } $list .= '\n"; } return $list; } function make_styles_list($selected_id=0) { global $db; $list = ''; $result = $db->sql_query('SELECT style_id, style_name FROM ' . STYLES_TABLE . ' ORDER BY style_name'); while ($row = $db->sql_fetchrow($result)) { $list .= '\n"; } return $list; } function move_forum($from_id, $to_id) { global $db; $moved_forums = get_forum_branch($from_id, 'children', 'descending'); $from_data = $moved_forums[0]; $diff = count($moved_forums) * 2; $moved_ids = array(); for ($i = 0; $i < count($moved_forums); ++$i) { $moved_ids[] = $moved_forums[$i]['forum_id']; } // // Resync parents // $sql = 'UPDATE ' . FORUMS_TABLE . " SET right_id = right_id - $diff WHERE left_id < " . $from_data['right_id'] . " AND right_id > " . $from_data['right_id']; $db->sql_query($sql); // // Resync righthand side of tree // $sql = 'UPDATE ' . FORUMS_TABLE . " SET left_id = left_id - $diff, right_id = right_id - $diff WHERE left_id > " . $from_data['right_id']; $db->sql_query($sql); if ($to_id > 0) { $to_data = get_forum_info($to_id); // // Resync new parents // $sql = 'UPDATE ' . FORUMS_TABLE . " SET right_id = right_id + $diff WHERE " . $to_data['right_id'] . ' BETWEEN left_id AND right_id AND forum_id NOT IN (' . implode(', ', $moved_ids) . ')'; $db->sql_query($sql); // // Resync the righthand side of the tree // $sql = 'UPDATE ' . FORUMS_TABLE . " SET left_id = left_id + $diff, right_id = right_id + $diff WHERE left_id > " . $to_data['right_id'] . ' AND forum_id NOT IN (' . implode(', ', $moved_ids) . ')'; $db->sql_query($sql); // // Resync moved branch // $to_data['right_id'] += $diff; if ($to_data['right_id'] > $from_data['right_id']) { $diff = '+ ' . ($to_data['right_id'] - $from_data['right_id'] - 1); } else { $diff = '- ' . abs($to_data['right_id'] - $from_data['right_id'] - 1); } } else { $result = $db->sql_query('SELECT MAX(right_id) AS right_id FROM ' . FORUMS_TABLE . ' WHERE forum_id NOT IN (' . implode(', ', $moved_ids) . ')'); $right_id = $db->sql_fetchfield('right_id', 0, $result); $diff = '+ ' . ($right_id - $from_data['left_id'] + 1); } $sql = 'UPDATE ' . FORUMS_TABLE . " SET left_id = left_id $diff, right_id = right_id $diff WHERE forum_id IN (" . implode(', ', $moved_ids) . ')'; $db->sql_query($sql); } function move_forum_content($from_id, $to_id) { global $db; $db->sql_query('UPDATE ' . ACL_GROUPS_TABLE . " SET forum_id = $to_id WHERE forum_id = $from_id"); $db->sql_query('UPDATE ' . ACL_PREFETCH_TABLE . " SET forum_id = $to_id WHERE forum_id = $from_id"); $db->sql_query('UPDATE ' . LOG_MOD_TABLE . " SET forum_id = $to_id WHERE forum_id = $from_id"); $db->sql_query('UPDATE ' . POSTS_TABLE . " SET forum_id = $to_id WHERE forum_id = $from_id"); $db->sql_query('UPDATE ' . TOPICS_TABLE . " SET forum_id = $to_id WHERE forum_id = $from_id"); // // TODO: untested yet // $sql = 'SELECT t1.topic_id FROM ' .TOPICS_TABLE . ' t1 LEFT JOIN ' . TOPICS_TABLE . " t2 ON t1.topic_moved_id = t2.topic_id AND t1.forum_id = t2.forum_id WHERE t1.forum_id = $to_id"; $result = $db->sql_query($result); $topic_ids = array(); while ($row = $db->sql_fetchrow($result)) { $topic_ids[] = $row['topic_id']; } if (count($topic_ids)) { $db->sql_query('DELETE FROM ' . TOPICS_TABLE . ' WHERE topic_id IN (' . implode(', ', $topic_ids) . ')'); } sync('forum', $to_id); // // TODO: there might be conflicts in ACL tables =\ // make sure that the query that retrieves shadow topics uses the correct index (topic_type or topic_moved_id) // } function delete_forum_content($forum_id) { global $db; $db->sql_query('DELETE FROM ' . ACL_GROUPS_TABLE . " WHERE forum_id = $forum_id"); $db->sql_query('DELETE FROM ' . ACL_PREFETCH_TABLE . " WHERE forum_id = $forum_id"); $db->sql_query('DELETE FROM ' . LOG_MOD_TABLE . " WHERE forum_id = $forum_id"); $db->sql_query('DELETE FROM ' . FORUMS_WATCH_TABLE . " WHERE forum_id = $forum_id"); $ids = array(); $result = $db->sql_query('SELECT post_id FROM ' . POSTS_TABLE . " WHERE forum_id = $forum_id"); while ($row = $db->sql_fetchrow($result)) { $ids[] = $row['post_id']; } $ids = implode(',', $ids); $db->sql_freeresult(); if ($ids) { $db->sql_query('DELETE FROM ' . SEARCH_MATCH_TABLE . " WHERE post_id IN ($ids)"); $db->sql_query('DELETE FROM ' . POSTS_TABLE . " WHERE forum_id = $forum_id"); $db->sql_query('DELETE FROM ' . POSTS_TEXT_TABLE . " WHERE post_id IN ($ids)"); } $ids = array(); $result = $db->sql_query('SELECT topic_id FROM ' . TOPICS_TABLE . " WHERE forum_id = $forum_id"); while ($row = $db->sql_fetchrow($result)) { $ids[] = $row['topic_id']; } $ids = implode(',', $ids); $db->sql_freeresult(); if ($ids) { $db->sql_query('DELETE FROM ' . TOPICS_RATING_TABLE . " WHERE topic_id IN ($ids)"); $db->sql_query('DELETE FROM ' . TOPICS_WATCH_TABLE . " WHERE topic_id IN ($ids)"); $db->sql_query('DELETE FROM ' . TOPICS_TABLE . " WHERE forum_id = $forum_id"); $db->sql_query('DELETE FROM ' . TOPICS_TABLE . " WHERE topic_moved_id IN ($ids)"); } // // TODO: delete attachments // delete polls // OPTIMIZE / VACUUM table ? // } // // End function block // ------------------ ?>