source: trunk/include/functions_notification.inc.php @ 2299

Last change on this file since 2299 was 2299, checked in by plg, 16 years ago

Bug fixed: as rvelices notified me by email, my header replacement script was
bugged (r2297 was repeating new and old header).

By the way, I've also removed the replacement keywords. We were using them
because it was a common usage with CVS but it is advised not to use them with
Subversion. Personnaly, it is a problem when I search differences between 2
Piwigo installations outside Subversion.

  • Property svn:eol-style set to LF
  • Property svn:keywords set to Author Date Id Revision
File size: 17.1 KB
Line 
1<?php
2// +-----------------------------------------------------------------------+
3// | Piwigo - a PHP based picture gallery                                  |
4// +-----------------------------------------------------------------------+
5// | Copyright(C) 2008      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// |                               functions                               |
26// +-----------------------------------------------------------------------+
27
28/*
29 * get standard sql where in order to
30 * restict an filter caregories and images
31 *
32 * IMAGE_CATEGORY_TABLE muste named ic in the query
33 *
34 * @param none
35 *
36 * @return string sql where
37 */
38function get_std_sql_where_restrict_filter($prefix_condition, $force_one_condition = false)
39{
40  return get_sql_condition_FandF
41          (
42            array
43              (
44                'forbidden_categories' => 'ic.category_id',
45                'visible_categories' => 'ic.category_id',
46                'visible_images' => 'ic.image_id'
47              ),
48            $prefix_condition,
49            $force_one_condition
50          );
51}
52
53/*
54 * Execute custom notification query
55 *
56 * @param string action ('count' or 'info')
57 * @param string type of query ('new_comments', 'unvalidated_comments', 'new_elements', 'updated_categories', 'new_users', 'waiting_elements')
58 * @param string start (mysql datetime format)
59 * @param string end (mysql datetime format)
60 *
61 * @return integer for action count
62 *         array for info
63 */
64function custom_notification_query($action, $type, $start, $end)
65{
66  global $user;
67
68  switch($type)
69  {
70    case 'new_comments':
71      $query = '
72  FROM '.COMMENTS_TABLE.' AS c
73     , '.IMAGE_CATEGORY_TABLE.' AS ic
74  WHERE c.image_id = ic.image_id
75    AND c.validation_date > \''.$start.'\'
76    AND c.validation_date <= \''.$end.'\'
77      '.get_std_sql_where_restrict_filter('AND').'
78;';
79      break;
80    case 'unvalidated_comments':
81      $query = '
82  FROM '.COMMENTS_TABLE.'
83  WHERE date> \''.$start.'\' AND date <= \''.$end.'\'
84    AND validated = \'false\'
85;';
86      break;
87    case 'new_elements':
88      $query = '
89  FROM '.IMAGES_TABLE.' INNER JOIN '.IMAGE_CATEGORY_TABLE.' AS ic ON image_id = id
90  WHERE date_available > \''.$start.'\'
91    AND date_available <= \''.$end.'\'
92      '.get_std_sql_where_restrict_filter('AND').'
93;';
94      break;
95    case 'updated_categories':
96      $query = '
97  FROM '.IMAGES_TABLE.' INNER JOIN '.IMAGE_CATEGORY_TABLE.' AS ic ON image_id = id
98  WHERE date_available > \''.$start.'\'
99    AND date_available <= \''.$end.'\'
100      '.get_std_sql_where_restrict_filter('AND').'
101;';
102      break;
103    case 'new_users':
104      $query = '
105  FROM '.USER_INFOS_TABLE.'
106  WHERE registration_date > \''.$start.'\'
107    AND registration_date <= \''.$end.'\'
108;';
109      break;
110    case 'waiting_elements':
111      $query = '
112  FROM '.WAITING_TABLE.'
113  WHERE validated = \'false\'
114;';
115      break;
116    default:
117      // stop this function and return nothing
118      return;
119      break;
120  }
121
122  switch($action)
123  {
124    case 'count':
125      switch($type)
126      {
127        case 'new_comments':
128          $field_id = 'c.id';
129          break;
130        case 'unvalidated_comments':
131          $field_id = 'id';
132          break;
133        case 'new_elements':
134          $field_id = 'image_id';
135          break;
136        case 'updated_categories':
137          $field_id = 'category_id';
138          break;
139        case 'new_users':
140          $field_id = 'user_id';
141          break;
142        case 'waiting_elements':
143          $field_id = 'id';
144          break;
145    }
146    $query = 'SELECT count(distinct '.$field_id.') as CountId
147'.$query;
148    list($count) = mysql_fetch_array(pwg_query($query));
149    return $count;
150
151    break;
152    case 'info':
153      switch($type)
154      {
155        case 'new_comments':
156          $fields = array('c.id');
157          break;
158        case 'unvalidated_comments':
159          $fields = array('id');
160          break;
161        case 'new_elements':
162          $fields = array('image_id');
163          break;
164        case 'updated_categories':
165          $fields = array('category_id');
166          break;
167        case 'new_users':
168          $fields = array('user_id');
169          break;
170        case 'waiting_elements':
171          $fields = array('id');
172          break;
173      }
174
175    $query = 'SELECT distinct '.implode(', ', $fields).'
176'.$query;
177    $result = pwg_query($query);
178
179    $infos = array();
180
181    while ($row = mysql_fetch_array($result))
182    {
183      array_push($infos, $row);
184    }
185
186    return $infos;
187
188    break;
189  }
190
191  //return is done on previous switch($action)
192}
193
194/**
195 * new comments between two dates, according to authorized categories
196 *
197 * @param string start (mysql datetime format)
198 * @param string end (mysql datetime format)
199 * @param string forbidden categories (comma separated)
200 * @return count comment ids
201 */
202function nb_new_comments($start, $end)
203{
204  return custom_notification_query('count', 'new_comments', $start, $end);
205}
206
207/**
208 * new comments between two dates, according to authorized categories
209 *
210 * @param string start (mysql datetime format)
211 * @param string end (mysql datetime format)
212 * @param string forbidden categories (comma separated)
213 * @return array comment ids
214 */
215function new_comments($start, $end)
216{
217  return custom_notification_query('info', 'new_comments', $start, $end);
218}
219
220/**
221 * unvalidated at a precise date
222 *
223 * Comments that are registered and not validated yet on a precise date
224 *
225 * @param string start (mysql datetime format)
226 * @param string end (mysql datetime format)
227 * @return count comment ids
228 */
229function nb_unvalidated_comments($start, $end)
230{
231  return custom_notification_query('count', 'unvalidated_comments', $start, $end);
232}
233
234
235/**
236 * new elements between two dates, according to authorized categories
237 *
238 * @param string start (mysql datetime format)
239 * @param string end (mysql datetime format)
240 * @param string forbidden categories (comma separated)
241 * @return count element ids
242 */
243function nb_new_elements($start, $end)
244{
245  return custom_notification_query('count', 'new_elements', $start, $end);
246}
247
248/**
249 * new elements between two dates, according to authorized categories
250 *
251 * @param string start (mysql datetime format)
252 * @param string end (mysql datetime format)
253 * @param string forbidden categories (comma separated)
254 * @return array element ids
255 */
256function new_elements($start, $end)
257{
258  return custom_notification_query('info', 'new_elements', $start, $end);
259}
260
261/**
262 * updated categories between two dates, according to authorized categories
263 *
264 * @param string start (mysql datetime format)
265 * @param string end (mysql datetime format)
266 * @param string forbidden categories (comma separated)
267 * @return count element ids
268 */
269function nb_updated_categories($start, $end)
270{
271  return custom_notification_query('count', 'updated_categories', $start, $end);
272}
273
274/**
275 * updated categories between two dates, according to authorized categories
276 *
277 * @param string start (mysql datetime format)
278 * @param string end (mysql datetime format)
279 * @param string forbidden categories (comma separated)
280 * @return array element ids
281 */
282function updated_categories($start, $end)
283{
284  return custom_notification_query('info', 'updated_categories', $start, $end);
285}
286
287/**
288 * new registered users between two dates
289 *
290 * @param string start (mysql datetime format)
291 * @param string end (mysql datetime format)
292 * @return count user ids
293 */
294function nb_new_users($start, $end)
295{
296  return custom_notification_query('count', 'new_users', $start, $end);
297}
298
299/**
300 * new registered users between two dates
301 *
302 * @param string start (mysql datetime format)
303 * @param string end (mysql datetime format)
304 * @return array user ids
305 */
306function new_users($start, $end)
307{
308  return custom_notification_query('info', 'new_users', $start, $end);
309}
310
311/**
312 * currently waiting pictures
313 *
314 * @return count waiting ids
315 */
316function nb_waiting_elements()
317{
318  return custom_notification_query('count', 'waiting_elements', '', '');
319}
320
321/**
322 * currently waiting pictures
323 *
324 * @return array waiting ids
325 */
326function waiting_elements()
327{
328  return custom_notification_query('info', 'waiting_elements', $start, $end);
329}
330
331/**
332 * There are new between two dates ?
333 *
334 * Informations : number of new comments, number of new elements, number of
335 * updated categories. Administrators are also informed about : number of
336 * unvalidated comments, number of new users (TODO : number of unvalidated
337 * elements)
338 *
339 * @param string start date (mysql datetime format)
340 * @param string end date (mysql datetime format)
341 *
342 * @return boolean : true if exist news else false
343 */
344function news_exists($start, $end)
345{
346  return (
347          (nb_new_comments($start, $end) > 0) or
348          (nb_new_elements($start, $end) > 0) or
349          (nb_updated_categories($start, $end) > 0) or
350          ((is_admin()) and (nb_unvalidated_comments($start, $end) > 0)) or
351          ((is_admin()) and (nb_new_users($start, $end) > 0)) or
352          ((is_admin()) and (nb_waiting_elements() > 0))
353        );
354}
355
356/**
357 * Formats a news line and adds it to the array (e.g. '5 new elements')
358 */
359function add_news_line(&$news, $count, $singular_fmt_key, $plural_fmt_key, $url='', $add_url=false)
360{
361  if ($count > 0)
362  {
363    $line = l10n_dec($singular_fmt_key, $plural_fmt_key, $count);
364    if ($add_url and !empty($url) )
365    {
366      $line = '<a href="'.$url.'">'.$line.'</a>';
367    }
368    array_push($news, $line);
369  }
370}
371
372/**
373 * What's new between two dates ?
374 *
375 * Informations : number of new comments, number of new elements, number of
376 * updated categories. Administrators are also informed about : number of
377 * unvalidated comments, number of new users (TODO : number of unvalidated
378 * elements)
379 *
380 * @param string start date (mysql datetime format)
381 * @param string end date (mysql datetime format)
382 * @param bool exclude_img_cats if true, no info about new images/categories
383 * @param bool add_url add html A link around news
384 *
385 * @return array of news
386 */
387function news($start, $end, $exclude_img_cats=false, $add_url=false)
388{
389  $news = array();
390
391  if (!$exclude_img_cats)
392  {
393    add_news_line( $news,
394      nb_new_elements($start, $end), '%d new element', '%d new elements',
395      make_index_url(array('section'=>'recent_pics')), $add_url );
396  }
397
398  if (!$exclude_img_cats)
399  {
400    add_news_line( $news,
401      nb_updated_categories($start, $end), '%d category updated', '%d categories updated',
402      make_index_url(array('section'=>'recent_cats')), $add_url );
403  }
404
405  add_news_line( $news,
406      nb_new_comments($start, $end), '%d new comment', '%d new comments',
407      get_root_url().'comments.php', $add_url );
408
409  if (is_admin())
410  {
411    add_news_line( $news,
412        nb_unvalidated_comments($start, $end), '%d comment to validate', '%d comments to validate',
413        get_root_url().'admin.php?page=comments', $add_url );
414
415    add_news_line( $news,
416        nb_new_users($start, $end), '%d new user', '%d new users',
417        get_root_url().'admin.php?page=user_list', $add_url );
418
419    add_news_line( $news,
420        nb_waiting_elements(), '%d waiting element', '%d waiting elements',
421        get_root_url().'admin.php?page=waiting', $add_url );
422  }
423
424  return $news;
425}
426
427/**
428 * returns information about recently published elements grouped by post date
429 * @param int max_dates maximum returned number of recent dates
430 * @param int max_elements maximum returned number of elements per date
431 * @param int max_cats maximum returned number of categories per date
432 */
433function get_recent_post_dates($max_dates, $max_elements, $max_cats)
434{
435  global $conf, $user;
436
437  $where_sql = get_std_sql_where_restrict_filter('WHERE', true);
438
439  $query = '
440SELECT date_available,
441      COUNT(DISTINCT id) nb_elements,
442      COUNT(DISTINCT category_id) nb_cats
443  FROM '.IMAGES_TABLE.' INNER JOIN '.IMAGE_CATEGORY_TABLE.' AS ic ON id=image_id
444  '.$where_sql.'
445  GROUP BY date_available
446  ORDER BY date_available DESC
447  LIMIT 0,'.$max_dates.'
448;';
449  $result = pwg_query($query);
450  $dates = array();
451  while ($row = mysql_fetch_assoc($result))
452  {
453    array_push($dates, $row);
454  }
455
456  for ($i=0; $i<count($dates); $i++)
457  {
458    if ($max_elements>0)
459    { // get some thumbnails ...
460      $query = '
461SELECT DISTINCT id, path, name, tn_ext, file
462  FROM '.IMAGES_TABLE.' INNER JOIN '.IMAGE_CATEGORY_TABLE.' AS ic ON id=image_id
463  '.$where_sql.'
464    AND date_available="'.$dates[$i]['date_available'].'"
465    AND tn_ext IS NOT NULL
466  ORDER BY RAND(NOW())
467  LIMIT 0,'.$max_elements.'
468;';
469      $dates[$i]['elements'] = array();
470      $result = pwg_query($query);
471      while ($row = mysql_fetch_assoc($result))
472      {
473        array_push($dates[$i]['elements'], $row);
474      }
475    }
476
477    if ($max_cats>0)
478    {// get some categories ...
479      $query = '
480SELECT DISTINCT c.uppercats, COUNT(DISTINCT i.id) img_count
481  FROM '.IMAGES_TABLE.' i INNER JOIN '.IMAGE_CATEGORY_TABLE.' AS ic ON i.id=image_id
482    INNER JOIN '.CATEGORIES_TABLE.' c ON c.id=category_id
483  '.$where_sql.'
484    AND date_available="'.$dates[$i]['date_available'].'"
485  GROUP BY category_id
486  ORDER BY img_count DESC
487  LIMIT 0,'.$max_cats.'
488;';
489      $dates[$i]['categories'] = array();
490      $result = pwg_query($query);
491      while ($row = mysql_fetch_assoc($result))
492      {
493        array_push($dates[$i]['categories'], $row);
494      }
495    }
496  }
497  return $dates;
498}
499
500/*
501  Call function get_recent_post_dates but
502  the parameters to be passed to the function, as an indexed array.
503
504*/
505function get_recent_post_dates_array($args)
506{
507  return
508    get_recent_post_dates
509    (
510      (empty($args['max_dates']) ? 3 : $args['max_dates']),
511      (empty($args['max_elements']) ? 3 : $args['max_elements']),
512      (empty($args['max_cats']) ? 3 : $args['max_cats'])
513    );
514}
515
516
517/**
518 * returns html description about recently published elements grouped by post date
519 * @param $date_detail: selected date computed by get_recent_post_dates function
520 */
521function get_html_description_recent_post_date($date_detail)
522{
523  global $conf;
524
525  $description = '';
526
527  $description .=
528        '<li>'
529        .l10n_dec('%d new element', '%d new elements', $date_detail['nb_elements'])
530        .' ('
531        .'<a href="'.make_index_url(array('section'=>'recent_pics')).'">'
532          .l10n('recent_pics_cat').'</a>'
533        .')'
534        .'</li><br/>';
535
536  foreach($date_detail['elements'] as $element)
537  {
538    $tn_src = get_thumbnail_url($element);
539    $description .= '<a href="'.
540                    make_picture_url(array(
541                        'image_id' => $element['id'],
542                        'image_file' => $element['file'],
543                      ))
544                    .'"><img src="'.$tn_src.'"/></a>';
545  }
546  $description .= '...<br/>';
547
548  $description .=
549        '<li>'
550        .l10n_dec('%d category updated', '%d categories updated',
551                  $date_detail['nb_cats'])
552        .'</li>';
553
554  $description .= '<ul>';
555  foreach($date_detail['categories'] as $cat)
556  {
557    $description .=
558          '<li>'
559          .get_cat_display_name_cache($cat['uppercats'])
560          .' ('.
561          l10n_dec('%d new element',
562                   '%d new elements', $cat['img_count']).')'
563          .'</li>';
564  }
565  $description .= '</ul>';
566
567  return $description;
568}
569
570/**
571 * explodes a MySQL datetime format (2005-07-14 23:01:37) in fields "year",
572 * "month", "day", "hour", "minute", "second".
573 *
574 * @param string mysql datetime format
575 * @return array
576 */
577function explode_mysqldt($mysqldt)
578{
579  $date = array();
580  list($date['year'],
581       $date['month'],
582       $date['day'],
583       $date['hour'],
584       $date['minute'],
585       $date['second'])
586    = preg_split('/[-: ]/', $mysqldt);
587
588  return $date;
589}
590
591/**
592 * returns title about recently published elements grouped by post date
593 * @param $date_detail: selected date computed by get_recent_post_dates function
594 */
595function get_title_recent_post_date($date_detail)
596{
597  global $lang;
598
599  $date = $date_detail['date_available'];
600  $exploded_date = explode_mysqldt($date);
601
602  $title = l10n_dec('%d new element', '%d new elements', $date_detail['nb_elements']);
603  $title .= ' ('.$lang['month'][(int)$exploded_date['month']].' '.$exploded_date['day'].')';
604
605  return $title;
606}
607
608?>
Note: See TracBrowser for help on using the repository browser.