Chris@76: $cat) Chris@76: if ($index != $cat_order[$cat]) Chris@76: $smcFunc['db_query']('', ' Chris@76: UPDATE {db_prefix}categories Chris@76: SET cat_order = {int:new_order} Chris@76: WHERE id_cat = {int:current_category}', Chris@76: array( Chris@76: 'new_order' => $index, Chris@76: 'current_category' => $cat, Chris@76: ) Chris@76: ); Chris@76: Chris@76: // If the category order changed, so did the board order. Chris@76: require_once($sourcedir . '/Subs-Boards.php'); Chris@76: reorderBoards(); Chris@76: } Chris@76: Chris@76: if (isset($catOptions['cat_name'])) Chris@76: { Chris@76: $catUpdates[] = 'name = {string:cat_name}'; Chris@76: $catParameters['cat_name'] = $catOptions['cat_name']; Chris@76: } Chris@76: Chris@76: // Can a user collapse this category or is it too important? Chris@76: if (isset($catOptions['is_collapsible'])) Chris@76: { Chris@76: $catUpdates[] = 'can_collapse = {int:is_collapsible}'; Chris@76: $catParameters['is_collapsible'] = $catOptions['is_collapsible'] ? 1 : 0; Chris@76: } Chris@76: Chris@76: // Do the updates (if any). Chris@76: if (!empty($catUpdates)) Chris@76: { Chris@76: $smcFunc['db_query']('', ' Chris@76: UPDATE {db_prefix}categories Chris@76: SET Chris@76: ' . implode(', Chris@76: ', $catUpdates) . ' Chris@76: WHERE id_cat = {int:current_category}', Chris@76: array_merge($catParameters, array( Chris@76: 'current_category' => $category_id, Chris@76: )) Chris@76: ); Chris@76: Chris@76: if (empty($catOptions['dont_log'])) Chris@76: logAction('edit_cat', array('catname' => isset($catOptions['cat_name']) ? $catOptions['cat_name'] : $category_id), 'admin'); Chris@76: } Chris@76: } Chris@76: Chris@76: // Create a new category. Chris@76: function createCategory($catOptions) Chris@76: { Chris@76: global $smcFunc; Chris@76: Chris@76: // Check required values. Chris@76: if (!isset($catOptions['cat_name']) || trim($catOptions['cat_name']) == '') Chris@76: trigger_error('createCategory(): A category name is required', E_USER_ERROR); Chris@76: Chris@76: // Set default values. Chris@76: if (!isset($catOptions['move_after'])) Chris@76: $catOptions['move_after'] = 0; Chris@76: if (!isset($catOptions['is_collapsible'])) Chris@76: $catOptions['is_collapsible'] = true; Chris@76: // Don't log an edit right after. Chris@76: $catOptions['dont_log'] = true; Chris@76: Chris@76: // Add the category to the database. Chris@76: $smcFunc['db_insert']('', Chris@76: '{db_prefix}categories', Chris@76: array( Chris@76: 'name' => 'string-48', Chris@76: ), Chris@76: array( Chris@76: $catOptions['cat_name'], Chris@76: ), Chris@76: array('id_cat') Chris@76: ); Chris@76: Chris@76: // Grab the new category ID. Chris@76: $category_id = $smcFunc['db_insert_id']('{db_prefix}categories', 'id_cat'); Chris@76: Chris@76: // Set the given properties to the newly created category. Chris@76: modifyCategory($category_id, $catOptions); Chris@76: Chris@76: logAction('add_cat', array('catname' => $catOptions['cat_name']), 'admin'); Chris@76: Chris@76: // Return the database ID of the category. Chris@76: return $category_id; Chris@76: } Chris@76: Chris@76: // Remove one or more categories. Chris@76: function deleteCategories($categories, $moveBoardsTo = null) Chris@76: { Chris@76: global $sourcedir, $smcFunc, $cat_tree; Chris@76: Chris@76: require_once($sourcedir . '/Subs-Boards.php'); Chris@76: Chris@76: getBoardTree(); Chris@76: Chris@76: // With no category set to move the boards to, delete them all. Chris@76: if ($moveBoardsTo === null) Chris@76: { Chris@76: $request = $smcFunc['db_query']('', ' Chris@76: SELECT id_board Chris@76: FROM {db_prefix}boards Chris@76: WHERE id_cat IN ({array_int:category_list})', Chris@76: array( Chris@76: 'category_list' => $categories, Chris@76: ) Chris@76: ); Chris@76: $boards_inside = array(); Chris@76: while ($row = $smcFunc['db_fetch_assoc']($request)) Chris@76: $boards_inside[] = $row['id_board']; Chris@76: $smcFunc['db_free_result']($request); Chris@76: Chris@76: if (!empty($boards_inside)) Chris@76: deleteBoards($boards_inside, null); Chris@76: } Chris@76: Chris@76: // Make sure the safe category is really safe. Chris@76: elseif (in_array($moveBoardsTo, $categories)) Chris@76: trigger_error('deleteCategories(): You cannot move the boards to a category that\'s being deleted', E_USER_ERROR); Chris@76: Chris@76: // Move the boards inside the categories to a safe category. Chris@76: else Chris@76: $smcFunc['db_query']('', ' Chris@76: UPDATE {db_prefix}boards Chris@76: SET id_cat = {int:new_parent_cat} Chris@76: WHERE id_cat IN ({array_int:category_list})', Chris@76: array( Chris@76: 'category_list' => $categories, Chris@76: 'new_parent_cat' => $moveBoardsTo, Chris@76: ) Chris@76: ); Chris@76: Chris@76: // Noone will ever be able to collapse these categories anymore. Chris@76: $smcFunc['db_query']('', ' Chris@76: DELETE FROM {db_prefix}collapsed_categories Chris@76: WHERE id_cat IN ({array_int:category_list})', Chris@76: array( Chris@76: 'category_list' => $categories, Chris@76: ) Chris@76: ); Chris@76: Chris@76: // Do the deletion of the category itself Chris@76: $smcFunc['db_query']('', ' Chris@76: DELETE FROM {db_prefix}categories Chris@76: WHERE id_cat IN ({array_int:category_list})', Chris@76: array( Chris@76: 'category_list' => $categories, Chris@76: ) Chris@76: ); Chris@76: Chris@76: // Log what we've done. Chris@76: foreach ($categories as $category) Chris@76: logAction('delete_cat', array('catname' => $cat_tree[$category]['node']['name']), 'admin'); Chris@76: Chris@76: // Get all boards back into the right order. Chris@76: reorderBoards(); Chris@76: } Chris@76: Chris@76: // Collapse, expand or toggle one or more categories for one or more members. Chris@76: function collapseCategories($categories, $new_status, $members = null, $check_collapsable = true) Chris@76: { Chris@76: global $smcFunc; Chris@76: Chris@76: // Collapse or expand the categories. Chris@76: if ($new_status === 'collapse' || $new_status === 'expand') Chris@76: { Chris@76: $smcFunc['db_query']('', ' Chris@76: DELETE FROM {db_prefix}collapsed_categories Chris@76: WHERE id_cat IN ({array_int:category_list})' . ($members === null ? '' : ' Chris@76: AND id_member IN ({array_int:member_list})'), Chris@76: array( Chris@76: 'category_list' => $categories, Chris@76: 'member_list' => $members, Chris@76: ) Chris@76: ); Chris@76: Chris@76: if ($new_status === 'collapse') Chris@76: $smcFunc['db_query']('', ' Chris@76: INSERT INTO {db_prefix}collapsed_categories Chris@76: (id_cat, id_member) Chris@76: SELECT c.id_cat, mem.id_member Chris@76: FROM {db_prefix}categories AS c Chris@76: INNER JOIN {db_prefix}members AS mem ON (' . ($members === null ? '1=1' : ' Chris@76: mem.id_member IN ({array_int:member_list})') . ') Chris@76: WHERE c.id_cat IN ({array_int:category_list})' . ($check_collapsable ? ' Chris@76: AND c.can_collapse = {int:is_collapsible}' : ''), Chris@76: array( Chris@76: 'member_list' => $members, Chris@76: 'category_list' => $categories, Chris@76: 'is_collapsible' => 1, Chris@76: ) Chris@76: ); Chris@76: } Chris@76: Chris@76: // Toggle the categories: collapsed get expanded and expanded get collapsed. Chris@76: elseif ($new_status === 'toggle') Chris@76: { Chris@76: // Get the current state of the categories. Chris@76: $updates = array( Chris@76: 'insert' => array(), Chris@76: 'remove' => array(), Chris@76: ); Chris@76: $request = $smcFunc['db_query']('', ' Chris@76: SELECT mem.id_member, c.id_cat, IFNULL(cc.id_cat, 0) AS is_collapsed, c.can_collapse Chris@76: FROM {db_prefix}members AS mem Chris@76: INNER JOIN {db_prefix}categories AS c ON (c.id_cat IN ({array_int:category_list})) Chris@76: LEFT JOIN {db_prefix}collapsed_categories AS cc ON (cc.id_cat = c.id_cat AND cc.id_member = mem.id_member) Chris@76: ' . ($members === null ? '' : ' Chris@76: WHERE mem.id_member IN ({array_int:member_list})'), Chris@76: array( Chris@76: 'category_list' => $categories, Chris@76: 'member_list' => $members, Chris@76: ) Chris@76: ); Chris@76: while ($row = $smcFunc['db_fetch_assoc']($request)) Chris@76: { Chris@76: if (empty($row['is_collapsed']) && (!empty($row['can_collapse']) || !$check_collapsable)) Chris@76: $updates['insert'][] = array($row['id_member'], $row['id_cat']); Chris@76: elseif (!empty($row['is_collapsed'])) Chris@76: $updates['remove'][] = '(id_member = ' . $row['id_member'] . ' AND id_cat = ' . $row['id_cat'] . ')'; Chris@76: } Chris@76: $smcFunc['db_free_result']($request); Chris@76: Chris@76: // Collapse the ones that were originally expanded... Chris@76: if (!empty($updates['insert'])) Chris@76: $smcFunc['db_insert']('replace', Chris@76: '{db_prefix}collapsed_categories', Chris@76: array( Chris@76: 'id_cat' => 'int', 'id_member' => 'int', Chris@76: ), Chris@76: $updates['insert'], Chris@76: array('id_cat', 'id_member') Chris@76: ); Chris@76: Chris@76: // And expand the ones that were originally collapsed. Chris@76: if (!empty($updates['remove'])) Chris@76: $smcFunc['db_query']('', ' Chris@76: DELETE FROM {db_prefix}collapsed_categories Chris@76: WHERE ' . implode(' OR ', $updates['remove']), Chris@76: array( Chris@76: ) Chris@76: ); Chris@76: } Chris@76: } Chris@76: Chris@76: ?>