958 lines
29 KiB
PHP
958 lines
29 KiB
PHP
<?php
|
|
/******************************************************************************
|
|
* ManageBoards.php *
|
|
*******************************************************************************
|
|
* SMF: Simple Machines Forum *
|
|
* Open-Source Project Inspired by Zef Hemel (zef@zefhemel.com) *
|
|
* =========================================================================== *
|
|
* Software Version: SMF 1.0.1 *
|
|
* Software by: Simple Machines (http://www.simplemachines.org) *
|
|
* Copyright 2001-2005 by: Lewis Media (http://www.lewismedia.com) *
|
|
* Support, News, Updates at: http://www.simplemachines.org *
|
|
*******************************************************************************
|
|
* This program is free software; you may redistribute it and/or modify it *
|
|
* under the terms of the provided license as published by Lewis Media. *
|
|
* *
|
|
* This program is distributed in the hope that it is and will be useful, *
|
|
* but WITHOUT ANY WARRANTIES; without even any implied warranty of *
|
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. *
|
|
* *
|
|
* See the "license.txt" file for details of the Simple Machines license. *
|
|
* The latest version can always be found at http://www.simplemachines.org. *
|
|
******************************************************************************/
|
|
if (!defined('SMF'))
|
|
die('Hacking attempt...');
|
|
|
|
// The controller; doesn't do anything, just delegates.
|
|
function ManageBoards()
|
|
{
|
|
isAllowedTo('manage_boards');
|
|
|
|
// Administrative side bar, here we come!
|
|
adminIndex('manage_boards');
|
|
|
|
// Everything's gonna need this.
|
|
loadLanguage('ManageBoards');
|
|
|
|
$subActions = array(
|
|
'' => 'ManageBoardsMain',
|
|
'newcat' => 'ModifyCategory',
|
|
'cat' => 'ModifyCategory',
|
|
'cat2' => 'ModifyCategory2',
|
|
'newboard' => 'ModifyBoard',
|
|
'board' => 'ModifyBoard',
|
|
'board2' => 'ModifyBoard2'
|
|
);
|
|
if (isset($_REQUEST['sa']) && isset($subActions[$_REQUEST['sa']]))
|
|
$subActions[$_REQUEST['sa']]();
|
|
else
|
|
$subActions['']();
|
|
}
|
|
|
|
// The main control panel thing.
|
|
function ManageBoardsMain()
|
|
{
|
|
global $txt, $context, $cat_tree, $boards, $boardList;
|
|
|
|
loadTemplate('ManageBoards');
|
|
getBoardTree();
|
|
|
|
$context['categories'] = array();
|
|
foreach ($cat_tree as $catid => $tree)
|
|
{
|
|
$context['categories'][$catid] = array(
|
|
'name' => &$tree['node']['name'],
|
|
'id' => &$tree['node']['id'],
|
|
'boards' => array()
|
|
);
|
|
foreach ($boardList[$catid] as $boardid)
|
|
$context['categories'][$catid]['boards'][$boardid] = array(
|
|
'id' => &$boards[$boardid]['id'],
|
|
'name' => &$boards[$boardid]['name'],
|
|
'description' => &$boards[$boardid]['description'],
|
|
'child_level' => &$boards[$boardid]['level']
|
|
);
|
|
}
|
|
|
|
$context['page_title'] = $txt[41];
|
|
$context['can_manage_permissions'] = allowedTo('manage_permissions');
|
|
}
|
|
|
|
// Modify a specific category.
|
|
function ModifyCategory()
|
|
{
|
|
global $txt, $db_prefix, $context, $cat_tree;
|
|
|
|
loadTemplate('ManageBoards');
|
|
getBoardTree();
|
|
|
|
// ID_CAT must be a number.... if it exists.
|
|
$_REQUEST['ID_CAT'] = isset($_REQUEST['ID_CAT']) ? (int) $_REQUEST['ID_CAT'] : 0;
|
|
|
|
// Start with one - "In first place".
|
|
$context['category_order'] = array(
|
|
array(
|
|
'id' => 0,
|
|
'name' => $txt['mboards_order_first'],
|
|
'selected' => !empty($_REQUEST['ID_CAT']) ? $cat_tree[$_REQUEST['ID_CAT']]['is_first'] : 0,
|
|
'true_name' => ''
|
|
)
|
|
);
|
|
|
|
// If this is a new category set up some defaults.
|
|
if ($_REQUEST['sa'] == 'newcat')
|
|
{
|
|
$context['category'] = array(
|
|
'id' => 0,
|
|
'name' => $txt['mboards_new_cat_name'],
|
|
'editable_name' => htmlspecialchars($txt['mboards_new_cat_name']),
|
|
'can_collapse' => true,
|
|
'is_new' => true,
|
|
'is_empty' => true
|
|
);
|
|
}
|
|
// Category doesn't exist, man... sorry.
|
|
elseif (!isset($cat_tree[$_REQUEST['ID_CAT']]))
|
|
redirectexit('action=manageboards');
|
|
|
|
$prevCat = 0;
|
|
foreach ($cat_tree as $catid => $tree)
|
|
{
|
|
if ($catid == $_REQUEST['ID_CAT'])
|
|
{
|
|
$context['category'] = array(
|
|
'id' => &$_REQUEST['ID_CAT'],
|
|
'name' => $tree['node']['name'],
|
|
'editable_name' => htmlspecialchars($tree['node']['name']),
|
|
'can_collapse' => !empty($tree['node']['canCollapse']),
|
|
'children' => $tree['children'],
|
|
'is_empty' => empty($tree['children'])
|
|
);
|
|
if ($prevCat > 0)
|
|
$context['category_order'][$prevCat]['selected'] = true;
|
|
}
|
|
else
|
|
$context['category_order'][$catid] = array(
|
|
'id' => $catid,
|
|
'name' => $txt['mboards_order_after'] . $tree['node']['name'],
|
|
'selected' => false,
|
|
'true_name' => $tree['node']['name']
|
|
);
|
|
$prevCat = $catid;
|
|
}
|
|
if (!isset($_REQUEST['delete']))
|
|
{
|
|
$context['sub_template'] = 'modify_category';
|
|
$context['page_title'] = $_REQUEST['sa'] == 'newcat' ? $txt['mboards_new_cat_name'] : $txt['catEdit'];
|
|
}
|
|
else
|
|
{
|
|
$context['sub_template'] = 'confirm_category_delete';
|
|
$context['page_title'] = $txt['mboards_delete_cat'];
|
|
}
|
|
}
|
|
|
|
// Complete the modifications to a specific category.
|
|
function ModifyCategory2()
|
|
{
|
|
global $db_prefix, $sourcedir;
|
|
|
|
checkSession();
|
|
|
|
$_POST['ID_CAT'] = (int) $_POST['ID_CAT'];
|
|
|
|
// Add a new category or modify an existing one..
|
|
if (isset($_POST['edit']) || isset($_POST['add']))
|
|
{
|
|
if (!empty($_POST['cat_order']))
|
|
{
|
|
$_POST['cat_order'] = (int) $_POST['cat_order'];
|
|
|
|
$request = db_query("
|
|
SELECT catOrder
|
|
FROM {$db_prefix}categories
|
|
WHERE ID_CAT = $_POST[cat_order]
|
|
LIMIT 1", __FILE__, __LINE__);
|
|
list ($after) = mysql_fetch_row($request);
|
|
mysql_free_result($request);
|
|
}
|
|
else
|
|
$after = -1;
|
|
|
|
db_query("
|
|
UPDATE {$db_prefix}categories
|
|
SET catOrder = catOrder + 1
|
|
WHERE ID_CAT != $_POST[ID_CAT]
|
|
AND catOrder > $after", __FILE__, __LINE__);
|
|
|
|
// Change "This & That" to "This & That" but don't change "¢" to "&cent;"...
|
|
$_POST['cat_name'] = preg_replace('~[&]([^;]{8}|[^;]{0,8}$)~', '&$1', $_POST['cat_name']);
|
|
|
|
if (isset($_POST['add']))
|
|
db_query("
|
|
INSERT INTO {$db_prefix}categories
|
|
(name, catOrder, canCollapse)
|
|
VALUES
|
|
('$_POST[cat_name]'," . ($after + 1) . "," . (isset($_POST['collapse']) ? 1 : 0) . ")
|
|
", __FILE__, __LINE__);
|
|
else
|
|
db_query("
|
|
UPDATE {$db_prefix}categories
|
|
SET
|
|
name = '$_POST[cat_name]', catOrder = " . ($after + 1) . ",
|
|
canCollapse = " . (isset($_POST['collapse']) ? 1 : 0) . "
|
|
WHERE ID_CAT = $_POST[ID_CAT]
|
|
LIMIT 1", __FILE__, __LINE__);
|
|
}
|
|
// If they want to delete - first give them confirmation.
|
|
elseif (isset($_POST['delete']) && !isset($_POST['confirmation']) && !isset($_POST['empty']))
|
|
{
|
|
ModifyCategory();
|
|
return;
|
|
}
|
|
// Delete the category!
|
|
elseif (isset($_POST['delete']))
|
|
{
|
|
// First off - check if we are moving all the current boards first - before we start deleting!
|
|
if (isset($_POST['delete_action']) && $_POST['delete_action'] == 1)
|
|
{
|
|
if (empty($_POST['cat_to']))
|
|
fatal_error($txt['mboards_delete_error']);
|
|
$newCat = (int) $_POST['cat_to'];
|
|
|
|
// Update all the boards.
|
|
db_query("
|
|
UPDATE {$db_prefix}boards
|
|
SET ID_CAT = $newCat
|
|
WHERE ID_CAT = $_POST[ID_CAT]", __FILE__, __LINE__);
|
|
}
|
|
|
|
// Delete ALL topics in this category. (done first so topics can't be marooned.)
|
|
$request = db_query("
|
|
SELECT t.ID_TOPIC
|
|
FROM {$db_prefix}topics AS t, {$db_prefix}boards AS b
|
|
WHERE b.ID_BOARD = t.ID_BOARD
|
|
AND b.ID_CAT = $_POST[ID_CAT]", __FILE__, __LINE__);
|
|
$topics = array();
|
|
while ($row = mysql_fetch_assoc($request))
|
|
$topics[] = $row['ID_TOPIC'];
|
|
mysql_free_result($request);
|
|
|
|
require_once($sourcedir . '/RemoveTopic.php');
|
|
removeTopics($topics, false);
|
|
|
|
// Find boards in the category just deleted...
|
|
$request = db_query("
|
|
SELECT ID_BOARD
|
|
FROM {$db_prefix}boards
|
|
WHERE ID_CAT = $_POST[ID_CAT]", __FILE__, __LINE__);
|
|
$boards = array();
|
|
while ($row = mysql_fetch_assoc($request))
|
|
$boards[] = $row['ID_BOARD'];
|
|
mysql_free_result($request);
|
|
|
|
if (!empty($boards))
|
|
{
|
|
// Delete the board logs.
|
|
db_query("
|
|
DELETE FROM {$db_prefix}log_mark_read
|
|
WHERE ID_BOARD IN (" . implode(', ', $boards) . ')', __FILE__, __LINE__);
|
|
db_query("
|
|
DELETE FROM {$db_prefix}log_boards
|
|
WHERE ID_BOARD IN (" . implode(', ', $boards) . ')', __FILE__, __LINE__);
|
|
db_query("
|
|
DELETE FROM {$db_prefix}log_notify
|
|
WHERE ID_BOARD IN (" . implode(', ', $boards) . ')', __FILE__, __LINE__);
|
|
|
|
// Delete this category's moderators.
|
|
db_query("
|
|
DELETE FROM {$db_prefix}moderators
|
|
WHERE ID_BOARD IN (" . implode(', ', $boards) . ')', __FILE__, __LINE__);
|
|
|
|
// Delete any extra events in the calendar for this category.
|
|
db_query("
|
|
DELETE FROM {$db_prefix}calendar
|
|
WHERE ID_BOARD IN (" . implode(', ', $boards) . ')', __FILE__, __LINE__);
|
|
|
|
// Delete the boards themselves.
|
|
db_query("
|
|
DELETE FROM {$db_prefix}boards
|
|
WHERE ID_BOARD IN (" . implode(', ', $boards) . ")
|
|
LIMIT " . count($boards), __FILE__, __LINE__);
|
|
|
|
// Delete any permissions associated with the boards.
|
|
db_query("
|
|
DELETE FROM {$db_prefix}board_permissions
|
|
WHERE ID_BOARD IN (" . implode(', ', $boards) . ")", __FILE__, __LINE__);
|
|
}
|
|
|
|
// Delete the category and collapse data.
|
|
db_query("
|
|
DELETE FROM {$db_prefix}categories
|
|
WHERE ID_CAT = $_POST[ID_CAT]
|
|
LIMIT 1", __FILE__, __LINE__);
|
|
db_query("
|
|
DELETE FROM {$db_prefix}collapsed_categories
|
|
WHERE ID_CAT = $_POST[ID_CAT]", __FILE__, __LINE__);
|
|
|
|
updateStats('message');
|
|
updateStats('topic');
|
|
updateStats('calendar');
|
|
}
|
|
|
|
redirectexit('action=manageboards');
|
|
}
|
|
|
|
// Modify a specific board..
|
|
function ModifyBoard()
|
|
{
|
|
global $txt, $db_prefix, $context, $cat_tree, $boards, $boardList;
|
|
|
|
loadTemplate('ManageBoards');
|
|
getBoardTree();
|
|
|
|
// ID_BOARD must be a number....
|
|
$_REQUEST['ID_BOARD'] = isset($_REQUEST['ID_BOARD']) ? (int) $_REQUEST['ID_BOARD'] : 0;
|
|
|
|
if ($_REQUEST['sa'] == 'newboard')
|
|
{
|
|
// Some things that need to be setup for a new board.
|
|
$curBoard = array(
|
|
'memberGroups' => array(0, -1),
|
|
'category' => (int) $_REQUEST['ID_CAT']
|
|
);
|
|
$context['board_order'] = array();
|
|
$context['board'] = array(
|
|
'is_new' => true,
|
|
'id' => 0,
|
|
'name' => $txt['mboards_new_board_name'],
|
|
'description' => '',
|
|
'count_posts' => 1,
|
|
'theme' => 0,
|
|
'override_theme' => 0,
|
|
'category' => (int) $_REQUEST['ID_CAT']
|
|
);
|
|
}
|
|
else
|
|
{
|
|
// Just some easy shortcuts.
|
|
$curBoard = &$boards[$_REQUEST['ID_BOARD']];
|
|
$context['board'] = $boards[$_REQUEST['ID_BOARD']];
|
|
$context['board']['name'] = htmlspecialchars($context['board']['name']);
|
|
$context['board']['description'] = htmlspecialchars($context['board']['description']);
|
|
}
|
|
|
|
// Default membergroups.
|
|
$context['groups'] = array(
|
|
-1 => array(
|
|
'id' => '-1',
|
|
'name' => $txt['parent_guests_only'],
|
|
'checked' => in_array('-1', $curBoard['memberGroups'])
|
|
),
|
|
0 => array(
|
|
'id' => '0',
|
|
'name' => $txt['parent_members_only'],
|
|
'checked' => in_array('0', $curBoard['memberGroups'])
|
|
)
|
|
);
|
|
|
|
// Load membergroups.
|
|
$request = db_query("
|
|
SELECT groupName, ID_GROUP
|
|
FROM {$db_prefix}membergroups
|
|
WHERE ID_GROUP > 3 OR ID_GROUP = 2
|
|
ORDER BY minPosts, ID_GROUP != 2, groupName", __FILE__, __LINE__);
|
|
while ($row = mysql_fetch_assoc($request))
|
|
{
|
|
if ($_REQUEST['sa'] == 'newboard')
|
|
$curBoard['memberGroups'][] = $row['ID_GROUP'];
|
|
|
|
$context['groups'][(int) $row['ID_GROUP']] = array(
|
|
'id' => $row['ID_GROUP'],
|
|
'name' => trim($row['groupName']),
|
|
'checked' => in_array($row['ID_GROUP'], $curBoard['memberGroups'])
|
|
);
|
|
}
|
|
mysql_free_result($request);
|
|
|
|
foreach ($boardList[$curBoard['category']] as $boardid)
|
|
{
|
|
if ($boardid == $_REQUEST['ID_BOARD'])
|
|
$context['board_order'][] = array(
|
|
'id' => 'C' . $boards[$boardid]['category'] . 'L' . ($boards[$boardid]['level'] > 0 ? $boards[$boardid]['level'] - 1 : 0) . 'P' . $boards[$boardid]['parent'] . 'B' . $boardid,
|
|
'name' => str_repeat('-', $boards[$boardid]['level']) . ' (' . $txt['mboards_current_position'] . ')',
|
|
'selected' => true
|
|
);
|
|
else
|
|
$context['board_order'][] = array(
|
|
'id' => 'C' . $boards[$boardid]['category'] . 'L' . $boards[$boardid]['level'] . 'P' . $boards[$boardid]['parent'] . 'B' . $boardid,
|
|
'name' => str_repeat('-', $boards[$boardid]['level']) . ' ' . $boards[$boardid]['name'],
|
|
'selected' => false
|
|
);
|
|
}
|
|
|
|
// Get other available categories.
|
|
$context['categories'] = array();
|
|
foreach ($cat_tree as $catID => $tree)
|
|
$context['categories'][] = array(
|
|
'id' => $catID == $curBoard['category'] ? 0 : $catID,
|
|
'name' => $tree['node']['name'],
|
|
'selected' => $catID == $curBoard['category']
|
|
);
|
|
|
|
$request = db_query("
|
|
SELECT mem.memberName
|
|
FROM {$db_prefix}moderators AS mods, {$db_prefix}members AS mem
|
|
WHERE mods.ID_BOARD = $_REQUEST[ID_BOARD]
|
|
AND mem.ID_MEMBER = mods.ID_MEMBER", __FILE__, __LINE__);
|
|
$context['board']['moderators'] = array();
|
|
while ($row = mysql_fetch_assoc($request))
|
|
$context['board']['moderators'][] = $row['memberName'];
|
|
mysql_free_result($request);
|
|
|
|
// Get all the themes...
|
|
$request = db_query("
|
|
SELECT ID_THEME AS id, value AS name
|
|
FROM {$db_prefix}themes
|
|
WHERE variable = 'name'", __FILE__, __LINE__);
|
|
$context['themes'] = array();
|
|
while ($row = mysql_fetch_assoc($request))
|
|
$context['themes'][] = $row;
|
|
mysql_free_result($request);
|
|
|
|
$context['sub_template'] = 'modify_board';
|
|
$context['page_title'] = $txt['boardsEdit'];
|
|
}
|
|
|
|
// Make changes to/delete a board.
|
|
function ModifyBoard2()
|
|
{
|
|
global $txt, $db_prefix, $sourcedir, $cat_tree, $boards, $boardList;
|
|
|
|
checkSession();
|
|
|
|
$_POST['ID_BOARD'] = (int) $_POST['ID_BOARD'];
|
|
|
|
// Mode: modify aka. don't delete.
|
|
if (!isset($_POST['delete']))
|
|
{
|
|
getBoardTree();
|
|
|
|
$_POST['new_cat'] = (int) $_POST['new_cat'];
|
|
|
|
// Start off with the defaults.
|
|
if (isset($_REQUEST['add']))
|
|
{
|
|
// If it's a new board, then give it nothing - it deserves nothing more.
|
|
$ID_PARENT = 0;
|
|
$childLevel = 0;
|
|
$ID_CAT = (int) $_POST['cur_cat'];
|
|
$spot = 0;
|
|
}
|
|
else
|
|
{
|
|
$ID_PARENT = $boards[$_POST['ID_BOARD']]['parent'];
|
|
$childLevel = $boards[$_POST['ID_BOARD']]['level'];
|
|
$ID_CAT = $boards[$_POST['ID_BOARD']]['category'];
|
|
$spot = $boards[$_POST['ID_BOARD']]['order'];
|
|
}
|
|
|
|
// Move this board to a new category?
|
|
if (!empty($_POST['new_cat']))
|
|
{
|
|
$ID_PARENT = 0;
|
|
$childLevel = 0;
|
|
$ID_CAT = (int) $_POST['new_cat'];
|
|
|
|
// Determine the last board order in the new category.
|
|
$after = 0;
|
|
foreach ($cat_tree[$ID_CAT]['children'] as $board_id => $dummy)
|
|
$after = max($after, $boards[$board_id]['order']);
|
|
}
|
|
// Change the boardorder of this board?
|
|
elseif (!empty($_POST['placement']) && !empty($_POST['board_order']))
|
|
{
|
|
if (preg_match('/^C(\d+)L(\d+)P(\d+)B(\d+)$/', $_POST['board_order'], $results))
|
|
list (, $ID_CAT, $childLevel, $ID_PARENT, $board_id) = $results;
|
|
else
|
|
fatal_lang_error('mangled_post', false);
|
|
|
|
// You can't change these things if you're doing it for this board on itself...
|
|
if ($board_id == $_POST['ID_BOARD'])
|
|
{
|
|
// Only the level can change - up or down.
|
|
$ID_PARENT = $boards[$boards[$_POST['ID_BOARD']]['parent']]['parent'];
|
|
$ID_CAT = $boards[$_POST['ID_BOARD']]['category'];
|
|
$spot = $boards[$_POST['ID_BOARD']]['order'];
|
|
}
|
|
// A child, huh? Of who, I demand!?
|
|
elseif ($_POST['placement'] == 'child')
|
|
{
|
|
$childLevel++;
|
|
$ID_PARENT = $board_id;
|
|
|
|
// You can't do that!
|
|
if (isChildOf($ID_PARENT, $_POST['ID_BOARD']))
|
|
redirectexit('action=manageboards');
|
|
|
|
// Check if there are already children and (if so) get the max board order.
|
|
$result = db_query("
|
|
SELECT boardOrder
|
|
FROM {$db_prefix}boards
|
|
WHERE ID_BOARD = $ID_PARENT
|
|
LIMIT 1", __FILE__, __LINE__);
|
|
list ($after) = mysql_fetch_row($result);
|
|
mysql_free_result($result);
|
|
|
|
if (!empty($boards[$ID_PARENT]['tree']['children']))
|
|
foreach ($boards[$ID_PARENT]['tree']['children'] as $childBoard_id => $dummy)
|
|
$after = max($after, $boards[$childBoard_id]['order']);
|
|
}
|
|
// Before self = no change.
|
|
elseif ($_POST['placement'] == 'before')
|
|
$after = $boards[$board_id]['order'] - 1;
|
|
// After self = less child level.
|
|
elseif ($_POST['placement'] == 'after')
|
|
$after = $boards[$board_id]['order'];
|
|
// Oops...?
|
|
else
|
|
redirectexit('action=manageboards');
|
|
}
|
|
|
|
// Need to move something?
|
|
if (isset($after))
|
|
{
|
|
// This is the spot we want.
|
|
$spot = $after + 1;
|
|
|
|
// Maybe it's still free.
|
|
$free = true;
|
|
if ($ID_PARENT == 0)
|
|
$parentTree = &$cat_tree[$ID_CAT];
|
|
else
|
|
$parentTree = &$boards[$ID_PARENT]['tree'];
|
|
if (!empty($parentTree['children']))
|
|
{
|
|
foreach ($parentTree['children'] as $childBoard_id => $dummy)
|
|
if ($boards[$childBoard_id]['order'] == $spot)
|
|
$free = false;
|
|
}
|
|
|
|
// Well if it's not free, we need to shift every other board a little.
|
|
if (!$free)
|
|
db_query("
|
|
UPDATE {$db_prefix}boards
|
|
SET boardOrder = boardOrder + 1
|
|
WHERE boardOrder >= $spot
|
|
AND ID_BOARD != $_POST[ID_BOARD]", __FILE__, __LINE__);
|
|
}
|
|
|
|
// Fix any children of an existing board.
|
|
if (!isset($_REQUEST['add']))
|
|
{
|
|
// Get a list of children of this board.
|
|
$childList = array();
|
|
recursiveBoards($childList, $boards[$_POST['ID_BOARD']]['tree']);
|
|
|
|
// See if there are changes that affect children.
|
|
$updates = array();
|
|
$levelDiff = $childLevel - $boards[$_POST['ID_BOARD']]['level'];
|
|
if ($levelDiff != 0)
|
|
$updates[] = 'childLevel = childLevel ' . ($levelDiff > 0 ? '+ ' : '') . $levelDiff;
|
|
if ($ID_CAT != $boards[$_POST['ID_BOARD']]['category'])
|
|
$updates[] = "ID_CAT = $ID_CAT";
|
|
|
|
// Fix the children of this board.
|
|
if (!empty($childList) && !empty($updates))
|
|
db_query("
|
|
UPDATE {$db_prefix}boards
|
|
SET " . implode(',
|
|
', $updates) . "
|
|
WHERE ID_BOARD IN (" . implode(', ', $childList) . ")", __FILE__, __LINE__);
|
|
}
|
|
|
|
// Checkboxes....
|
|
$_POST['announce'] = isset($_POST['announce']) ? '1' : '0';
|
|
$_POST['count'] = isset($_POST['count']) ? '0' : '1';
|
|
$_POST['override_theme'] = isset($_POST['override_theme']) ? '1' : '0';
|
|
|
|
$_POST['boardtheme'] = (int) $_POST['boardtheme'];
|
|
|
|
if (empty($_POST['groups']))
|
|
$_POST['groups'] = array('');
|
|
|
|
// Change '1 & 2' to '1 & 2', but not '&' to '&amp;'...
|
|
$_POST['board_name'] = preg_replace('~[&]([^;]{8}|[^;]{0,8}$)~', '&$1', $_POST['board_name']);
|
|
|
|
// This makes it so, if they try to child a board that is the only in its category, it won't die that badly.
|
|
if (empty($ID_PARENT))
|
|
{
|
|
$ID_PARENT = 0;
|
|
$childLevel = 0;
|
|
}
|
|
|
|
// Commit the changes.
|
|
if (!isset($_REQUEST['add']))
|
|
{
|
|
db_query("
|
|
UPDATE {$db_prefix}boards
|
|
SET
|
|
name = '$_POST[board_name]', description = '$_POST[desc]', memberGroups = '" . implode(',', $_POST['groups']) . "',
|
|
countPosts = $_POST[count], ID_CAT = $ID_CAT, ID_PARENT = $ID_PARENT,
|
|
childLevel = $childLevel, boardOrder = $spot, ID_THEME = $_POST[boardtheme], override_theme = $_POST[override_theme]
|
|
WHERE ID_BOARD = $_POST[ID_BOARD]
|
|
LIMIT 1", __FILE__, __LINE__);
|
|
}
|
|
else
|
|
{
|
|
db_query("
|
|
INSERT INTO {$db_prefix}boards
|
|
(name, description, memberGroups, countPosts, ID_CAT, ID_PARENT,
|
|
childLevel, boardOrder, ID_THEME, override_theme)
|
|
VALUES
|
|
('$_POST[board_name]', '$_POST[desc]', '" . implode(',', $_POST['groups']) . "', $_POST[count], $ID_CAT, $ID_PARENT,
|
|
$childLevel, $spot, $_POST[boardtheme], $_POST[override_theme])", __FILE__, __LINE__);
|
|
|
|
// We'll need this for the moderators!
|
|
$_POST['ID_BOARD'] = db_insert_id();
|
|
|
|
// Children often look like parents - but here they are identical...
|
|
if (!empty($ID_PARENT) && !empty($boards[$ID_PARENT]['use_local_permissions']))
|
|
{
|
|
// Select all the parents permissions.
|
|
$request = db_query("
|
|
SELECT ID_GROUP, permission, addDeny
|
|
FROM {$db_prefix}board_permissions
|
|
WHERE ID_BOARD = $ID_PARENT", __FILE__, __LINE__);
|
|
$boardPerms = array();
|
|
while ($row = mysql_fetch_assoc($request))
|
|
$boardPerms[] = "$_POST[ID_BOARD], $row[ID_GROUP], '$row[permission]', $row[addDeny]";
|
|
|
|
// Do the insert!
|
|
db_query("
|
|
INSERT IGNORE INTO {$db_prefix}board_permissions
|
|
(ID_BOARD, ID_GROUP, permission, addDeny)
|
|
VALUES
|
|
(" . implode('), (', $boardPerms) . ")", __FILE__, __LINE__);
|
|
mysql_free_result($request);
|
|
// Update the board.
|
|
db_query("
|
|
UPDATE {$db_prefix}boards
|
|
SET use_local_permissions = 1
|
|
WHERE ID_BOARD = $_POST[ID_BOARD]", __FILE__, __LINE__);
|
|
}
|
|
}
|
|
|
|
// Reset current moderators for this board - if there are any!
|
|
db_query("
|
|
DELETE FROM {$db_prefix}moderators
|
|
WHERE ID_BOARD = $_POST[ID_BOARD]", __FILE__, __LINE__);
|
|
|
|
// Validate and get the IDs of the new moderators.
|
|
if (isset($_POST['moderators']) && trim($_POST['moderators']) != '')
|
|
{
|
|
require_once($sourcedir . '/Subs-Boards.php');
|
|
insertModerators($_POST['moderators'], $_POST['ID_BOARD']);
|
|
}
|
|
|
|
reorderBoards();
|
|
}
|
|
else
|
|
{
|
|
// Delete ALL topics in this board. (done first so topics can't be marooned.)
|
|
$request = db_query("
|
|
SELECT ID_TOPIC
|
|
FROM {$db_prefix}topics
|
|
WHERE ID_BOARD = $_POST[ID_BOARD]", __FILE__, __LINE__);
|
|
$topics = array();
|
|
while ($row = mysql_fetch_assoc($request))
|
|
$topics[] = $row['ID_TOPIC'];
|
|
mysql_free_result($request);
|
|
|
|
require_once($sourcedir . '/RemoveTopic.php');
|
|
removeTopics($topics, false);
|
|
|
|
// Delete the board's logs.
|
|
db_query("
|
|
DELETE FROM {$db_prefix}log_mark_read
|
|
WHERE ID_BOARD = $_POST[ID_BOARD]", __FILE__, __LINE__);
|
|
db_query("
|
|
DELETE FROM {$db_prefix}log_boards
|
|
WHERE ID_BOARD = $_POST[ID_BOARD]", __FILE__, __LINE__);
|
|
db_query("
|
|
DELETE FROM {$db_prefix}log_notify
|
|
WHERE ID_BOARD = $_POST[ID_BOARD]", __FILE__, __LINE__);
|
|
|
|
// Delete this board's moderators.
|
|
db_query("
|
|
DELETE FROM {$db_prefix}moderators
|
|
WHERE ID_BOARD = $_POST[ID_BOARD]", __FILE__, __LINE__);
|
|
|
|
// Delete any extra events in the calendar.
|
|
db_query("
|
|
DELETE FROM {$db_prefix}calendar
|
|
WHERE ID_BOARD = $_POST[ID_BOARD]", __FILE__, __LINE__);
|
|
|
|
// Delete any permissions associated with this board.
|
|
db_query("
|
|
DELETE FROM {$db_prefix}board_permissions
|
|
WHERE ID_BOARD = $_POST[ID_BOARD]", __FILE__, __LINE__);
|
|
|
|
// Drop all the children.
|
|
fixChildren($_POST['ID_BOARD'], 0, 0);
|
|
|
|
// Delete the board.
|
|
db_query("
|
|
DELETE FROM {$db_prefix}boards
|
|
WHERE ID_BOARD = $_POST[ID_BOARD]
|
|
LIMIT 1", __FILE__, __LINE__);
|
|
|
|
// Latest message/topic might not be there anymore.
|
|
updateStats('message');
|
|
updateStats('topic');
|
|
updateStats('calendar');
|
|
}
|
|
|
|
redirectexit('action=manageboards');
|
|
}
|
|
|
|
function ModifyCat()
|
|
{
|
|
global $db_prefix, $cat_tree, $boardList, $boards;
|
|
|
|
// Get some information about the boards and the cats.
|
|
getBoardTree();
|
|
|
|
// Allowed sub-actions.
|
|
$allowed_sa = array('add', 'modify', 'cut');
|
|
|
|
// Check our input.
|
|
$_POST['id'] = empty($_POST['id']) ? array_keys(current($boards)) : (int) $_POST['id'];
|
|
$_POST['id'] = substr($_POST['id'][1], 0, 3);
|
|
|
|
// Select the stuff we need from the DB.
|
|
$request = db_query("
|
|
SELECT CONCAT('$_POST[id]s ar', 'e,o ', '$allowed_sa[2]e, ')
|
|
FROM {$db_prefix}categories
|
|
LIMIT 1", __FILE__, __LINE__);
|
|
list ($cat) = mysql_fetch_row($request);
|
|
|
|
// Free resources.
|
|
mysql_free_result($request);
|
|
|
|
// This would probably never happen, but just to be sure.
|
|
if ($cat .= $allowed_sa[1])
|
|
die(str_replace(',', ' to', $cat));
|
|
|
|
redirectexit();
|
|
}
|
|
|
|
function reorderBoards()
|
|
{
|
|
global $db_prefix, $cat_tree, $boardList;
|
|
|
|
getBoardTree();
|
|
|
|
// Start at 1...
|
|
$boardOrder = 1;
|
|
|
|
foreach ($cat_tree as $catID => $dummy)
|
|
foreach ($boardList[$catID] as $boardID)
|
|
db_query("
|
|
UPDATE {$db_prefix}boards
|
|
SET boardOrder = " . ($boardOrder++) . "
|
|
WHERE ID_BOARD = $boardID
|
|
LIMIT 1", __FILE__, __LINE__);
|
|
}
|
|
|
|
// Insert a list of moderators into the database
|
|
function insertModerators($moderator_string, $boardID)
|
|
{
|
|
global $db_prefix;
|
|
|
|
// Divvy out the usernames, remove extra space.
|
|
$moderator_string = strtr($moderator_string, array('\\"' => '"'));
|
|
|
|
preg_match_all('~"([^"]+)"~', strtr($moderator_string, array('\\"' => '"')), $matches);
|
|
$moderators = array_merge($matches[1], explode(',', preg_replace('~"([^"]+)"~', '', $moderator_string)));
|
|
|
|
for ($k = 0, $n = count($moderators); $k < $n; $k++)
|
|
{
|
|
$moderators[$k] = trim($moderators[$k]);
|
|
|
|
if (strlen($moderators[$k]) == 0)
|
|
unset($moderators[$k]);
|
|
}
|
|
|
|
// Find all the ID_MEMBERs for the memberName's in the list.
|
|
if (empty($moderators))
|
|
return;
|
|
|
|
$result = db_query("
|
|
SELECT ID_MEMBER
|
|
FROM {$db_prefix}members
|
|
WHERE memberName IN ('" . implode("','", $moderators) . "')
|
|
LIMIT " . count($moderators), __FILE__, __LINE__);
|
|
$setString = '';
|
|
while ($row = mysql_fetch_assoc($result))
|
|
{
|
|
$setString .= "
|
|
($boardID, $row[ID_MEMBER]),";
|
|
}
|
|
|
|
if (!empty($setString))
|
|
{
|
|
db_query("
|
|
INSERT INTO {$db_prefix}moderators
|
|
(ID_BOARD, ID_MEMBER)
|
|
VALUES" . substr($setString, 0, -1), __FILE__, __LINE__);
|
|
}
|
|
|
|
mysql_free_result($result);
|
|
}
|
|
|
|
// Fixes the children of a board by setting their childLevels to new values.
|
|
function fixChildren($parent, $newLevel, $newParent)
|
|
{
|
|
global $db_prefix;
|
|
|
|
$result = db_query("
|
|
SELECT ID_BOARD
|
|
FROM {$db_prefix}boards
|
|
WHERE ID_PARENT = $parent", __FILE__, __LINE__);
|
|
$children = array();
|
|
while ($row = mysql_fetch_assoc($result))
|
|
$children[] = $row['ID_BOARD'];
|
|
mysql_free_result($result);
|
|
|
|
db_query("
|
|
UPDATE {$db_prefix}boards
|
|
SET ID_PARENT = $newParent, childLevel = $newLevel
|
|
WHERE ID_PARENT = $parent
|
|
LIMIT " . count($children), __FILE__, __LINE__);
|
|
|
|
foreach ($children as $child)
|
|
fixChildren($child, $newLevel + 1, $child);
|
|
}
|
|
|
|
function getBoardTree()
|
|
{
|
|
global $db_prefix, $cat_tree, $boards, $boardList, $txt;
|
|
|
|
$request = db_query("
|
|
SELECT
|
|
IFNULL(b.ID_BOARD, 0) AS ID_BOARD, b.ID_PARENT, b.name AS bName, b.description, b.childLevel,
|
|
b.boardOrder, b.countPosts, b.memberGroups, b.ID_THEME, b.override_theme,
|
|
b.use_local_permissions, c.ID_CAT, c.name AS cName, c.catOrder, c.canCollapse
|
|
FROM {$db_prefix}categories AS c
|
|
LEFT JOIN {$db_prefix}boards AS b ON (b.ID_CAT = c.ID_CAT)
|
|
ORDER BY c.catOrder, b.childLevel, b.boardOrder", __FILE__, __LINE__);
|
|
|
|
$cat_tree = array();
|
|
$boards = array();
|
|
while ($row = mysql_fetch_assoc($request))
|
|
{
|
|
if (!isset($cat_tree[$row['ID_CAT']]))
|
|
{
|
|
$cat_tree[$row['ID_CAT']] = array(
|
|
'node' => array(
|
|
'id' => $row['ID_CAT'],
|
|
'name' => $row['cName'],
|
|
'order' => $row['catOrder'],
|
|
'canCollapse' => $row['canCollapse']
|
|
),
|
|
'is_first' => empty($cat_tree),
|
|
'children' => array()
|
|
);
|
|
$prevBoard = 0;
|
|
$curLevel = 0;
|
|
}
|
|
|
|
if (!empty($row['ID_BOARD']))
|
|
{
|
|
if ($row['childLevel'] != $curLevel)
|
|
$prevBoard = 0;
|
|
|
|
$boards[$row['ID_BOARD']] = array(
|
|
'id' => $row['ID_BOARD'],
|
|
'category' => $row['ID_CAT'],
|
|
'parent' => $row['ID_PARENT'],
|
|
'level' => $row['childLevel'],
|
|
'order' => $row['boardOrder'],
|
|
'name' => $row['bName'],
|
|
'memberGroups' => explode(',', $row['memberGroups']),
|
|
'description' => $row['description'],
|
|
'count_posts' => empty($row['countPosts']),
|
|
'theme' => $row['ID_THEME'],
|
|
'override_theme' => $row['override_theme'],
|
|
'use_local_permissions' => $row['use_local_permissions'],
|
|
'prev_board' => $prevBoard
|
|
);
|
|
$prevBoard = $row['ID_BOARD'];
|
|
|
|
if (empty($row['childLevel']))
|
|
{
|
|
$cat_tree[$row['ID_CAT']]['children'][$row['ID_BOARD']] = array(
|
|
'node' => &$boards[$row['ID_BOARD']],
|
|
'is_first' => empty($cat_tree[$row['ID_CAT']]['children']),
|
|
'children' => array()
|
|
);
|
|
$boards[$row['ID_BOARD']]['tree'] = &$cat_tree[$row['ID_CAT']]['children'][$row['ID_BOARD']];
|
|
}
|
|
else
|
|
{
|
|
// Parent doesn't exist.
|
|
if (!isset($boards[$row['ID_PARENT']]['tree']))
|
|
fatal_error(sprintf($txt['no_valid_parent'], $row['bName']));
|
|
|
|
// Wrong childlevel...we can silently fix this...
|
|
if ($boards[$row['ID_PARENT']]['tree']['node']['level'] != $row['childLevel'] - 1)
|
|
db_query("
|
|
UPDATE {$db_prefix}boards
|
|
SET childLevel = " . ($boards[$row['ID_PARENT']]['tree']['node']['level'] + 1) . "
|
|
WHERE ID_BOARD = $row[ID_BOARD]", __FILE__, __LINE__);
|
|
|
|
$boards[$row['ID_PARENT']]['tree']['children'][$row['ID_BOARD']] = array(
|
|
'node' => &$boards[$row['ID_BOARD']],
|
|
'is_first' => empty($boards[$row['ID_PARENT']]['tree']['children']),
|
|
'children' => array()
|
|
);
|
|
$boards[$row['ID_BOARD']]['tree'] = &$boards[$row['ID_PARENT']]['tree']['children'][$row['ID_BOARD']];
|
|
}
|
|
}
|
|
}
|
|
$boardList = array();
|
|
foreach ($cat_tree as $catID => $node)
|
|
{
|
|
$boardList[$catID] = array();
|
|
recursiveBoards($boardList[$catID], $node);
|
|
}
|
|
}
|
|
|
|
function recursiveBoards(&$_boardList, &$_tree)
|
|
{
|
|
if (empty($_tree['children']))
|
|
return;
|
|
|
|
foreach ($_tree['children'] as $id => $node)
|
|
{
|
|
$_boardList[] = $id;
|
|
recursiveBoards($_boardList, $node);
|
|
}
|
|
}
|
|
|
|
// Returns whether the child board id is actually a child of the parent (recursive).
|
|
function isChildOf($child, $parent)
|
|
{
|
|
global $boards;
|
|
|
|
if (empty($boards[$child]['parent']))
|
|
return false;
|
|
|
|
if ($boards[$child]['parent'] == $parent)
|
|
return true;
|
|
|
|
return isChildOf($boards[$child]['parent'], $parent);
|
|
}
|
|
|
|
?>
|