From bd7f8c0ba2e5686c25152de220f645dc39a72ccd Mon Sep 17 00:00:00 2001 From: plegall Date: Fri, 2 Sep 2011 08:37:21 +0000 Subject: feature 1078 added: ability to merge tags git-svn-id: http://piwigo.org/svn/trunk@12032 68402e56-0260-453c-a942-63ccdbb3a9ee --- admin/include/functions.php | 30 ++++++++ admin/tags.php | 128 ++++++++++++++++++++++++++++----- admin/themes/default/template/tags.tpl | 37 ++++++++++ admin/themes/default/theme.css | 2 + language/en_UK/admin.lang.php | 8 +++ language/fr_FR/admin.lang.php | 8 +++ 6 files changed, 197 insertions(+), 16 deletions(-) diff --git a/admin/include/functions.php b/admin/include/functions.php index f5498ac8b..1d229eea3 100644 --- a/admin/include/functions.php +++ b/admin/include/functions.php @@ -1394,6 +1394,36 @@ DELETE ); } +/** + * + */ +function delete_tags($tag_ids) +{ + if (is_numeric($tag_ids)) + { + $tag_ids = array($tag_ids); + } + + if (!is_array($tag_ids)) + { + return false; + } + + $query = ' +DELETE + FROM '.IMAGE_TAG_TABLE.' + WHERE tag_id IN ('.implode(',', $tag_ids).') +;'; + pwg_query($query); + + $query = ' +DELETE + FROM '.TAGS_TABLE.' + WHERE id IN ('.implode(',', $tag_ids).') +;'; + pwg_query($query); +} + function tag_id_from_tag_name($tag_name) { global $page; diff --git a/admin/tags.php b/admin/tags.php index 67cc9bf3c..a879806fb 100644 --- a/admin/tags.php +++ b/admin/tags.php @@ -101,31 +101,121 @@ SELECT id, name } // +-----------------------------------------------------------------------+ -// | delete tags | +// | merge tags | // +-----------------------------------------------------------------------+ -if (isset($_POST['delete']) and isset($_POST['tags'])) +if (isset($_POST['confirm_merge'])) { - $query = ' -SELECT name + if (!isset($_POST['destination_tag'])) + { + array_push( + $page['errors'], + l10n('No destination tag selected') + ); + } + else + { + $destination_tag_id = $_POST['destination_tag']; + $tag_ids = explode(',', $_POST['merge_list']); + + if (is_array($tag_ids) and count($tag_ids) > 1) + { + $name_of_tag = array(); + $query = ' +SELECT + id, + name FROM '.TAGS_TABLE.' - WHERE id IN ('.implode(',', $_POST['tags']).') + WHERE id IN ('.implode(',', $tag_ids).') ;'; - $tag_names = array_from_query($query, 'name'); - - $query = ' -DELETE + $result = pwg_query($query); + while ($row = pwg_db_fetch_assoc($result)) + { + $name_of_tag[ $row['id'] ] = trigger_event('render_tag_name', $row['name']); + } + + $tag_ids_to_delete = array_diff( + $tag_ids, + array($destination_tag_id) + ); + + $query = ' +SELECT + DISTINCT(image_id) FROM '.IMAGE_TAG_TABLE.' - WHERE tag_id IN ('.implode(',', $_POST['tags']).') + WHERE tag_id IN ('.implode(',', $tag_ids_to_delete).') ;'; - pwg_query($query); - + $image_ids = array_from_query($query, 'image_id'); + + delete_tags($tag_ids_to_delete); + + $query = ' +SELECT + image_id + FROM '.IMAGE_TAG_TABLE.' + WHERE tag_id = '.$destination_tag_id.' +;'; + $destination_tag_image_ids = array_from_query($query, 'image_id'); + + $image_ids_to_link = array_diff( + $image_ids, + $destination_tag_image_ids + ); + + $inserts = array(); + foreach ($image_ids_to_link as $image_id) + { + array_push( + $inserts, + array( + 'tag_id' => $destination_tag_id, + 'image_id' => $image_id + ) + ); + } + + if (count($inserts) > 0) + { + mass_inserts( + IMAGE_TAG_TABLE, + array_keys($inserts[0]), + $inserts + ); + } + + $tags_deleted = array(); + foreach ($tag_ids_to_delete as $tag_id) + { + $tags_deleted[] = $name_of_tag[$tag_id]; + } + + array_push( + $page['infos'], + sprintf( + l10n('Tags %s merged into tag %s'), + implode(', ', $tags_deleted), + $name_of_tag[$destination_tag_id] + ) + ); + } + } +} + + +// +-----------------------------------------------------------------------+ +// | delete tags | +// +-----------------------------------------------------------------------+ + +if (isset($_POST['delete']) and isset($_POST['tags'])) +{ $query = ' -DELETE +SELECT name FROM '.TAGS_TABLE.' WHERE id IN ('.implode(',', $_POST['tags']).') ;'; - pwg_query($query); + $tag_names = array_from_query($query, 'name'); + + delete_tags($_POST['tags']); array_push( $page['infos'], @@ -250,11 +340,17 @@ $template->assign( ) ); -if (isset($_POST['edit']) and isset($_POST['tags'])) +if ((isset($_POST['edit']) or isset($_POST['merge'])) and isset($_POST['tags'])) { + $list_name = 'EDIT_TAGS_LIST'; + if (isset($_POST['merge'])) + { + $list_name = 'MERGE_TAGS_LIST'; + } + $template->assign( array( - 'EDIT_TAGS_LIST' => implode(',', $_POST['tags']), + $list_name => implode(',', $_POST['tags']), ) ); diff --git a/admin/themes/default/template/tags.tpl b/admin/themes/default/template/tags.tpl index 10a4f8b84..51b8c3614 100644 --- a/admin/themes/default/template/tags.tpl +++ b/admin/themes/default/template/tags.tpl @@ -1,5 +1,28 @@ {include file='include/tag_selection.inc.tpl'} +{footer_script}{literal} +jQuery(document).ready(function(){ + function displayDeletionWarnings() { + jQuery(".warningDeletion").show(); + jQuery("input[name=destination_tag]:checked").parent("label").children(".warningDeletion").hide(); + } + + displayDeletionWarnings(); + + jQuery("#mergeTags label").click(function() { + displayDeletionWarnings(); + }); + + jQuery("input[name=merge]").click(function() { + if (jQuery("ul.tagSelection input[type=checkbox]:checked").length < 2) { + alert("{/literal}{'Select at least two tags for merging'|@translate}{literal}"); + return false; + } + }); +}); +{/literal}{/footer_script} + +

{'Manage tags'|@translate}

@@ -30,6 +53,19 @@ {/if} + {if isset($MERGE_TAGS_LIST)} + + +
+ {'Merge tags'|@translate} + {'Select the destination tag'|@translate}

+ {foreach from=$tags item=tag name=tagloop} +
+ {/foreach} +
+
+ {/if} +
{'Add a tag'|@translate} @@ -49,6 +85,7 @@

+

diff --git a/admin/themes/default/theme.css b/admin/themes/default/theme.css index f8bf70be1..433d62ffb 100644 --- a/admin/themes/default/theme.css +++ b/admin/themes/default/theme.css @@ -1078,3 +1078,5 @@ p#uploadModeInfos {text-align:left;margin-top:1em;font-size:90%;color:#999;} #progressbar {border:1px solid #ccc; background-color:#eee;} .ui-progressbar-value { background-image: url(images/pbar-ani.gif); height:10px;margin:-1px;border:1px solid #E78F08;} +/* Tag Manager */ +.warningDeletion {display:none;font-style:italic;} \ No newline at end of file diff --git a/language/en_UK/admin.lang.php b/language/en_UK/admin.lang.php index 8273d5e05..7047bb990 100644 --- a/language/en_UK/admin.lang.php +++ b/language/en_UK/admin.lang.php @@ -849,4 +849,12 @@ $lang['Manage Permissions'] = 'Manage Permissions'; $lang['Photo %s of %s'] = 'Photo %s of %s'; $lang['show details'] = 'show details'; $lang['hide details'] = 'hide details'; +$lang['Merge tags'] = 'Merge tags'; +$lang['Select the destination tag'] = 'Select the destination tag'; +$lang['(this tag will be deleted)'] = '(this tag will be deleted)'; +$lang['Confirm merge'] = 'Confirm merge'; +$lang['Merge selected tags'] = 'Merge selected tags'; +$lang['No destination tag selected'] = 'No destination tag selected'; +$lang['Tags %s merged into tag %s'] = 'Tags %s merged into tag %s'; +$lang['Select at least two tags for merging'] = 'Select at least two tags for merging'; ?> diff --git a/language/fr_FR/admin.lang.php b/language/fr_FR/admin.lang.php index c450b5dea..4f619b1b7 100644 --- a/language/fr_FR/admin.lang.php +++ b/language/fr_FR/admin.lang.php @@ -858,4 +858,12 @@ $lang['Manage Permissions'] = 'Gérer les permissions'; $lang['Photo %s of %s'] = 'Photo %s sur %s'; $lang['show details'] = 'montrer les détails'; $lang['hide details'] = 'cacher les détails'; +$lang['Merge tags'] = 'Fusionner les tags'; +$lang['Select the destination tag'] = 'Sélectionnez le tag de destination'; +$lang['(this tag will be deleted)'] = '(ce tag sera supprimé)'; +$lang['Confirm merge'] = 'Confirmez la fusion'; +$lang['Merge selected tags'] = 'Fusionner les tags sélectionnés'; +$lang['No destination tag selected'] = 'Vous n\'avez pas sélectionné de tag de destination'; +$lang['Tags %s merged into tag %s'] = 'Les tags %s ont été fusionnés dans le tag %s'; +$lang['Select at least two tags for merging'] = 'Sélectionnez au moins deux tags pour la fusion'; ?> \ No newline at end of file -- cgit v1.2.3