Mercurial > hg > vamp-website
diff forum/Sources/Subs-Categories.php @ 76:e3e11437ecea website
Add forum code
author | Chris Cannam |
---|---|
date | Sun, 07 Jul 2013 11:25:48 +0200 |
parents | |
children |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/forum/Sources/Subs-Categories.php Sun Jul 07 11:25:48 2013 +0200 @@ -0,0 +1,332 @@ +<?php + +/** + * Simple Machines Forum (SMF) + * + * @package SMF + * @author Simple Machines http://www.simplemachines.org + * @copyright 2011 Simple Machines + * @license http://www.simplemachines.org/about/smf/license.php BSD + * + * @version 2.0 + */ + +if (!defined('SMF')) + die('Hacking attempt...'); + +/* This file contains the functions to add, modify, remove, collapse and expand + categories. + + void modifyCategory(int category_id, array catOptions) + - general function to modify the settings and position of a category. + - used by ManageBoards.php to change the settings of a category. + + int createCategory(array catOptions) + - general function to create a new category and set its position. + - allows (almost) the same options as the modifyCat() function. + - returns the ID of the newly created category. + + void deleteCategories(array categories_to_remove, moveChildrenTo = null) + - general function to delete one or more categories. + - allows to move all boards in the categories to a different category + before deleting them. + - if moveChildrenTo is set to null, all boards inside the given + categorieswill be deleted. + - deletes all information that's associated with the given categories. + - updates the statistics to reflect the new situation. + + void collapseCategories(array categories, string new_status, array members = null, bool check_collapsable = true) + - collapses or expands one or more categories for one or more members. + - if members is null, the category is collapsed/expanded for all members. + - allows three changes to the status: 'expand', 'collapse' and 'toggle'. + - if check_collapsable is set, only category allowed to be collapsed, + will be collapsed. +*/ + +// Edit the position and properties of a category. +function modifyCategory($category_id, $catOptions) +{ + global $sourcedir, $smcFunc; + + $catUpdates = array(); + $catParameters = array(); + + // Wanna change the categories position? + if (isset($catOptions['move_after'])) + { + // Store all categories in the proper order. + $cats = array(); + $cat_order = array(); + + // Setting 'move_after' to '0' moves the category to the top. + if ($catOptions['move_after'] == 0) + $cats[] = $category_id; + + // Grab the categories sorted by cat_order. + $request = $smcFunc['db_query']('', ' + SELECT id_cat, cat_order + FROM {db_prefix}categories + ORDER BY cat_order', + array( + ) + ); + while ($row = $smcFunc['db_fetch_assoc']($request)) + { + if ($row['id_cat'] != $category_id) + $cats[] = $row['id_cat']; + if ($row['id_cat'] == $catOptions['move_after']) + $cats[] = $category_id; + $cat_order[$row['id_cat']] = $row['cat_order']; + } + $smcFunc['db_free_result']($request); + + // Set the new order for the categories. + foreach ($cats as $index => $cat) + if ($index != $cat_order[$cat]) + $smcFunc['db_query']('', ' + UPDATE {db_prefix}categories + SET cat_order = {int:new_order} + WHERE id_cat = {int:current_category}', + array( + 'new_order' => $index, + 'current_category' => $cat, + ) + ); + + // If the category order changed, so did the board order. + require_once($sourcedir . '/Subs-Boards.php'); + reorderBoards(); + } + + if (isset($catOptions['cat_name'])) + { + $catUpdates[] = 'name = {string:cat_name}'; + $catParameters['cat_name'] = $catOptions['cat_name']; + } + + // Can a user collapse this category or is it too important? + if (isset($catOptions['is_collapsible'])) + { + $catUpdates[] = 'can_collapse = {int:is_collapsible}'; + $catParameters['is_collapsible'] = $catOptions['is_collapsible'] ? 1 : 0; + } + + // Do the updates (if any). + if (!empty($catUpdates)) + { + $smcFunc['db_query']('', ' + UPDATE {db_prefix}categories + SET + ' . implode(', + ', $catUpdates) . ' + WHERE id_cat = {int:current_category}', + array_merge($catParameters, array( + 'current_category' => $category_id, + )) + ); + + if (empty($catOptions['dont_log'])) + logAction('edit_cat', array('catname' => isset($catOptions['cat_name']) ? $catOptions['cat_name'] : $category_id), 'admin'); + } +} + +// Create a new category. +function createCategory($catOptions) +{ + global $smcFunc; + + // Check required values. + if (!isset($catOptions['cat_name']) || trim($catOptions['cat_name']) == '') + trigger_error('createCategory(): A category name is required', E_USER_ERROR); + + // Set default values. + if (!isset($catOptions['move_after'])) + $catOptions['move_after'] = 0; + if (!isset($catOptions['is_collapsible'])) + $catOptions['is_collapsible'] = true; + // Don't log an edit right after. + $catOptions['dont_log'] = true; + + // Add the category to the database. + $smcFunc['db_insert']('', + '{db_prefix}categories', + array( + 'name' => 'string-48', + ), + array( + $catOptions['cat_name'], + ), + array('id_cat') + ); + + // Grab the new category ID. + $category_id = $smcFunc['db_insert_id']('{db_prefix}categories', 'id_cat'); + + // Set the given properties to the newly created category. + modifyCategory($category_id, $catOptions); + + logAction('add_cat', array('catname' => $catOptions['cat_name']), 'admin'); + + // Return the database ID of the category. + return $category_id; +} + +// Remove one or more categories. +function deleteCategories($categories, $moveBoardsTo = null) +{ + global $sourcedir, $smcFunc, $cat_tree; + + require_once($sourcedir . '/Subs-Boards.php'); + + getBoardTree(); + + // With no category set to move the boards to, delete them all. + if ($moveBoardsTo === null) + { + $request = $smcFunc['db_query']('', ' + SELECT id_board + FROM {db_prefix}boards + WHERE id_cat IN ({array_int:category_list})', + array( + 'category_list' => $categories, + ) + ); + $boards_inside = array(); + while ($row = $smcFunc['db_fetch_assoc']($request)) + $boards_inside[] = $row['id_board']; + $smcFunc['db_free_result']($request); + + if (!empty($boards_inside)) + deleteBoards($boards_inside, null); + } + + // Make sure the safe category is really safe. + elseif (in_array($moveBoardsTo, $categories)) + trigger_error('deleteCategories(): You cannot move the boards to a category that\'s being deleted', E_USER_ERROR); + + // Move the boards inside the categories to a safe category. + else + $smcFunc['db_query']('', ' + UPDATE {db_prefix}boards + SET id_cat = {int:new_parent_cat} + WHERE id_cat IN ({array_int:category_list})', + array( + 'category_list' => $categories, + 'new_parent_cat' => $moveBoardsTo, + ) + ); + + // Noone will ever be able to collapse these categories anymore. + $smcFunc['db_query']('', ' + DELETE FROM {db_prefix}collapsed_categories + WHERE id_cat IN ({array_int:category_list})', + array( + 'category_list' => $categories, + ) + ); + + // Do the deletion of the category itself + $smcFunc['db_query']('', ' + DELETE FROM {db_prefix}categories + WHERE id_cat IN ({array_int:category_list})', + array( + 'category_list' => $categories, + ) + ); + + // Log what we've done. + foreach ($categories as $category) + logAction('delete_cat', array('catname' => $cat_tree[$category]['node']['name']), 'admin'); + + // Get all boards back into the right order. + reorderBoards(); +} + +// Collapse, expand or toggle one or more categories for one or more members. +function collapseCategories($categories, $new_status, $members = null, $check_collapsable = true) +{ + global $smcFunc; + + // Collapse or expand the categories. + if ($new_status === 'collapse' || $new_status === 'expand') + { + $smcFunc['db_query']('', ' + DELETE FROM {db_prefix}collapsed_categories + WHERE id_cat IN ({array_int:category_list})' . ($members === null ? '' : ' + AND id_member IN ({array_int:member_list})'), + array( + 'category_list' => $categories, + 'member_list' => $members, + ) + ); + + if ($new_status === 'collapse') + $smcFunc['db_query']('', ' + INSERT INTO {db_prefix}collapsed_categories + (id_cat, id_member) + SELECT c.id_cat, mem.id_member + FROM {db_prefix}categories AS c + INNER JOIN {db_prefix}members AS mem ON (' . ($members === null ? '1=1' : ' + mem.id_member IN ({array_int:member_list})') . ') + WHERE c.id_cat IN ({array_int:category_list})' . ($check_collapsable ? ' + AND c.can_collapse = {int:is_collapsible}' : ''), + array( + 'member_list' => $members, + 'category_list' => $categories, + 'is_collapsible' => 1, + ) + ); + } + + // Toggle the categories: collapsed get expanded and expanded get collapsed. + elseif ($new_status === 'toggle') + { + // Get the current state of the categories. + $updates = array( + 'insert' => array(), + 'remove' => array(), + ); + $request = $smcFunc['db_query']('', ' + SELECT mem.id_member, c.id_cat, IFNULL(cc.id_cat, 0) AS is_collapsed, c.can_collapse + FROM {db_prefix}members AS mem + INNER JOIN {db_prefix}categories AS c ON (c.id_cat IN ({array_int:category_list})) + LEFT JOIN {db_prefix}collapsed_categories AS cc ON (cc.id_cat = c.id_cat AND cc.id_member = mem.id_member) + ' . ($members === null ? '' : ' + WHERE mem.id_member IN ({array_int:member_list})'), + array( + 'category_list' => $categories, + 'member_list' => $members, + ) + ); + while ($row = $smcFunc['db_fetch_assoc']($request)) + { + if (empty($row['is_collapsed']) && (!empty($row['can_collapse']) || !$check_collapsable)) + $updates['insert'][] = array($row['id_member'], $row['id_cat']); + elseif (!empty($row['is_collapsed'])) + $updates['remove'][] = '(id_member = ' . $row['id_member'] . ' AND id_cat = ' . $row['id_cat'] . ')'; + } + $smcFunc['db_free_result']($request); + + // Collapse the ones that were originally expanded... + if (!empty($updates['insert'])) + $smcFunc['db_insert']('replace', + '{db_prefix}collapsed_categories', + array( + 'id_cat' => 'int', 'id_member' => 'int', + ), + $updates['insert'], + array('id_cat', 'id_member') + ); + + // And expand the ones that were originally collapsed. + if (!empty($updates['remove'])) + $smcFunc['db_query']('', ' + DELETE FROM {db_prefix}collapsed_categories + WHERE ' . implode(' OR ', $updates['remove']), + array( + ) + ); + } +} + +?> \ No newline at end of file