diff options
-rw-r--r-- | admin/cat_modify.php | 10 | ||||
-rw-r--r-- | admin/element_set_ranks.php | 174 | ||||
-rw-r--r-- | admin/template/yoga/admin/cat_modify.tpl | 1 | ||||
-rw-r--r-- | admin/template/yoga/admin/element_set_ranks.tpl | 41 | ||||
-rw-r--r-- | include/config_default.inc.php | 10 | ||||
-rw-r--r-- | include/functions_category.inc.php | 12 | ||||
-rw-r--r-- | include/section_init.inc.php | 34 | ||||
-rw-r--r-- | index.php | 13 | ||||
-rw-r--r-- | install/db/76-database.php | 46 | ||||
-rw-r--r-- | install/piwigo_structure.sql | 1 | ||||
-rw-r--r-- | template/yoga/icon/ranks.png | bin | 0 -> 1229 bytes |
11 files changed, 327 insertions, 15 deletions
diff --git a/admin/cat_modify.php b/admin/cat_modify.php index 5f1971653..5d788b8c2 100644 --- a/admin/cat_modify.php +++ b/admin/cat_modify.php @@ -274,8 +274,13 @@ if ('private' == $category['status']) // 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'] ); } @@ -313,6 +318,7 @@ $sort_fields = array( 'hit' => l10n('most_visited_cat'), 'file' => l10n('File name'), 'id' => 'Id', + 'rank' => l10n('Rank'), ); $sort_directions = array( diff --git a/admin/element_set_ranks.php b/admin/element_set_ranks.php new file mode 100644 index 000000000..9f4a086ee --- /dev/null +++ b/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&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'); +?> diff --git a/admin/template/yoga/admin/cat_modify.tpl b/admin/template/yoga/admin/cat_modify.tpl index aeac221e6..a45f251a5 100644 --- a/admin/template/yoga/admin/cat_modify.tpl +++ b/admin/template/yoga/admin/cat_modify.tpl @@ -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) } diff --git a/admin/template/yoga/admin/element_set_ranks.tpl b/admin/template/yoga/admin/element_set_ranks.tpl new file mode 100644 index 000000000..31e614480 --- /dev/null +++ b/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} diff --git a/include/config_default.inc.php b/include/config_default.inc.php index 838cc20b0..9956ba164 100644 --- a/include/config_default.inc.php +++ b/include/config_default.inc.php @@ -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', diff --git a/include/functions_category.inc.php b/include/functions_category.inc.php index 0bca0897a..92e9cf229 100644 --- a/include/functions_category.inc.php +++ b/include/functions_category.inc.php @@ -257,15 +257,21 @@ SELECT galleries_url // 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, diff --git a/include/section_init.inc.php b/include/section_init.inc.php index 053607dfd..97f2f0a42 100644 --- a/include/section_init.inc.php +++ b/include/section_init.inc.php @@ -172,16 +172,40 @@ if ( script_basename()=='picture' and 'categories'==$page['section'] and // 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( @@ -260,16 +260,19 @@ if ( count($page['items']) > 0 $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), ) ); } diff --git a/install/db/76-database.php b/install/db/76-database.php new file mode 100644 index 000000000..ac5ea5ef0 --- /dev/null +++ b/install/db/76-database.php @@ -0,0 +1,46 @@ +<?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. | +// +-----------------------------------------------------------------------+ + +if (!defined('PHPWG_ROOT_PATH')) +{ + die('Hacking attempt!'); +} + +$upgrade_description = 'Add image_category.rank column'; + +// +-----------------------------------------------------------------------+ +// | Upgrade content | +// +-----------------------------------------------------------------------+ + +$query = 'ALTER TABLE '.IMAGE_CATEGORY_TABLE.' add column `rank` mediumint(8) unsigned default NULL'; +pwg_query($query); + +$upgrade_description = $query; + +echo +"\n" +.'"'.$upgrade_description.'"'.' ended' +."\n" +; + +?> diff --git a/install/piwigo_structure.sql b/install/piwigo_structure.sql index 5cae5b353..996c881da 100644 --- a/install/piwigo_structure.sql +++ b/install/piwigo_structure.sql @@ -150,6 +150,7 @@ DROP TABLE IF EXISTS `piwigo_image_category`; CREATE TABLE `piwigo_image_category` ( `image_id` mediumint(8) unsigned NOT NULL default '0', `category_id` smallint(5) unsigned NOT NULL default '0', + `rank` mediumint(8) unsigned default NULL, PRIMARY KEY (`image_id`,`category_id`), KEY `image_category_i1` (`category_id`) ) TYPE=MyISAM; diff --git a/template/yoga/icon/ranks.png b/template/yoga/icon/ranks.png Binary files differnew file mode 100644 index 000000000..455d73fdf --- /dev/null +++ b/template/yoga/icon/ranks.png |