Skip to content

Commit

Permalink
feature 169 added: ability to manually sort images inside a category. A
Browse files Browse the repository at this point in the history
dedicated screen let the administrator sort the images (pur HTML, no
JavaScript yet). The "rank" sort order is available only for a category
without flat mode. New database column image_category.rank.


git-svn-id: http://piwigo.org/svn/trunk@2517 68402e56-0260-453c-a942-63ccdbb3a9ee
  • Loading branch information
plegall committed Sep 11, 2008
1 parent fdffe42 commit d39db9a
Show file tree
Hide file tree
Showing 11 changed files with 327 additions and 15 deletions.
10 changes: 8 additions & 2 deletions admin/cat_modify.php
Expand Up @@ -274,8 +274,13 @@
// manage category elements link
if ($category['has_images'])
{
$template->assign( 'U_MANAGE_ELEMENTS',
$base_url.'element_set&cat='.$category['id']
$template->assign(
'U_MANAGE_ELEMENTS',
$base_url.'element_set&cat='.$category['id']
);
$template->assign(
'U_MANAGE_RANKS',
$base_url.'element_set_ranks&cat_id='.$category['id']
);
}

Expand Down Expand Up @@ -313,6 +318,7 @@
'hit' => l10n('most_visited_cat'),
'file' => l10n('File name'),
'id' => 'Id',
'rank' => l10n('Rank'),
);

$sort_directions = array(
Expand Down
174 changes: 174 additions & 0 deletions admin/element_set_ranks.php
@@ -0,0 +1,174 @@
<?php
// +-----------------------------------------------------------------------+
// | Piwigo - a PHP based picture gallery |
// +-----------------------------------------------------------------------+
// | Copyright(C) 2008 Piwigo Team http://piwigo.org |
// | Copyright(C) 2003-2008 PhpWebGallery Team http://phpwebgallery.net |
// | Copyright(C) 2002-2003 Pierrick LE GALL http://le-gall.net/pierrick |
// +-----------------------------------------------------------------------+
// | 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. |
// +-----------------------------------------------------------------------+

/**
* Change rank of images inside a category
*
*/

if (!defined('PHPWG_ROOT_PATH'))
{
die('Hacking attempt!');
}

include_once(PHPWG_ROOT_PATH.'admin/include/functions.php');

// +-----------------------------------------------------------------------+
// | Check Access and exit when user status is not ok |
// +-----------------------------------------------------------------------+
check_status(ACCESS_ADMINISTRATOR);

if (!isset($_GET['cat_id']) or !is_numeric($_GET['cat_id']))
{
trigger_error('missing cat_id param', E_USER_ERROR);
}

$page['category_id'] = $_GET['cat_id'];

// +-----------------------------------------------------------------------+
// | functions |
// +-----------------------------------------------------------------------+

/**
* save the rank depending on given images order
*
* The list of ordered images id is supposed to be in the same parent
* category
*
* @param array categories
* @return void
*/
function save_images_order($category_id, $images)
{
$current_rank = 0;
$datas = array();
foreach ($images as $id)
{
array_push(
$datas,
array(
'category_id' => $category_id,
'image_id' => $id,
'rank' => ++$current_rank,
)
);
}
$fields = array(
'primary' => array('image_id', 'category_id'),
'update' => array('rank')
);
mass_updates(IMAGE_CATEGORY_TABLE, $fields, $datas);
}

// +-----------------------------------------------------------------------+
// | global mode form submission |
// +-----------------------------------------------------------------------+

if (isset($_POST['submit']))
{
asort($_POST['rank_of_image'], SORT_NUMERIC);

save_images_order(
$page['category_id'],
array_keys($_POST['rank_of_image'])
);

array_push(
$page['infos'],
l10n('Images manual order was saved')
);
}

// +-----------------------------------------------------------------------+
// | template init |
// +-----------------------------------------------------------------------+
$template->set_filenames(
array('element_set_ranks' => 'admin/element_set_ranks.tpl')
);

$base_url = get_root_url().'admin.php';

// $form_action = $base_url.'?page=element_set_global';

$query = '
SELECT uppercats
FROM '.CATEGORIES_TABLE.'
WHERE id = '.$page['category_id'].'
;';
$category = mysql_fetch_array(pwg_query($query));

// Navigation path
$navigation = get_cat_display_name_cache(
$category['uppercats'],
get_root_url().'admin.php?page=cat_modify&amp;cat_id='
);

$template->assign(
array(
'CATEGORIES_NAV' => $navigation,
'F_ACTION' => $base_url.get_query_string_diff(array()),
)
);

// +-----------------------------------------------------------------------+
// | thumbnails |
// +-----------------------------------------------------------------------+

$query = '
SELECT
id,
path,
tn_ext,
rank
FROM '.IMAGES_TABLE.'
JOIN '.IMAGE_CATEGORY_TABLE.' ON image_id = id
WHERE category_id = '.$page['category_id'].'
ORDER BY rank
;';
$result = pwg_query($query);

// template thumbnail initialization
$current_rank = 1;

while ($row = mysql_fetch_assoc($result))
{
$src = get_thumbnail_url($row);

$template->append(
'thumbnails',
array(
'ID' => $row['id'],
'TN_SRC' => $src,
'RANK' => $current_rank * 10,
)
);

$current_rank++;
}

// +-----------------------------------------------------------------------+
// | sending html code |
// +-----------------------------------------------------------------------+

$template->assign_var_from_handle('ADMIN_CONTENT', 'element_set_ranks');
?>
1 change: 1 addition & 0 deletions admin/template/yoga/admin/cat_modify.tpl
Expand Up @@ -9,6 +9,7 @@
<li><a href="{$U_JUMPTO}" title="{'jump to category'|@translate}"><img src="{$themeconf.icon_dir}/category_jump-to.png" class="button" alt="{'jump to category'|@translate}" /></a></li>
{if isset($U_MANAGE_ELEMENTS) }
<li><a href="{$U_MANAGE_ELEMENTS}" title="{'manage category elements'|@translate}"><img src="{$ROOT_URL}{$themeconf.icon_dir}/category_elements.png" class="button" alt="{'elements'|@translate}" /></a></li>
<li><a href="{$U_MANAGE_RANKS}" title="{'manage element ranks'|@translate}"><img src="{$ROOT_URL}{$themeconf.icon_dir}/ranks.png" class="button" alt="{'ranks'|@translate}" /></a></li>
{/if}
<li><a href="{$U_CHILDREN}" title="{'manage sub-categories'|@translate}"><img src="{$ROOT_URL}{$themeconf.icon_dir}/category_children.png" class="button" alt="{'sub-categories'|@translate}" /></a></li>
{if isset($U_MANAGE_PERMISSIONS) }
Expand Down
41 changes: 41 additions & 0 deletions admin/template/yoga/admin/element_set_ranks.tpl
@@ -0,0 +1,41 @@
<h2>{'Manage image ranks'|@translate}</h2>

<h3>{$CATEGORIES_NAV}</h3>

{if !empty($thumbnails)}
<form action="{$F_ACTION}" method="post">

<fieldset>

<legend>{'Edit ranks'|@translate}</legend>

{if !empty($thumbnails)}
<ul class="thumbnails">
{foreach from=$thumbnails item=thumbnail}
<li><span class="wrap1">
<label>
<span class="wrap2">
{if $thumbnail.LEVEL > 0}
<em class="levelIndicatorB">{$thumbnail.LEVEL}</em>
<em class="levelIndicatorF" title="{$pwg->l10n($pwg->sprintf('Level %d',$thumbnail.LEVEL))}">{$thumbnail.LEVEL}</em>
{/if}
<span>
<img src="{$thumbnail.TN_SRC}" class="thumbnail" />
</span></span>
<input style="height:12px; width:50px;" type="text" name="rank_of_image[{$thumbnail.ID}]" value="{$thumbnail.RANK}" />
</label>
</span>
</li>
{/foreach}
</ul>
{/if}

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

</fieldset>

</form>

{else}
<div class="infos"><p>{'No element in this category'|@translate}</p></div>
{/if}
10 changes: 10 additions & 0 deletions include/config_default.inc.php
Expand Up @@ -63,6 +63,16 @@
// the date_available
$conf['order_by'] = ' ORDER BY date_available DESC, file ASC, id ASC';

// order_by_inside_category : inside a category, images can also be ordered
// by rank. A manually defined rank on each image for the category.
//
// In addition to fields of #images table, you can use the
// #image_category.rank column
//
// $conf['order_by_inside_category'] = ' ORDER BY rank';
// will sort images by the manually defined rank of images in this category.
$conf['order_by_inside_category'] = $conf['order_by'];

// file_ext : file extensions (case sensitive) authorized
$conf['file_ext'] = array('jpg','JPG','jpeg','JPEG',
'png','PNG','gif','GIF','mpg','zip',
Expand Down
12 changes: 9 additions & 3 deletions include/functions_category.inc.php
Expand Up @@ -257,15 +257,21 @@ function get_site_url($category_id)
// returns an array of image orders available for users/visitors
function get_category_preferred_image_orders()
{
global $conf;
global $conf, $page;

return array(
array(l10n('default_sort'), '', true),
array(l10n('Average rate'), 'average_rate DESC', $conf['rate']),
array(l10n('most_visited_cat'), 'hit DESC', true),
array(l10n('Creation date'), 'date_creation DESC', true),
array(l10n('Post date'), 'date_available DESC', true),
array(l10n('File name'), 'file ASC', true)
);
array(l10n('File name'), 'file ASC', true),
array(
l10n('Rank'),
'rank ASC',
('categories' == $page['section'] and !isset($page['flat']))
)
);
}

function display_select_categories($categories,
Expand Down
34 changes: 29 additions & 5 deletions include/section_init.inc.php
Expand Up @@ -172,16 +172,40 @@
// By default, it is the same as the $user['nb_image_page']
$page['nb_image_page'] = $user['nb_image_page'];

// if flat mode is active, we must consider the image set as a standard set
// and not as a category set because we can't use the #image_category.rank :
// displayed images are not directly linked to the displayed category
if ('categories' == $page['section'] and !isset($page['flat']))
{
$conf['order_by'] = $conf['order_by_inside_category'];
}

if (pwg_get_session_var('image_order',0) > 0)
{
$image_order_id = pwg_get_session_var('image_order');

$orders = get_category_preferred_image_orders();

$conf['order_by'] = str_replace(
'ORDER BY ',
'ORDER BY '.$orders[ pwg_get_session_var('image_order',0) ][1].',',
$conf['order_by']
// the current session stored image_order might be not compatible with
// current image set, for example if the current image_order is the rank
// and that we are displaying images related to a tag.
//
// In case of incompatibility, the session stored image_order is removed.
if ($orders[$image_order_id][2])
{
$conf['order_by'] = str_replace(
'ORDER BY ',
'ORDER BY '.$orders[$image_order_id][1].',',
$conf['order_by']
);
$page['super_order_by'] = true;
$page['super_order_by'] = true;

}
else
{
pwg_unset_session_var('image_order');
$page['super_order_by'] = false;
}
}

$forbidden = get_sql_condition_FandF(
Expand Down
13 changes: 8 additions & 5 deletions index.php
Expand Up @@ -260,16 +260,19 @@
$order_idx = pwg_get_session_var( 'image_order', 0 );

$orders = get_category_preferred_image_orders();
for ($i = 0; $i < count($orders); $i++)
foreach ($orders as $order_id => $order)
{
if ($orders[$i][2])
if ($order[2])
{
$template->append(
'image_orders',
array(
'DISPLAY' => $orders[$i][0],
'URL' => add_url_params( duplicate_index_url(), array('image_order'=>$i) ),
'SELECTED' => ($order_idx==$i ? true:false),
'DISPLAY' => $order[0],
'URL' => add_url_params(
duplicate_index_url(),
array('image_order' => $order_id)
),
'SELECTED' => ($order_idx == $order_id ? true:false),
)
);
}
Expand Down

0 comments on commit d39db9a

Please sign in to comment.