diff options
Diffstat (limited to 'BSF/include/functions_category.inc.php')
-rw-r--r-- | BSF/include/functions_category.inc.php | 509 |
1 files changed, 509 insertions, 0 deletions
diff --git a/BSF/include/functions_category.inc.php b/BSF/include/functions_category.inc.php new file mode 100644 index 000000000..721cc0038 --- /dev/null +++ b/BSF/include/functions_category.inc.php @@ -0,0 +1,509 @@ +<?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. | +// +-----------------------------------------------------------------------+ + +/** + * Provides functions to handle categories. + * + * + */ + +/** + * Is the category accessible to the connected user ? + * + * Note : if the user is not authorized to see this category, page creation + * ends (exit command in this function) + * + * @param int category id to verify + * @return void + */ +function check_restrictions($category_id) +{ + global $user; + + // $filter['visible_categories'] and $filter['visible_images'] + // are not used because it's not necessary (filter <> restriction) + if (in_array($category_id, explode(',', $user['forbidden_categories']))) + { + access_denied(); + } +} + +function get_categories_menu() +{ + global $page, $user, $filter; + + $query = ' +SELECT '; + // From CATEGORIES_TABLE + $query.= ' + id, name, permalink, nb_images, global_rank,'; + // From USER_CACHE_CATEGORIES_TABLE + $query.= ' + date_last, max_date_last, count_images, count_categories'; + + // $user['forbidden_categories'] including with USER_CACHE_CATEGORIES_TABLE + $query.= ' +FROM '.CATEGORIES_TABLE.' INNER JOIN '.USER_CACHE_CATEGORIES_TABLE.' + ON id = cat_id and user_id = '.$user['id']; + + // Always expand when filter is activated + if (!$user['expand'] and !$filter['enabled']) + { + $where = ' +(id_uppercat is NULL'; + if (isset($page['category'])) + { + $where .= ' OR id_uppercat IN ('.$page['category']['uppercats'].')'; + } + $where .= ')'; + } + else + { + $where = ' + '.get_sql_condition_FandF + ( + array + ( + 'visible_categories' => 'id', + ), + null, + true + ); + } + + $where = trigger_event('get_categories_menu_sql_where', + $where, $user['expand'], $filter['enabled'] ); + + $query.= ' +WHERE '.$where.' +;'; + + $result = pwg_query($query); + $cats = array(); + while ($row = mysql_fetch_assoc($result)) + { + array_push($cats, $row); + } + usort($cats, 'global_rank_compare'); + + // Update filtered data + if (function_exists('update_cats_with_filtered_data')) + { + update_cats_with_filtered_data($cats); + } + + return get_html_menu_category($cats, @$page['category'] ); +} + + +/** + * Retrieve informations about a category in the database + * + * Returns an array with following keys : + * + * - comment + * - dir : directory, might be empty for virtual categories + * - name : an array with indexes from 0 (lowest cat name) to n (most + * uppercat name findable) + * - nb_images + * - id_uppercat + * - site_id + * - + * + * @param int category id + * @return array + */ +function get_cat_info( $id ) +{ + $query = ' +SELECT * + FROM '.CATEGORIES_TABLE.' + WHERE id = '.$id.' +;'; + $cat = mysql_fetch_assoc(pwg_query($query)); + if (empty($cat)) + return null; + + foreach ($cat as $k => $v) + { + // If the field is true or false, the variable is transformed into a + // boolean value. + if ($cat[$k] == 'true' or $cat[$k] == 'false') + { + $cat[$k] = get_boolean( $cat[$k] ); + } + } + + $upper_ids = explode(',', $cat['uppercats']); + if ( count($upper_ids)==1 ) + {// no need to make a query for level 1 + $cat['upper_names'] = array( + array( + 'id' => $cat['id'], + 'name' => $cat['name'], + 'permalink' => $cat['permalink'], + ) + ); + } + else + { + $names = array(); + $query = ' + SELECT id, name, permalink + FROM '.CATEGORIES_TABLE.' + WHERE id IN ('.$cat['uppercats'].') + ;'; + $names = hash_from_query($query, 'id'); + + // category names must be in the same order than uppercats list + $cat['upper_names'] = array(); + foreach ($upper_ids as $cat_id) + { + array_push( $cat['upper_names'], $names[$cat_id]); + } + } + return $cat; +} + +// get_complete_dir returns the concatenation of get_site_url and +// get_local_dir +// Example : "pets > rex > 1_year_old" is on the the same site as the +// Piwigo files and this category has 22 for identifier +// get_complete_dir(22) returns "./galleries/pets/rex/1_year_old/" +function get_complete_dir( $category_id ) +{ + return get_site_url($category_id).get_local_dir($category_id); +} + +// get_local_dir returns an array with complete path without the site url +// Example : "pets > rex > 1_year_old" is on the the same site as the +// Piwigo files and this category has 22 for identifier +// get_local_dir(22) returns "pets/rex/1_year_old/" +function get_local_dir( $category_id ) +{ + global $page; + + $uppercats = ''; + $local_dir = ''; + + if ( isset( $page['plain_structure'][$category_id]['uppercats'] ) ) + { + $uppercats = $page['plain_structure'][$category_id]['uppercats']; + } + else + { + $query = 'SELECT uppercats'; + $query.= ' FROM '.CATEGORIES_TABLE.' WHERE id = '.$category_id; + $query.= ';'; + $row = mysql_fetch_array( pwg_query( $query ) ); + $uppercats = $row['uppercats']; + } + + $upper_array = explode( ',', $uppercats ); + + $database_dirs = array(); + $query = 'SELECT id,dir'; + $query.= ' FROM '.CATEGORIES_TABLE.' WHERE id IN ('.$uppercats.')'; + $query.= ';'; + $result = pwg_query( $query ); + while( $row = mysql_fetch_array( $result ) ) + { + $database_dirs[$row['id']] = $row['dir']; + } + foreach ($upper_array as $id) + { + $local_dir.= $database_dirs[$id].'/'; + } + + return $local_dir; +} + +// retrieving the site url : "http://domain.com/gallery/" or +// simply "./galleries/" +function get_site_url($category_id) +{ + global $page; + + $query = ' +SELECT galleries_url + FROM '.SITES_TABLE.' AS s,'.CATEGORIES_TABLE.' AS c + WHERE s.id = c.site_id + AND c.id = '.$category_id.' +;'; + $row = mysql_fetch_array(pwg_query($query)); + return $row['galleries_url']; +} + +// returns an array of image orders available for users/visitors +function get_category_preferred_image_orders() +{ + global $conf; + 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) + ); +} + +function display_select_categories($categories, + $selecteds, + $blockname, + $fullname = true) +{ + global $template; + + $tpl_cats = array(); + foreach ($categories as $category) + { + if ($fullname) + { + $option = get_cat_display_name_cache($category['uppercats'], + null, + false); + } + else + { + $option = str_repeat(' ', + (3 * substr_count($category['global_rank'], '.'))); + $option.= '- '.$category['name']; + } + $tpl_cats[ $category['id'] ] = $option; + } + + $template->assign( $blockname, $tpl_cats); + $template->assign( $blockname.'_selected', $selecteds); +} + +function display_select_cat_wrapper($query, $selecteds, $blockname, + $fullname = true) +{ + $result = pwg_query($query); + $categories = array(); + if (!empty($result)) + { + while ($row = mysql_fetch_assoc($result)) + { + array_push($categories, $row); + } + } + usort($categories, 'global_rank_compare'); + display_select_categories($categories, $selecteds, $blockname, $fullname); +} + +/** + * returns all subcategory identifiers of given category ids + * + * @param array ids + * @return array + */ +function get_subcat_ids($ids) +{ + $query = ' +SELECT DISTINCT(id) + FROM '.CATEGORIES_TABLE.' + WHERE '; + foreach ($ids as $num => $category_id) + { + is_numeric($category_id) + or trigger_error( + 'get_subcat_ids expecting numeric, not '.gettype($category_id), + E_USER_WARNING + ); + if ($num > 0) + { + $query.= ' + OR '; + } + $query.= 'uppercats REGEXP \'(^|,)'.$category_id.'(,|$)\''; + } + $query.= ' +;'; + $result = pwg_query($query); + + $subcats = array(); + while ($row = mysql_fetch_array($result)) + { + array_push($subcats, $row['id']); + } + return $subcats; +} + +/** finds a matching category id from a potential list of permalinks + * @param array permalinks example: holiday holiday/france holiday/france/paris + * @param int idx - output of the index in $permalinks that matches + * return category id or null if no match + */ +function get_cat_id_from_permalinks( $permalinks, &$idx ) +{ + $in = ''; + foreach($permalinks as $permalink) + { + if ( !empty($in) ) $in.=', '; + $in .= '"'.$permalink.'"'; + } + $query =' +SELECT cat_id AS id, permalink, 1 AS is_old + FROM '.OLD_PERMALINKS_TABLE.' + WHERE permalink IN ('.$in.') +UNION +SELECT id, permalink, 0 AS is_old + FROM '.CATEGORIES_TABLE.' + WHERE permalink IN ('.$in.') +;'; + $perma_hash = hash_from_query($query, 'permalink'); + + if ( empty($perma_hash) ) + return null; + for ($i=count($permalinks)-1; $i>=0; $i--) + { + if ( isset( $perma_hash[ $permalinks[$i] ] ) ) + { + $idx = $i; + $cat_id = $perma_hash[ $permalinks[$i] ]['id']; + if ($perma_hash[ $permalinks[$i] ]['is_old']) + { + $query=' +UPDATE '.OLD_PERMALINKS_TABLE.' SET last_hit=NOW(), hit=hit+1 + WHERE permalink="'.$permalinks[$i].'" AND cat_id='.$cat_id.' + LIMIT 1'; + pwg_query($query); + } + return $cat_id; + } + } + return null; +} + +function global_rank_compare($a, $b) +{ + return strnatcasecmp($a['global_rank'], $b['global_rank']); +} + +function rank_compare($a, $b) +{ + if ($a['rank'] == $b['rank']) + { + return 0; + } + + return ($a['rank'] < $b['rank']) ? -1 : 1; +} + +/** + * returns display text for information images of category + * + * @param array categories + * @return string + */ +function get_display_images_count($cat_nb_images, $cat_count_images, $cat_count_categories, $short_message = true, $Separator = '\n') +{ + $display_text = ''; + + if ($cat_count_images > 0) + { + if ($cat_nb_images > 0 and $cat_nb_images < $cat_count_images) + { + $display_text.= get_display_images_count($cat_nb_images, $cat_nb_images, 0, $short_message, $Separator).$Separator; + $cat_count_images-= $cat_nb_images; + $cat_nb_images = 0; + } + + //at least one image direct or indirect + $display_text.= l10n_dec('%d element', '%d elements', $cat_count_images); + + if ($cat_count_categories == 0 or $cat_nb_images == $cat_count_images) + { + //no descendant categories or descendants do not contain images + if (! $short_message) + { + $display_text.= ' '.l10n('images_available_cpl'); + } + } + else + { + $display_text.= ' '.l10n_dec('images_available_cat', 'images_available_cats', $cat_count_categories); + } + } + + return $display_text; +} + +/** + * returns the link of upload menu + * + * @param null + * @return string or null + */ +function get_upload_menu_link() +{ + global $conf, $page, $user; + + $show_link = false; + $arg_link = null; + + if (is_autorize_status($conf['upload_user_access'])) + { + if (isset($page['category']) and $page['category']['uploadable'] ) + { + // upload a picture in the category + $show_link = true; + $arg_link = 'cat='.$page['category']['id']; + } + else + if ($conf['upload_link_everytime']) + { + // upload a picture in the category + $query = ' +SELECT + 1 +FROM '.CATEGORIES_TABLE.' INNER JOIN '.USER_CACHE_CATEGORIES_TABLE.' + ON id = cat_id and user_id = '.$user['id'].' +WHERE + uploadable = \'true\' + '.get_sql_condition_FandF + ( + array + ( + 'visible_categories' => 'id', + ), + 'AND' + ).' +LIMIT 1'; + + $show_link = mysql_num_rows(pwg_query($query)) <> 0; + } + } + if ($show_link) + { + return get_root_url().'upload.php'.(empty($arg_link) ? '' : '?'.$arg_link); + } + else + { + return; + } +} + +?> |