function delete_forum($forum_id, $action_posts = 'delete', $action_subforums = 'delete', $posts_to_id = 0, $subforums_to_id = 0)
{
global $db, $user, $cache, $phpbb_log;
$forum_data = $this->get_forum_info($forum_id);
$errors = array();
$log_action_posts = $log_action_forums = $posts_to_name = $subforums_to_name = '';
$forum_ids = array($forum_id);
if ($action_posts == 'delete') {
$log_action_posts = 'POSTS';
$errors = array_merge($errors, $this->delete_forum_content($forum_id));
} else {
if ($action_posts == 'move') {
if (!$posts_to_id) {
$errors[] = $user->lang['NO_DESTINATION_FORUM'];
} else {
$log_action_posts = 'MOVE_POSTS';
$sql = 'SELECT forum_name
FROM ' . FORUMS_TABLE . '
WHERE forum_id = ' . $posts_to_id;
$result = $db->sql_query($sql);
$row = $db->sql_fetchrow($result);
$db->sql_freeresult($result);
if (!$row) {
$errors[] = $user->lang['NO_FORUM'];
} else {
$posts_to_name = $row['forum_name'];
$errors = array_merge($errors, $this->move_forum_content($forum_id, $posts_to_id));
}
}
}
}
if (sizeof($errors)) {
return $errors;
}
if ($action_subforums == 'delete') {
$log_action_forums = 'FORUMS';
$rows = get_forum_branch($forum_id, 'children', 'descending', false);
foreach ($rows as $row) {
$forum_ids[] = $row['forum_id'];
$errors = array_merge($errors, $this->delete_forum_content($row['forum_id']));
}
if (sizeof($errors)) {
return $errors;
}
$diff = sizeof($forum_ids) * 2;
$sql = 'DELETE FROM ' . FORUMS_TABLE . '
WHERE ' . $db->sql_in_set('forum_id', $forum_ids);
$db->sql_query($sql);
$sql = 'DELETE FROM ' . ACL_GROUPS_TABLE . '
WHERE ' . $db->sql_in_set('forum_id', $forum_ids);
$db->sql_query($sql);
$sql = 'DELETE FROM ' . ACL_USERS_TABLE . '
WHERE ' . $db->sql_in_set('forum_id', $forum_ids);
$db->sql_query($sql);
} else {
if ($action_subforums == 'move') {
if (!$subforums_to_id) {
$errors[] = $user->lang['NO_DESTINATION_FORUM'];
} else {
$log_action_forums = 'MOVE_FORUMS';
$sql = 'SELECT forum_name
FROM ' . FORUMS_TABLE . '
WHERE forum_id = ' . $subforums_to_id;
$result = $db->sql_query($sql);
$row = $db->sql_fetchrow($result);
$db->sql_freeresult($result);
if (!$row) {
$errors[] = $user->lang['NO_FORUM'];
} else {
$subforums_to_name = $row['forum_name'];
$sql = 'SELECT forum_id
FROM ' . FORUMS_TABLE . "\n\t\t\t\t\t\tWHERE parent_id = {$forum_id}";
$result = $db->sql_query($sql);
while ($row = $db->sql_fetchrow($result)) {
$this->move_forum($row['forum_id'], $subforums_to_id);
}
$db->sql_freeresult($result);
// Grab new forum data for correct tree updating later
$forum_data = $this->get_forum_info($forum_id);
$sql = 'UPDATE ' . FORUMS_TABLE . "\n\t\t\t\t\t\tSET parent_id = {$subforums_to_id}\n\t\t\t\t\t\tWHERE parent_id = {$forum_id}";
$db->sql_query($sql);
$diff = 2;
$sql = 'DELETE FROM ' . FORUMS_TABLE . "\n\t\t\t\t\t\tWHERE forum_id = {$forum_id}";
$db->sql_query($sql);
$sql = 'DELETE FROM ' . ACL_GROUPS_TABLE . "\n\t\t\t\t\t\tWHERE forum_id = {$forum_id}";
$db->sql_query($sql);
$sql = 'DELETE FROM ' . ACL_USERS_TABLE . "\n\t\t\t\t\t\tWHERE forum_id = {$forum_id}";
$db->sql_query($sql);
}
}
if (sizeof($errors)) {
return $errors;
}
} else {
$diff = 2;
$sql = 'DELETE FROM ' . FORUMS_TABLE . "\n\t\t\t\tWHERE forum_id = {$forum_id}";
$db->sql_query($sql);
$sql = 'DELETE FROM ' . ACL_GROUPS_TABLE . "\n\t\t\t\tWHERE forum_id = {$forum_id}";
$db->sql_query($sql);
$sql = 'DELETE FROM ' . ACL_USERS_TABLE . "\n\t\t\t\tWHERE forum_id = {$forum_id}";
$db->sql_query($sql);
}
}
// Resync tree
$sql = 'UPDATE ' . FORUMS_TABLE . "\n\t\t\tSET right_id = right_id - {$diff}\n\t\t\tWHERE left_id < {$forum_data['right_id']} AND right_id > {$forum_data['right_id']}";
$db->sql_query($sql);
$sql = 'UPDATE ' . FORUMS_TABLE . "\n\t\t\tSET left_id = left_id - {$diff}, right_id = right_id - {$diff}\n\t\t\tWHERE left_id > {$forum_data['right_id']}";
$db->sql_query($sql);
// Delete forum ids from extension groups table
$sql = 'SELECT group_id, allowed_forums
FROM ' . EXTENSION_GROUPS_TABLE;
$result = $db->sql_query($sql);
while ($row = $db->sql_fetchrow($result)) {
if (!$row['allowed_forums']) {
continue;
}
$allowed_forums = unserialize(trim($row['allowed_forums']));
$allowed_forums = array_diff($allowed_forums, $forum_ids);
$sql = 'UPDATE ' . EXTENSION_GROUPS_TABLE . "\n\t\t\t\tSET allowed_forums = '" . (sizeof($allowed_forums) ? serialize($allowed_forums) : '') . "'\n\t\t\t\tWHERE group_id = {$row['group_id']}";
$db->sql_query($sql);
}
$db->sql_freeresult($result);
$cache->destroy('_extensions');
$log_action = implode('_', array($log_action_posts, $log_action_forums));
switch ($log_action) {
case 'MOVE_POSTS_MOVE_FORUMS':
$phpbb_log->add('admin', $user->data['user_id'], $user->ip, 'LOG_FORUM_DEL_MOVE_POSTS_MOVE_FORUMS', false, array($posts_to_name, $subforums_to_name, $forum_data['forum_name']));
break;
case 'MOVE_POSTS_FORUMS':
$phpbb_log->add('admin', $user->data['user_id'], $user->ip, 'LOG_FORUM_DEL_MOVE_POSTS_FORUMS', false, array($posts_to_name, $forum_data['forum_name']));
break;
case 'POSTS_MOVE_FORUMS':
$phpbb_log->add('admin', $user->data['user_id'], $user->ip, 'LOG_FORUM_DEL_POSTS_MOVE_FORUMS', false, array($subforums_to_name, $forum_data['forum_name']));
break;
case '_MOVE_FORUMS':
$phpbb_log->add('admin', $user->data['user_id'], $user->ip, 'LOG_FORUM_DEL_MOVE_FORUMS', false, array($subforums_to_name, $forum_data['forum_name']));
break;
case 'MOVE_POSTS_':
$phpbb_log->add('admin', $user->data['user_id'], $user->ip, 'LOG_FORUM_DEL_MOVE_POSTS', false, array($posts_to_name, $forum_data['forum_name']));
break;
case 'POSTS_FORUMS':
$phpbb_log->add('admin', $user->data['user_id'], $user->ip, 'LOG_FORUM_DEL_POSTS_FORUMS', false, array($forum_data['forum_name']));
break;
case '_FORUMS':
$phpbb_log->add('admin', $user->data['user_id'], $user->ip, 'LOG_FORUM_DEL_FORUMS', false, array($forum_data['forum_name']));
break;
case 'POSTS_':
$phpbb_log->add('admin', $user->data['user_id'], $user->ip, 'LOG_FORUM_DEL_POSTS', false, array($forum_data['forum_name']));
break;
default:
$phpbb_log->add('admin', $user->data['user_id'], $user->ip, 'LOG_FORUM_DEL_FORUM', false, array($forum_data['forum_name']));
break;
}
return $errors;
}