source: trunk/include/functions_tag.inc.php @ 19703

Last change on this file since 19703 was 19703, checked in by plg, 11 years ago

update Piwigo headers to 2013 (the end of the world didn't occur as expected on r12922)

  • Property svn:eol-style set to LF
File size: 7.9 KB
Line 
1<?php
2// +-----------------------------------------------------------------------+
3// | Piwigo - a PHP based photo gallery                                    |
4// +-----------------------------------------------------------------------+
5// | Copyright(C) 2008-2013 Piwigo Team                  http://piwigo.org |
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// +-----------------------------------------------------------------------+
23
24
25/**
26 * Tags available. Each return tag is represented as an array with its id,
27 * its name, its weight (count), its url name. Tags are not sorted.
28 *
29 * The returned list can be a subset of all existing tags due to
30 * permissions, only if a list of forbidden categories is provided
31 *
32 * @param array forbidden categories
33 * @return array
34 */
35function get_available_tags()
36{
37  // we can find top fatter tags among reachable images
38  $query = '
39SELECT tag_id, COUNT(DISTINCT(it.image_id)) AS counter
40  FROM '.IMAGE_CATEGORY_TABLE.' ic
41    INNER JOIN '.IMAGE_TAG_TABLE.' it ON ic.image_id=it.image_id'.get_sql_condition_FandF
42    (
43      array
44        (
45          'forbidden_categories' => 'category_id',
46          'visible_categories' => 'category_id',
47          'visible_images' => 'ic.image_id'
48        ),
49      '
50  WHERE'
51    ).'
52  GROUP BY tag_id';
53  $tag_counters = simple_hash_from_query($query, 'tag_id', 'counter');
54
55  if ( empty($tag_counters) )
56  {
57    return array();
58  }
59
60  $query = '
61SELECT *
62  FROM '.TAGS_TABLE;
63  $result = pwg_query($query);
64  $tags = array();
65  while ($row = pwg_db_fetch_assoc($result))
66  {
67    $counter = intval(@$tag_counters[ $row['id'] ]);
68    if ( $counter )
69    {
70      $row['counter'] = $counter;
71      $row['name'] = trigger_event('render_tag_name', $row['name']);
72      $tags[] = $row;
73    }
74  }
75  return $tags;
76}
77
78/**
79 * All tags, even tags associated to no image.
80 *
81 * @return array
82 */
83function get_all_tags()
84{
85  $query = '
86SELECT *
87  FROM '.TAGS_TABLE.'
88;';
89  $result = pwg_query($query);
90  $tags = array();
91  while ($row = pwg_db_fetch_assoc($result))
92  {
93    $row['name'] = trigger_event('render_tag_name', $row['name']);
94    $tags[] = $row;
95  }
96
97  usort($tags, 'tag_alpha_compare');
98
99  return $tags;
100}
101
102/**
103 * Giving a set of tags with a counter for each one, calculate the display
104 * level of each tag.
105 *
106 * The level of each tag depends on the average count of tags. This
107 * calcylation method avoid having very different levels for tags having
108 * nearly the same count when set are small.
109 *
110 * @param array tags
111 * @return array
112 */
113function add_level_to_tags($tags)
114{
115  global $conf;
116
117  if (count($tags) == 0)
118  {
119    return $tags;
120  }
121
122  $total_count = 0;
123
124  foreach ($tags as $tag)
125  {
126    $total_count+= $tag['counter'];
127  }
128
129  // average count of available tags will determine the level of each tag
130  $tag_average_count = $total_count / count($tags);
131
132  // tag levels threshold calculation: a tag with an average rate must have
133  // the middle level.
134  for ($i = 1; $i < $conf['tags_levels']; $i++)
135  {
136    $threshold_of_level[$i] =
137      2 * $i * $tag_average_count / $conf['tags_levels'];
138  }
139
140  // display sorted tags
141  foreach ($tags as &$tag)
142  {
143    $tag['level'] = 1;
144
145    // based on threshold, determine current tag level
146    for ($i = $conf['tags_levels'] - 1; $i >= 1; $i--)
147    {
148      if ($tag['counter'] > $threshold_of_level[$i])
149      {
150        $tag['level'] = $i + 1;
151        break;
152      }
153    }
154  }
155  unset($tag);
156
157  return $tags;
158}
159
160/**
161 * return the list of image ids corresponding to given tags. AND & OR mode
162 * supported.
163 *
164 * @param array tag ids
165 * @param string mode
166 * @param string extra_images_where_sql - optionally apply a sql where filter to retrieved images
167 * @param string order_by - optionally overwrite default photo order
168 * @return array
169 */
170function get_image_ids_for_tags($tag_ids, $mode='AND', $extra_images_where_sql='', $order_by='', $use_permissions=true)
171{
172  global $conf;
173  if (empty($tag_ids))
174  {
175    return array();
176  }
177
178  $query = 'SELECT id
179  FROM '.IMAGES_TABLE.' i ';
180
181  if ($use_permissions)
182  {
183    $query.= '
184    INNER JOIN '.IMAGE_CATEGORY_TABLE.' ic ON id=ic.image_id';
185  }
186
187  $query.= '
188    INNER JOIN '.IMAGE_TAG_TABLE.' it ON id=it.image_id
189    WHERE tag_id IN ('.implode(',', $tag_ids).')';
190
191  if ($use_permissions)
192  {
193    $query.= get_sql_condition_FandF(
194      array(
195        'forbidden_categories' => 'category_id',
196        'visible_categories' => 'category_id',
197        'visible_images' => 'id'
198        ),
199      "\n  AND"
200      );
201  }
202
203  $query.= (empty($extra_images_where_sql) ? '' : " \nAND (".$extra_images_where_sql.')').'
204  GROUP BY id';
205 
206  if ($mode=='AND' and count($tag_ids)>1)
207  {
208    $query .= '
209  HAVING COUNT(DISTINCT tag_id)='.count($tag_ids);
210  }
211  $query .= "\n".(empty($order_by) ? $conf['order_by'] : $order_by);
212
213  return array_from_query($query, 'id');
214}
215
216/**
217 * return a list of tags corresponding to given items.
218 *
219 * @param array items
220 * @param array max_tags
221 * @param array excluded_tag_ids
222 * @return array
223 */
224function get_common_tags($items, $max_tags, $excluded_tag_ids=null)
225{
226  if (empty($items))
227  {
228    return array();
229  }
230  $query = '
231SELECT t.*, count(*) AS counter
232  FROM '.IMAGE_TAG_TABLE.'
233    INNER JOIN '.TAGS_TABLE.' t ON tag_id = id
234  WHERE image_id IN ('.implode(',', $items).')';
235  if (!empty($excluded_tag_ids))
236  {
237    $query.='
238    AND tag_id NOT IN ('.implode(',', $excluded_tag_ids).')';
239  }
240  $query .='
241  GROUP BY t.id
242  ORDER BY ';
243  if ($max_tags>0)
244  {
245    $query .= 'counter DESC
246  LIMIT '.$max_tags;
247  }
248  else
249  {
250    $query .= 'NULL';
251  }
252
253  $result = pwg_query($query);
254  $tags = array();
255  while($row = pwg_db_fetch_assoc($result))
256  {
257    $row['name'] = trigger_event('render_tag_name', $row['name']);
258    $tags[] = $row;
259  }
260  usort($tags, 'tag_alpha_compare');
261  return $tags;
262}
263
264/**
265 * return a list of tags corresponding to any of ids, url_names, names
266 *
267 * @param array ids
268 * @param array url_names
269 * @param array names
270 * @return array
271 */
272function find_tags($ids, $url_names=array(), $names=array() )
273{
274  $where_clauses = array();
275  if ( !empty($ids) )
276  {
277    $where_clauses[] = 'id IN ('.implode(',', $ids).')';
278  }
279  if ( !empty($url_names) )
280  {
281    $where_clauses[] =
282      'url_name IN ('.
283      implode(
284        ',',
285        array_map(
286          create_function('$s', 'return "\'".$s."\'";'),
287          $url_names
288          )
289        )
290      .')';
291  }
292  if ( !empty($names) )
293  {
294    $where_clauses[] =
295      'name IN ('.
296      implode(
297        ',',
298        array_map(
299          create_function('$s', 'return "\'".$s."\'";'),
300          $names
301          )
302        )
303      .')';
304  }
305  if (empty($where_clauses))
306  {
307    return array();
308  }
309
310  $query = '
311SELECT *
312  FROM '.TAGS_TABLE.'
313  WHERE '. implode( '
314    OR ', $where_clauses);
315
316  $result = pwg_query($query);
317  $tags = array();
318  while ($row = pwg_db_fetch_assoc($result))
319  {
320    array_push($tags, $row);
321  }
322  return $tags;
323}
324?>
Note: See TracBrowser for help on using the repository browser.