source: trunk/include/functions_category.inc.php @ 13244

Last change on this file since 13244 was 13240, checked in by rvelices, 12 years ago
  • multisize thumb longest side can be smaller than the square size
  • remove unused css, shorten/optimize php called very often (at least theoretically should be faster)
  • Property svn:eol-style set to LF
File size: 12.7 KB
RevLine 
[2]1<?php
[362]2// +-----------------------------------------------------------------------+
[8728]3// | Piwigo - a PHP based photo gallery                                    |
[2297]4// +-----------------------------------------------------------------------+
[12922]5// | Copyright(C) 2008-2012 Piwigo Team                  http://piwigo.org |
[2297]6// | Copyright(C) 2003-2008 PhpWebGallery Team    http://phpwebgallery.net |
7// | Copyright(C) 2002-2003 Pierrick LE GALL   http://le-gall.net/pierrick |
8// +-----------------------------------------------------------------------+
9// | This program is free software; you can redistribute it and/or modify  |
10// | it under the terms of the GNU General Public License as published by  |
11// | the Free Software Foundation                                          |
12// |                                                                       |
13// | This program is distributed in the hope that it will be useful, but   |
14// | WITHOUT ANY WARRANTY; without even the implied warranty of            |
15// | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU      |
16// | General Public License for more details.                              |
17// |                                                                       |
18// | You should have received a copy of the GNU General Public License     |
19// | along with this program; if not, write to the Free Software           |
20// | Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, |
21// | USA.                                                                  |
22// +-----------------------------------------------------------------------+
[2]23
[423]24/**
25 * Provides functions to handle categories.
26 *
[1059]27 *
[423]28 */
29
30/**
31 * Is the category accessible to the connected user ?
32 *
33 * Note : if the user is not authorized to see this category, page creation
34 * ends (exit command in this function)
35 *
36 * @param int category id to verify
37 * @return void
38 */
[808]39function check_restrictions($category_id)
[2]40{
[1113]41  global $user;
[2]42
[1677]43  // $filter['visible_categories'] and $filter['visible_images']
44  // are not used because it's not necessary (filter <> restriction)
[808]45  if (in_array($category_id, explode(',', $user['forbidden_categories'])))
[2]46  {
[1113]47    access_denied();
[2]48  }
49}
[345]50
[614]51function get_categories_menu()
[2]52{
[11285]53  global $page, $user, $filter, $conf;
[1059]54
[1624]55  $query = '
56SELECT ';
57  // From CATEGORIES_TABLE
58  $query.= '
[1866]59  id, name, permalink, nb_images, global_rank,';
[1624]60  // From USER_CACHE_CATEGORIES_TABLE
61  $query.= '
[1641]62  date_last, max_date_last, count_images, count_categories';
[1059]63
[1624]64  // $user['forbidden_categories'] including with USER_CACHE_CATEGORIES_TABLE
65  $query.= '
[1677]66FROM '.CATEGORIES_TABLE.' INNER JOIN '.USER_CACHE_CATEGORIES_TABLE.'
[1624]67  ON id = cat_id and user_id = '.$user['id'];
[1677]68
69  // Always expand when filter is activated
70  if (!$user['expand'] and !$filter['enabled'])
[345]71  {
[2070]72    $where = '
[1677]73(id_uppercat is NULL';
74    if (isset($page['category']))
75    {
[2070]76      $where .= ' OR id_uppercat IN ('.$page['category']['uppercats'].')';
[1677]77    }
[2070]78    $where .= ')';
[1648]79  }
80  else
81  {
[2070]82    $where = '
[1677]83  '.get_sql_condition_FandF
84    (
85      array
86        (
87          'visible_categories' => 'id',
88        ),
[2070]89      null,
90      true
[1677]91    );
[2]92  }
[1677]93
[2070]94  $where = trigger_event('get_categories_menu_sql_where',
95    $where, $user['expand'], $filter['enabled'] );
96
[589]97  $query.= '
[2070]98WHERE '.$where.'
[589]99;';
[26]100
[589]101  $result = pwg_query($query);
[614]102  $cats = array();
[3171]103  $selected_category = isset($page['category']) ? $page['category'] : null;
[4325]104  while ($row = pwg_db_fetch_assoc($result))
[2]105  {
[3171]106    $child_date_last = @$row['max_date_last']> @$row['date_last'];
107    $row = array_merge($row,
108      array(
109        'NAME' => trigger_event(
110          'render_category_name',
111          $row['name'],
112          'get_categories_menu'
[11285]113          ),
[3171]114        'TITLE' => get_display_images_count(
115          $row['nb_images'],
116          $row['count_images'],
117          $row['count_categories'],
118          false,
119          ' / '
[11285]120          ),
[3171]121        'URL' => make_index_url(array('category' => $row)),
122        'LEVEL' => substr_count($row['global_rank'], '.') + 1,
123        'SELECTED' => $selected_category['id'] == $row['id'] ? true : false,
124        'IS_UPPERCAT' => $selected_category['id_uppercat'] == $row['id'] ? true : false,
[11285]125        )
126      );
127    if ($conf['index_new_icon'])
128    {
129      $row['icon_ts'] = get_icon($row['max_date_last'], $child_date_last);
130    }
[614]131    array_push($cats, $row);
[2586]132    if ($row['id']==@$page['category']['id']) //save the number of subcats for later optim
133      $page['category']['count_categories'] = $row['count_categories'];
[26]134  }
[614]135  usort($cats, 'global_rank_compare');
[2]136
[1677]137  // Update filtered data
[1722]138  if (function_exists('update_cats_with_filtered_data'))
139  {
140    update_cats_with_filtered_data($cats);
141  }
[1677]142
[3171]143  return $cats;
[26]144}
[2]145
[1624]146
[761]147/**
[423]148 * Retrieve informations about a category in the database
149 *
150 * Returns an array with following keys :
151 *
152 *  - comment
153 *  - dir : directory, might be empty for virtual categories
154 *  - name : an array with indexes from 0 (lowest cat name) to n (most
155 *           uppercat name findable)
156 *  - nb_images
157 *  - id_uppercat
158 *  - site_id
[1059]159 *  -
[423]160 *
161 * @param int category id
162 * @return array
163 */
[2]164function get_cat_info( $id )
165{
[603]166  $query = '
[1861]167SELECT *
[603]168  FROM '.CATEGORIES_TABLE.'
169  WHERE id = '.$id.'
170;';
[4325]171  $cat = pwg_db_fetch_assoc(pwg_query($query));
[1861]172  if (empty($cat))
[1288]173    return null;
[345]174
[1861]175  foreach ($cat as $k => $v)
[603]176  {
[345]177    // If the field is true or false, the variable is transformed into a
178    // boolean value.
[1861]179    if ($cat[$k] == 'true' or $cat[$k] == 'false')
[345]180    {
[1861]181      $cat[$k] = get_boolean( $cat[$k] );
[345]182    }
183  }
184
[1866]185  $upper_ids = explode(',', $cat['uppercats']);
186  if ( count($upper_ids)==1 )
187  {// no need to make a query for level 1
188    $cat['upper_names'] = array(
189        array(
190          'id' => $cat['id'],
191          'name' => $cat['name'],
192          'permalink' => $cat['permalink'],
193          )
194      );
195  }
196  else
[2]197  {
[1866]198    $names = array();
199    $query = '
200  SELECT id, name, permalink
201    FROM '.CATEGORIES_TABLE.'
202    WHERE id IN ('.$cat['uppercats'].')
203  ;';
204    $names = hash_from_query($query, 'id');
[672]205
[1866]206    // category names must be in the same order than uppercats list
207    $cat['upper_names'] = array();
208    foreach ($upper_ids as $cat_id)
209    {
210      array_push( $cat['upper_names'], $names[$cat_id]);
211    }
[672]212  }
[2]213  return $cat;
214}
[61]215
216
217
[1020]218// returns an array of image orders available for users/visitors
219function get_category_preferred_image_orders()
220{
[2517]221  global $conf, $page;
[2521]222
223  return trigger_event('get_category_preferred_image_orders',
224    array(
[5021]225    array(l10n('Default'), '', true),
[11893]226    array(l10n('Rating score'), 'rating_score DESC', $conf['rate']),
[5021]227    array(l10n('Most visited'), 'hit DESC', true),
[1031]228    array(l10n('Creation date'), 'date_creation DESC', true),
[1059]229    array(l10n('Post date'), 'date_available DESC', true),
[2517]230    array(l10n('File name'), 'file ASC', true),
231    array(
232      l10n('Rank'),
233      'rank ASC',
[2572]234      ('categories' == @$page['section'] and !isset($page['flat']) and !isset($page['chronology_field']) )
[2770]235      ),
[5021]236    array( l10n('Permissions'), 'level DESC', is_admin() )
[2521]237    ));
[1020]238}
239
[589]240function display_select_categories($categories,
241                                   $selecteds,
[602]242                                   $blockname,
[614]243                                   $fullname = true)
[589]244{
[614]245  global $template;
[589]246
[2223]247  $tpl_cats = array();
248  foreach ($categories as $category)
249  {
[5192]250    if (!empty($category['permalink']))
251    {
252      $category['name'] .= ' &radic;';
253    }
[2223]254    if ($fullname)
255    {
[11512]256      $option = strip_tags(
257        get_cat_display_name_cache(
258          $category['uppercats'],
259          null,
260          false
261          )
262        );
[2223]263    }
264    else
265    {
266      $option = str_repeat('&nbsp;',
267                           (3 * substr_count($category['global_rank'], '.')));
[2433]268      $option.= '- ';
269      $option.= strip_tags(
270        trigger_event(
271          'render_category_name',
272          $category['name'],
273          'display_select_categories'
274          )
275        );
[2223]276    }
277    $tpl_cats[ $category['id'] ] = $option;
278  }
279
[2290]280  $template->assign( $blockname, $tpl_cats);
281  $template->assign( $blockname.'_selected', $selecteds);
[589]282}
[603]283
[614]284function display_select_cat_wrapper($query, $selecteds, $blockname,
285                                    $fullname = true)
286{
287  $result = pwg_query($query);
288  $categories = array();
[655]289  if (!empty($result))
290  {
[4325]291    while ($row = pwg_db_fetch_assoc($result))
[657]292    {
293      array_push($categories, $row);
294    }
[614]295  }
296  usort($categories, 'global_rank_compare');
297  display_select_categories($categories, $selecteds, $blockname, $fullname);
298}
299
[603]300/**
301 * returns all subcategory identifiers of given category ids
302 *
303 * @param array ids
304 * @return array
305 */
306function get_subcat_ids($ids)
307{
308  $query = '
309SELECT DISTINCT(id)
310  FROM '.CATEGORIES_TABLE.'
311  WHERE ';
312  foreach ($ids as $num => $category_id)
313  {
[1861]314    is_numeric($category_id)
315      or trigger_error(
316        'get_subcat_ids expecting numeric, not '.gettype($category_id),
317        E_USER_WARNING
318      );
[603]319    if ($num > 0)
320    {
321      $query.= '
322    OR ';
323    }
[4367]324    $query.= 'uppercats '.DB_REGEX_OPERATOR.' \'(^|,)'.$category_id.'(,|$)\'';
[603]325  }
326  $query.= '
327;';
328  $result = pwg_query($query);
329
330  $subcats = array();
[4325]331  while ($row = pwg_db_fetch_assoc($result))
[603]332  {
333    array_push($subcats, $row['id']);
334  }
335  return $subcats;
336}
[614]337
[2047]338/** finds a matching category id from a potential list of permalinks
339 * @param array permalinks example: holiday holiday/france holiday/france/paris
340 * @param int idx - output of the index in $permalinks that matches
341 * return category id or null if no match
[1866]342 */
[2047]343function get_cat_id_from_permalinks( $permalinks, &$idx )
[1866]344{
[2047]345  $in = '';
346  foreach($permalinks as $permalink)
[1866]347  {
[2047]348    if ( !empty($in) ) $in.=', ';
[6664]349    $in .= '\''.$permalink.'\'';
[1866]350  }
[2047]351  $query ='
[2356]352SELECT cat_id AS id, permalink, 1 AS is_old
353  FROM '.OLD_PERMALINKS_TABLE.'
354  WHERE permalink IN ('.$in.')
[2047]355UNION
356SELECT id, permalink, 0 AS is_old
357  FROM '.CATEGORIES_TABLE.'
358  WHERE permalink IN ('.$in.')
359;';
360  $perma_hash = hash_from_query($query, 'permalink');
[1866]361
[2047]362  if ( empty($perma_hash) )
363    return null;
364  for ($i=count($permalinks)-1; $i>=0; $i--)
[1866]365  {
[2047]366    if ( isset( $perma_hash[ $permalinks[$i] ] ) )
367    {
368      $idx = $i;
369      $cat_id = $perma_hash[ $permalinks[$i] ]['id'];
370      if ($perma_hash[ $permalinks[$i] ]['is_old'])
371      {
372        $query='
[1866]373UPDATE '.OLD_PERMALINKS_TABLE.' SET last_hit=NOW(), hit=hit+1
[6654]374  WHERE permalink=\''.$permalinks[$i].'\' AND cat_id='.$cat_id.'
[1866]375  LIMIT 1';
[2047]376        pwg_query($query);
377      }
378      return $cat_id;
379    }
[1866]380  }
[2047]381  return null;
[1866]382}
383
[614]384function global_rank_compare($a, $b)
385{
386  return strnatcasecmp($a['global_rank'], $b['global_rank']);
387}
[1036]388
389function rank_compare($a, $b)
390{
[13240]391  return $a['rank'] - $b['rank'];
[1036]392}
[1624]393
394/**
395 * returns display text for information images of category
396 *
397 * @param array categories
398 * @return string
399 */
[1851]400function get_display_images_count($cat_nb_images, $cat_count_images, $cat_count_categories, $short_message = true, $Separator = '\n')
[1624]401{
402  $display_text = '';
403
[1851]404  if ($cat_count_images > 0)
405  {
406    if ($cat_nb_images > 0 and $cat_nb_images < $cat_count_images)
407    {
408      $display_text.= get_display_images_count($cat_nb_images, $cat_nb_images, 0, $short_message, $Separator).$Separator;
409      $cat_count_images-= $cat_nb_images;
410      $cat_nb_images = 0;
411    }
[2117]412
[1851]413    //at least one image direct or indirect
[8665]414    $display_text.= l10n_dec('%d photo', '%d photos', $cat_count_images);
[1624]415
[1851]416    if ($cat_count_categories == 0 or $cat_nb_images == $cat_count_images)
417    {
418      //no descendant categories or descendants do not contain images
[1624]419      if (! $short_message)
420      {
[6951]421        $display_text.= ' '.l10n('in this album');
[1624]422      }
423    }
424    else
425    {
[6951]426      $display_text.= ' '.l10n_dec('in %d sub-album', 'in %d sub-albums', $cat_count_categories);
[1624]427    }
428  }
429
430  return $display_text;
431}
432
[8802]433/**
434 * Find a random photo among all photos below a given album in the tree (not
435 * only photo directly associated to the album but also to sub-albums)
436 *
437 * we need $category['uppercats'], $category['id'], $category['count_images']
438 */
[11481]439function get_random_image_in_category($category, $recursive=true)
[8802]440{
441  $image_id = null;
442  if ($category['count_images']>0)
443  {
444    $query = '
445SELECT image_id
446  FROM '.CATEGORIES_TABLE.' AS c
447    INNER JOIN '.IMAGE_CATEGORY_TABLE.' AS ic ON ic.category_id = c.id
[11481]448  WHERE ';
449    if ($recursive)
450    {
451      $query.= '
452    (c.id='.$category['id'].' OR uppercats LIKE \''.$category['uppercats'].',%\')';
453    }
454    else
455    {
456      $query.= '
457    c.id='.$category['id'];
458    }
459    $query.= '
460    '.get_sql_condition_FandF
[8802]461    (
462      array
463        (
464          'forbidden_categories' => 'c.id',
465          'visible_categories' => 'c.id',
466          'visible_images' => 'image_id',
467        ),
468      "\n  AND"
469    ).'
470  ORDER BY '.DB_RANDOM_FUNCTION.'()
471  LIMIT 1
472;';
473    $result = pwg_query($query);
474    if (pwg_db_num_rows($result) > 0)
475    {
476      list($image_id) = pwg_db_fetch_row($result);
477    }
478  }
479
480  return $image_id;
481}
[11155]482
[11893]483
[2770]484?>
Note: See TracBrowser for help on using the repository browser.