diff options
Diffstat (limited to 'admin')
-rw-r--r-- | admin/cat_modify.php | 5 | ||||
-rw-r--r-- | admin/cat_move.php | 117 | ||||
-rw-r--r-- | admin/include/functions.php | 135 |
3 files changed, 212 insertions, 45 deletions
diff --git a/admin/cat_modify.php b/admin/cat_modify.php index 18aff772f..0d82c13d4 100644 --- a/admin/cat_modify.php +++ b/admin/cat_modify.php @@ -67,7 +67,10 @@ if (isset($_POST['submit'])) if (isset($_POST['parent'])) { - move_category($_GET['cat_id'], $_POST['parent']); + move_categories( + array($_GET['cat_id']), + $_POST['parent'] + ); } array_push($page['infos'], $lang['editcat_confirm']); diff --git a/admin/cat_move.php b/admin/cat_move.php new file mode 100644 index 000000000..7760b6494 --- /dev/null +++ b/admin/cat_move.php @@ -0,0 +1,117 @@ +<?php +// +-----------------------------------------------------------------------+ +// | PhpWebGallery - a PHP based picture gallery | +// | Copyright (C) 2002-2003 Pierrick LE GALL - pierrick@phpwebgallery.net | +// | Copyright (C) 2003-2005 PhpWebGallery Team - http://phpwebgallery.net | +// +-----------------------------------------------------------------------+ +// | branch : BSF (Best So Far) +// | file : $RCSfile$ +// | last update : $Date$ +// | last modifier : $Author$ +// | revision : $Revision$ +// +-----------------------------------------------------------------------+ +// | This program is free software; you can redistribute it and/or modify | +// | it under the terms of the GNU General Public License as published by | +// | the Free Software Foundation | +// | | +// | This program is distributed in the hope that it will be useful, but | +// | WITHOUT ANY WARRANTY; without even the implied warranty of | +// | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU | +// | General Public License for more details. | +// | | +// | You should have received a copy of the GNU General Public License | +// | along with this program; if not, write to the Free Software | +// | Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, | +// | USA. | +// +-----------------------------------------------------------------------+ + +if (!defined('PHPWG_ROOT_PATH')) +{ + die('Hacking attempt!'); +} +include_once(PHPWG_ROOT_PATH.'admin/include/isadmin.inc.php'); + +// +-----------------------------------------------------------------------+ +// | functions | +// +-----------------------------------------------------------------------+ + + +// +-----------------------------------------------------------------------+ +// | categories movement | +// +-----------------------------------------------------------------------+ + +if (isset($_POST['submit'])) +{ + if (count($_POST['selection']) > 0) + { + // TODO: tests + move_categories($_POST['selection'], $_POST['parent']); + } + else + { + array_push( + $page['errors'], + l10n('Select at least one category') + ); + } +} + +// +-----------------------------------------------------------------------+ +// | template initialization | +// +-----------------------------------------------------------------------+ + +$template->set_filenames( + array( + 'cat_move' => 'admin/cat_move.tpl' + ) + ); + +$template->assign_vars( + array( + 'F_ACTION' => add_session_id(PHPWG_ROOT_PATH.'admin.php?page=cat_move'), + ) + ); + +// +-----------------------------------------------------------------------+ +// | Categories display | +// +-----------------------------------------------------------------------+ + +$query = ' +SELECT id,name,uppercats,global_rank + FROM '.CATEGORIES_TABLE.' + WHERE dir IS NULL +;'; + +display_select_cat_wrapper( + $query, + array(), + 'category_option_selection' + ); + +$blockname = 'category_option_parent'; + +$template->assign_block_vars( + $blockname, + array( + 'VALUE'=> 0, + 'OPTION' => '------------' + ) + ); + +$query = ' +SELECT id,name,uppercats,global_rank + FROM '.CATEGORIES_TABLE.' +;'; + +display_select_cat_wrapper( + $query, + array(), + $blockname + ); + +// +-----------------------------------------------------------------------+ +// | sending html code | +// +-----------------------------------------------------------------------+ + +$template->assign_var_from_handle('ADMIN_CONTENT', 'cat_move'); +?> diff --git a/admin/include/functions.php b/admin/include/functions.php index 2b7abb094..56c1bf761 100644 --- a/admin/include/functions.php +++ b/admin/include/functions.php @@ -1337,36 +1337,78 @@ SELECT element_id, } /** - * change the parent category of the given category. The category is + * change the parent category of the given categories. The categories are * supposed virtual. * - * @param int category identifier + * @param array category identifiers * @param int parent category identifier * @return void */ -function move_category($category_id, $new_parent = -1) +function move_categories($category_ids, $new_parent = -1) { - // verifies if the move is necessary - $query = ' -SELECT id_uppercat, status - FROM '.CATEGORIES_TABLE.' - WHERE id = '.$category_id.' -;'; - list($old_parent, $status) = mysql_fetch_row(pwg_query($query)); + global $page; + + if (count($category_ids) == 0) + { + return; + } - $old_parent = empty($old_parent) ? 'NULL' : $old_parent; $new_parent = $new_parent < 1 ? 'NULL' : $new_parent; - if ($new_parent == $old_parent) + $categories = array(); + + $query = ' +SELECT id, id_uppercat, status, uppercats + FROM '.CATEGORIES_TABLE.' + WHERE id IN ('.implode(',', $category_ids).') +;'; + $result = pwg_query($query); + while ($row = mysql_fetch_array($result)) { - // no need to move ! - return; + $categories[$row['id']] = + array( + 'parent' => empty($row['id_uppercat']) ? 'NULL' : $row['id_uppercat'], + 'status' => $row['status'], + 'uppercats' => $row['uppercats'] + ); } + // is the movement possible? The movement is impossible if you try to move + // a category in a sub-category or itself + if ('NULL' != $new_parent) + { + $query = ' +SELECT uppercats + FROM '.CATEGORIES_TABLE.' + WHERE id = '.$new_parent.' +;'; + list($new_parent_uppercats) = mysql_fetch_row(pwg_query($query)); + + foreach ($categories as $category) + { + // technically, you can't move a category with uppercats 12,125,13,14 + // into a new parent category with uppercats 12,125,13,14,24 + if (preg_match('/^'.$category['uppercats'].'/', $new_parent_uppercats)) + { + array_push( + $page['errors'], + l10n('You cannot move a category in its own sub category') + ); + return; + } + } + } + + $tables = + array( + USER_ACCESS_TABLE => 'user_id', + GROUP_ACCESS_TABLE => 'group_id' + ); + $query = ' UPDATE '.CATEGORIES_TABLE.' SET id_uppercat = '.$new_parent.' - WHERE id = '.$category_id.' + WHERE id IN ('.implode(',', $category_ids).') ;'; pwg_query($query); @@ -1391,54 +1433,59 @@ SELECT status if ('private' == $parent_status) { - switch ($status) + foreach ($categories as $cat_id => $category) { - case 'public' : - { - set_cat_status(array($category_id), 'private'); - break; - } - case 'private' : + switch ($category['status']) { - $subcats = get_subcat_ids(array($category_id)); - - $tables = - array( - USER_ACCESS_TABLE => 'user_id', - GROUP_ACCESS_TABLE => 'group_id' - ); - - foreach ($tables as $table => $field) + case 'public' : { - $query = ' + set_cat_status(array($cat_id), 'private'); + break; + } + case 'private' : + { + $subcats = get_subcat_ids(array($cat_id)); + + foreach ($tables as $table => $field) + { + $query = ' SELECT '.$field.' FROM '.$table.' - WHERE category_id = '.$category_id.' + WHERE cat_id = '.$cat_id.' ;'; - $category_access = array_from_query($query, $field); + $category_access = array_from_query($query, $field); - $query = ' + $query = ' SELECT '.$field.' FROM '.$table.' - WHERE category_id = '.$new_parent.' + WHERE cat_id = '.$new_parent.' ;'; - $parent_access = array_from_query($query, $field); + $parent_access = array_from_query($query, $field); - $to_delete = array_diff($parent_access, $category_access); + $to_delete = array_diff($parent_access, $category_access); - if (count($to_delete) > 0) - { - $query = ' + if (count($to_delete) > 0) + { + $query = ' DELETE FROM '.$table.' WHERE '.$field.' IN ('.implode(',', $to_delete).') - AND category_id IN ('.implode(',', $subcats).') + AND cat_id IN ('.implode(',', $subcats).') ;'; - pwg_query($query); + pwg_query($query); + } } + break; } - break; } } } + + array_push( + $page['infos'], + sprintf( + l10n('%d categories moved'), + count($categories) + ) + ); } ?> |