Permalink
Browse files

feature 2737: improve tag administration screen

show for every tag
- the number of photos
- link to public index page
- link to batch manager edit

add an event for extended description multi language strings (used for autocompletion and shown in the tag admin screen) instead of hard coded in the core [lang=..

git-svn-id: http://piwigo.org/svn/trunk@17765 68402e56-0260-453c-a942-63ccdbb3a9ee
  • Loading branch information...
modus75 committed Sep 5, 2012
1 parent 528c75a commit dadd8f6307843311c9025be00915c95ff52407a7
Showing with 123 additions and 55 deletions.
  1. +7 −0 admin/batch_manager.php
  2. +0 −3 admin/batch_manager_unit.php
  3. +41 −30 admin/include/functions.php
  4. +49 −17 admin/tags.php
  5. +26 −5 admin/themes/default/template/tags.tpl
@@ -114,6 +114,13 @@
'category' => $_GET['cat']
);
}
if (substr_compare($_GET['cat'],'tag-',0,4)==0)
{
$_SESSION['bulk_manager_filter']=array();
$_SESSION['bulk_manager_filter']['tags'] = array(intval(substr($_GET['cat'],4)));
$_SESSION['bulk_manager_filter']['tag_mode'] = 'AND';
}
}
if (!isset($_SESSION['bulk_manager_filter']))
@@ -181,9 +181,6 @@
);
$template->assign(array('navbar' => $nav_bar));
// tags
$all_tags = get_all_tags();
$element_ids = array();
$is_category = false;
@@ -1205,7 +1205,7 @@ function create_virtual_category($category_name, $parent_id=null, $options=array
{
return array('error' => l10n('The name of an album must not be empty'));
}
$insert = array(
'name' => $category_name,
'rank' => 0,
@@ -1474,11 +1474,14 @@ function set_tags_of($tags_of)
}
}
mass_inserts(
IMAGE_TAG_TABLE,
array_keys($inserts[0]),
$inserts
);
if (count($inserts))
{
mass_inserts(
IMAGE_TAG_TABLE,
array_keys($inserts[0]),
$inserts
);
}
}
}
@@ -1498,7 +1501,7 @@ function associate_images_to_categories($images, $categories)
{
return false;
}
// get existing associations
$query = '
SELECT
@@ -1509,7 +1512,7 @@ function associate_images_to_categories($images, $categories)
AND category_id IN ('.implode(',', $categories).')
;';
$result = pwg_query($query);
$existing = array();
while ($row = pwg_db_fetch_assoc($result))
{
@@ -2119,38 +2122,46 @@ function get_taglist($query, $only_user_language=true)
$result = pwg_query($query);
$taglist = array();
$altlist = array();
while ($row = pwg_db_fetch_assoc($result))
{
if (!$only_user_language and preg_match_all('#\[lang=(.*?)\](.*?)\[/lang\]#is', $row['name'], $matches))
$raw_name = $row['name'];
$name = trigger_event('render_tag_name', $raw_name);
$taglist[] = array(
'name' => $name,
'id' => '~~'.$row['id'].'~~',
);
if (!$only_user_language)
{
foreach ($matches[2] as $tag_name)
$alt_names = trigger_event('get_tag_alt_names', array(), $raw_name);
// TEMP 2.4
if (count($alt_names)==0 and preg_match_all('#\[lang=(.*?)\](.*?)\[/lang\]#is', $row['name'], $matches))
{
array_push(
$taglist,
array(
'name' => trigger_event('render_tag_name', $tag_name),
foreach ($matches[2] as $alt)
{
$alt_names[] = $alt;
}
}
foreach( array_diff( array_unique($alt_names), array($name) ) as $alt)
{
$altlist[] = array(
'name' => $alt,
'id' => '~~'.$row['id'].'~~',
)
);
}
$row['name'] = preg_replace('#\[lang=(.*?)\](.*?)\[/lang\]#is', null, $row['name']);
}
if (strlen($row['name']) > 0)
{
array_push(
$taglist,
array(
'name' => trigger_event('render_tag_name', $row['name']),
'id' => '~~'.$row['id'].'~~',
)
);
}
}
$cmp = create_function('$a,$b', 'return strcasecmp($a["name"], $b["name"]);');
usort($taglist, $cmp);
usort($taglist, 'tag_alpha_compare');
if (count($altlist))
{
usort($altlist, 'tag_alpha_compare');
$taglist = array_merge($taglist, $altlist);
}
return $taglist;
}
@@ -45,7 +45,7 @@
FROM '.TAGS_TABLE.'
;';
$existing_names = array_from_query($query, 'name');
$current_name_of = array();
$query = '
@@ -58,7 +58,7 @@
{
$current_name_of[ $row['id'] ] = $row['name'];
}
$updates = array();
// we must not rename tag with an already existing name
foreach (explode(',', $_POST['edit_list']) as $tag_id)
@@ -110,7 +110,7 @@
FROM '.TAGS_TABLE.'
;';
$existing_names = array_from_query($query, 'name');
$current_name_of = array();
$query = '
@@ -123,7 +123,7 @@
{
$current_name_of[ $row['id'] ] = $row['name'];
}
$updates = array();
// we must not rename tag with an already existing name
foreach (explode(',', $_POST['edit_list']) as $tag_id)
@@ -179,7 +179,7 @@
)
);
}
if (count($inserts) > 0)
{
mass_inserts(
@@ -226,7 +226,7 @@
{
$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();
@@ -242,7 +242,7 @@
{
$name_of_tag[ $row['id'] ] = trigger_event('render_tag_name', $row['name']);
}
$tag_ids_to_delete = array_diff(
$tag_ids,
array($destination_tag_id)
@@ -297,7 +297,7 @@
{
$tags_deleted[] = $name_of_tag[$tag_id];
}
array_push(
$page['infos'],
sprintf(
@@ -325,11 +325,11 @@
$tag_names = array_from_query($query, 'name');
delete_tags($_POST['tags']);
array_push(
$page['infos'],
l10n_dec(
'The following tag was deleted',
'The following tag was deleted',
'The %d following tags were deleted',
count($tag_names)).' : '.
implode(', ', $tag_names)
@@ -343,7 +343,7 @@
if (isset($_GET['action']) and 'delete_orphans' == $_GET['action'])
{
check_pwg_token();
delete_orphan_tags();
$_SESSION['page_infos'] = array(l10n('Orphan tags deleted'));
redirect(get_root_url().'admin.php?page=tags');
@@ -377,7 +377,7 @@
)
)
);
array_push(
$page['infos'],
sprintf(
@@ -440,12 +440,44 @@
// | form creation |
// +-----------------------------------------------------------------------+
// tag counters
$query = '
SELECT tag_id, COUNT(image_id) AS counter
FROM '.IMAGE_TAG_TABLE.'
GROUP BY tag_id';
$tag_counters = simple_hash_from_query($query, 'tag_id', 'counter');
// all tags
$query = '
SELECT *
FROM '.TAGS_TABLE.'
;';
$result = pwg_query($query);
$all_tags = array();
while ($tag = pwg_db_fetch_assoc($result))
{
$raw_name = $tag['name'];
$tag['name'] = trigger_event('render_tag_name', $raw_name);
$tag['counter'] = intval(@$tag_counters[ $tag['id'] ]);
$tag['U_VIEW'] = make_index_url(array('tags'=>array($tag)));
$tag['U_EDIT'] = 'admin.php?page=batch_manager&cat=tag-'.$tag['id'];
$alt_names = trigger_event('get_tag_alt_names', array(), $raw_name);
$alt_names = array_diff( array_unique($alt_names), array($tag['name']) );
if (count($alt_names))
{
$tag['alt_names'] = implode(', ', $alt_names);
}
$all_tags[] = $tag;
}
usort($all_tags, 'tag_alpha_compare');
$template->assign(
array(
'TAG_SELECTION' => get_html_tag_selection(
get_all_tags(),
'tags'
),
'all_tags' => $all_tags,
)
);
@@ -460,7 +492,7 @@
{
$list_name = 'MERGE_TAGS_LIST';
}
$template->assign(
array(
$list_name => implode(',', $_POST['tags']),
@@ -40,7 +40,7 @@ jQuery(document).ready(function(){
{foreach from=$tags item=tag}
<tr>
<td>{$tag.NAME}</td>
<td><input type="text" name="tag_name-{$tag.ID}" value="{$tag.NAME}" size="30"></td>
<td><input type="text" name="tag_name-{$tag.ID}" value="{$tag.NAME}" size="50"></td>
</tr>
{/foreach}
</table>
@@ -64,7 +64,7 @@ jQuery(document).ready(function(){
{foreach from=$tags item=tag}
<tr>
<td>{$tag.NAME}</td>
<td><input type="text" name="tag_name-{$tag.ID}" value="{$tag.NAME}" size="30"></td>
<td><input type="text" name="tag_name-{$tag.ID}" value="{$tag.NAME}" size="50"></td>
</tr>
{/foreach}
</table>
@@ -95,16 +95,37 @@ jQuery(document).ready(function(){

<label>
{'New tag'|@translate}
<input type="text" name="add_tag" size="30">
<input type="text" name="add_tag" size="50">
</label>

<p><input class="submit" type="submit" name="add" value="{'Submit'|@translate}"></p>
</fieldset>

<fieldset>
<legend>{'Tag selection'|@translate}</legend>

{$TAG_SELECTION}
{html_style}
.showInfo{ldelim}position:static; display:inline-block; text-indent:6px}
{/html_style}
{footer_script}{literal}
jQuery('.showInfo').tipTip({
'delay' : 0,
'fadeIn' : 200,
'fadeOut' : 200,
'maxWidth':'300px',
'keepAlive':true,
'activation':'click'
});
{/literal}{/footer_script}
<ul class="tagSelection">
{foreach from=$all_tags item=tag}
<li>{capture name='showInfo'}<b>{$tag.name}</b><br>{$pwg->l10n_dec('%d photo', '%d photos', $tag.counter)} <a href="{$tag.U_VIEW}">{'View'|@translate}</a> <a href="{$tag.U_EDIT}">{'Edit'|@translate}</a>{if !empty($tag.alt_names)}<br>{$tag.alt_names}{/if}{/capture}
<a class="showInfo" title="{$smarty.capture.showInfo|@htmlspecialchars}">i</a>
<label>
<input type="checkbox" name="tags[]" value="{$tag.id}"> {$tag.name}
</label>
</li>
{/foreach}
</ul>

<p>
<input type="hidden" name="pwg_token" value="{$PWG_TOKEN}">

0 comments on commit dadd8f6

Please sign in to comment.