From d39db9aaaf43eaedd634a7a5b7d06bcb69d41152 Mon Sep 17 00:00:00 2001 From: plegall Date: Thu, 11 Sep 2008 21:40:00 +0000 Subject: feature 169 added: ability to manually sort images inside a category. A 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 --- admin/cat_modify.php | 10 +- admin/element_set_ranks.php | 174 ++++++++++++++++++++++++ admin/template/yoga/admin/cat_modify.tpl | 1 + admin/template/yoga/admin/element_set_ranks.tpl | 41 ++++++ include/config_default.inc.php | 10 ++ include/functions_category.inc.php | 12 +- include/section_init.inc.php | 34 ++++- index.php | 13 +- install/db/76-database.php | 46 +++++++ install/piwigo_structure.sql | 1 + template/yoga/icon/ranks.png | Bin 0 -> 1229 bytes 11 files changed, 327 insertions(+), 15 deletions(-) create mode 100644 admin/element_set_ranks.php create mode 100644 admin/template/yoga/admin/element_set_ranks.tpl create mode 100644 install/db/76-database.php create mode 100644 template/yoga/icon/ranks.png 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 @@ + $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 @@
  • {'jump to category'|@translate}
  • {if isset($U_MANAGE_ELEMENTS) }
  • {'elements'|@translate}
  • +
  • {'ranks'|@translate}
  • {/if}
  • {'sub-categories'|@translate}
  • {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 @@ +

    {'Manage image ranks'|@translate}

    + +

    {$CATEGORIES_NAV}

    + +{if !empty($thumbnails)} +
    + +
    + + {'Edit ranks'|@translate} + + {if !empty($thumbnails)} +
      + {foreach from=$thumbnails item=thumbnail} +
    • + + +
    • + {/foreach} +
    + {/if} + +

    + +
    + +
    + +{else} +

    {'No element in this category'|@translate}

    +{/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( diff --git a/index.php b/index.php index 0cf3a11ca..b74c370c5 100644 --- a/index.php +++ b/index.php @@ -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 @@ + 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 new file mode 100644 index 000000000..455d73fdf Binary files /dev/null and b/template/yoga/icon/ranks.png differ -- cgit v1.2.3