From f9baa625b6590a4cebcbc69c0486bb8764c163fb Mon Sep 17 00:00:00 2001 From: plegall Date: Fri, 7 Oct 2005 22:04:53 +0000 Subject: - new: mass virtual categories movement manager in Administration>Categories>Move screen. git-svn-id: http://piwigo.org/svn/trunk@881 68402e56-0260-453c-a942-63ccdbb3a9ee --- admin.php | 1 + admin/cat_modify.php | 5 +- admin/cat_move.php | 117 +++++++++++++++++++++++++++ admin/include/functions.php | 135 +++++++++++++++++++++---------- doc/ChangeLog | 5 ++ language/en_UK.iso-8859-1/admin.lang.php | 6 ++ language/fr_FR.iso-8859-1/admin.lang.php | 6 ++ template/yoga/admin.tpl | 1 + template/yoga/admin/cat_move.tpl | 40 +++++++++ 9 files changed, 271 insertions(+), 45 deletions(-) create mode 100644 admin/cat_move.php create mode 100644 template/yoga/admin/cat_move.tpl diff --git a/admin.php b/admin.php index 552be51e8..7b81cad91 100644 --- a/admin.php +++ b/admin.php @@ -73,6 +73,7 @@ $template->assign_vars( 'U_CONFIG_COMMENTS'=>add_session_id($conf_link.'comments' ), 'U_CONFIG_DISPLAY'=>add_session_id($conf_link.'default' ), 'U_CATEGORIES'=>add_session_id($link_start.'cat_list' ), + 'U_MOVE'=>add_session_id($link_start.'cat_move' ), 'U_CAT_UPLOAD'=>add_session_id($opt_link.'upload'), 'U_CAT_COMMENTS'=>add_session_id($opt_link.'comments'), 'U_CAT_VISIBLE'=>add_session_id($opt_link.'visible'), 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 @@ + 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) + ) + ); } ?> diff --git a/doc/ChangeLog b/doc/ChangeLog index f07cfe18e..c0d8133c8 100644 --- a/doc/ChangeLog +++ b/doc/ChangeLog @@ -1,3 +1,8 @@ +2005-10-08 Pierrick LE GALL + + * new: mass virtual categories movement manager in + Administration>Categories>Move screen. + 2005-10-05 Pierrick LE GALL * bug 160 fixed: (part one of the bug) hard coded column name of diff --git a/language/en_UK.iso-8859-1/admin.lang.php b/language/en_UK.iso-8859-1/admin.lang.php index acfed6d0e..8876fe5d0 100644 --- a/language/en_UK.iso-8859-1/admin.lang.php +++ b/language/en_UK.iso-8859-1/admin.lang.php @@ -26,6 +26,7 @@ // +-----------------------------------------------------------------------+ $lang['%d categories including %d physical and %d virtual'] = '%d categories including %d physical and %d virtual'; +$lang['%d categories moved'] = '%d categories moved'; $lang['%d comments'] = '%d comments'; $lang['%d elements'] = '%d elements'; $lang['%d groups'] = '%d groups'; @@ -82,8 +83,10 @@ $lang['Maximum height of the pictures'] = 'Maximum height of the pictures'; $lang['Maximum width of the pictures'] = 'Maximum width of the pictures'; $lang['Members'] = 'Members'; $lang['Metadata synchronized from file'] = 'Metadata synchronized from file'; +$lang['Move categories'] = 'Move categories'; $lang['Move'] = 'Move'; $lang['Name'] = 'Name'; +$lang['New parent category'] = 'New parent category'; $lang['No'] = 'No'; $lang['Number of comments per page'] = 'Number of comments per page'; $lang['Number of images per row'] = 'Number of images per row'; @@ -129,10 +132,13 @@ $lang['Users'] = 'Users'; $lang['Validate All'] = 'Validate All'; $lang['Validate'] = 'Validate'; $lang['Validation'] = 'Validation'; +$lang['Virtual categories movement'] = 'Virtual categories movement'; +$lang['Virtual categories to move'] = 'Virtual categories to move'; $lang['Webmaster cannot be deleted'] = 'Webmaster cannot be deleted'; $lang['Yes'] = 'Yes'; $lang['You are running on development sources, no check possible.'] = 'You are running on development sources, no check possible.'; $lang['You are running the latest version of PhpWebGallery.'] = 'You are running the latest version of PhpWebGallery.'; +$lang['You cannot move a category in its own sub category'] = 'You cannot move a category in its own sub category'; $lang['You need to confirm deletion'] = 'You need to confirm deletion'; $lang['actions'] = 'actions'; $lang['all'] = 'all'; diff --git a/language/fr_FR.iso-8859-1/admin.lang.php b/language/fr_FR.iso-8859-1/admin.lang.php index 71197ab5c..8f85f9039 100644 --- a/language/fr_FR.iso-8859-1/admin.lang.php +++ b/language/fr_FR.iso-8859-1/admin.lang.php @@ -26,6 +26,7 @@ // +-----------------------------------------------------------------------+ $lang['%d categories including %d physical and %d virtual'] = '%d catégories dont %d physiques et %d virtuelles'; +$lang['%d categories moved'] = '%d catégories déplacées'; $lang['%d comments'] = '%d commentaires utilisateur'; $lang['%d elements'] = '%d éléments'; $lang['%d groups'] = '%d groupes'; @@ -82,8 +83,10 @@ $lang['Maximum height of the pictures'] = 'Hauteur maximum des images'; $lang['Maximum width of the pictures'] = 'Largeur maximum des images'; $lang['Members'] = 'Membres'; $lang['Metadata synchronized from file'] = 'Meta-données synchronisées à partir du fichier'; +$lang['Move categories'] = 'Déplacer les catégories'; $lang['Move'] = 'Déplacer'; $lang['Name'] = 'Nom'; +$lang['New parent category'] = 'Nouvelle catégorie parente'; $lang['No'] = 'Non'; $lang['Number of comments per page'] = 'Nombre de commentaires utilisateur par page'; $lang['Number of images per row'] = 'Nombre de miniatures par ligne'; @@ -129,10 +132,13 @@ $lang['Users'] = 'Utilisateurs'; $lang['Validate All'] = 'Tout valider'; $lang['Validate'] = 'Valider'; $lang['Validation'] = 'Validation'; +$lang['Virtual categories movement'] = 'Déplacement de catégories virtuelles'; +$lang['Virtual categories to move'] = 'Catégories virtuelles à déplacer'; $lang['Webmaster cannot be deleted'] = 'Le webmestre ne peut pas être supprimé'; $lang['Yes'] = 'Oui'; $lang['You are running on development sources, no check possible.'] = 'Vous travaillez avec les sources de développement, impossible de vérifier la dernière version.'; $lang['You are running the latest version of PhpWebGallery.'] = 'Vous utilisez la dernière version de PhpWebGallery.'; +$lang['You cannot move a category in its own sub category'] = 'Vous ne pouvez pas déplacer une catégorie dans sa propre sous-catégorie'; $lang['You need to confirm deletion'] = 'Vous devez confirmer la suppression'; $lang['actions'] = 'actions'; $lang['all'] = 'tout'; diff --git a/template/yoga/admin.tpl b/template/yoga/admin.tpl index 70c0f2042..b16859c98 100644 --- a/template/yoga/admin.tpl +++ b/template/yoga/admin.tpl @@ -33,6 +33,7 @@