source: trunk/feed.php @ 1636

Last change on this file since 1636 was 1636, checked in by rvelices, 17 years ago

feature 583: notification infromation can be filtered by the requester
(optionnally no comments/new users...)
small lang correction in header.tpl

  • Property svn:eol-style set to native
  • Property svn:keywords set to Author Date Id Revision
File size: 9.2 KB
Line 
1<?php
2// +-----------------------------------------------------------------------+
3// | PhpWebGallery - a PHP based picture gallery                           |
4// | Copyright (C) 2002-2003 Pierrick LE GALL - pierrick@phpwebgallery.net |
5// | Copyright (C) 2003-2006 PhpWebGallery Team - http://phpwebgallery.net |
6// +-----------------------------------------------------------------------+
7// | branch        : BSF (Best So Far)
8// | file          : $RCSfile$
9// | last update   : $Date: 2006-12-06 01:07:03 +0000 (Wed, 06 Dec 2006) $
10// | last modifier : $Author: rvelices $
11// | revision      : $Revision: 1636 $
12// +-----------------------------------------------------------------------+
13// | This program is free software; you can redistribute it and/or modify  |
14// | it under the terms of the GNU General Public License as published by  |
15// | the Free Software Foundation                                          |
16// |                                                                       |
17// | This program is distributed in the hope that it will be useful, but   |
18// | WITHOUT ANY WARRANTY; without even the implied warranty of            |
19// | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU      |
20// | General Public License for more details.                              |
21// |                                                                       |
22// | You should have received a copy of the GNU General Public License     |
23// | along with this program; if not, write to the Free Software           |
24// | Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, |
25// | USA.                                                                  |
26// +-----------------------------------------------------------------------+
27
28define('PHPWG_ROOT_PATH','./');
29include_once(PHPWG_ROOT_PATH.'include/common.inc.php');
30include_once(PHPWG_ROOT_PATH.'include/functions_notification.inc.php');
31
32// +-----------------------------------------------------------------------+
33// |                               functions                               |
34// +-----------------------------------------------------------------------+
35
36/**
37 * explodes a MySQL datetime format (2005-07-14 23:01:37) in fields "year",
38 * "month", "day", "hour", "minute", "second".
39 *
40 * @param string mysql datetime format
41 * @return array
42 */
43function explode_mysqldt($mysqldt)
44{
45  $date = array();
46  list($date['year'],
47       $date['month'],
48       $date['day'],
49       $date['hour'],
50       $date['minute'],
51       $date['second'])
52    = preg_split('/[-: ]/', $mysqldt);
53
54  return $date;
55}
56
57/**
58 * creates a Unix timestamp (number of seconds since 1970-01-01 00:00:00
59 * GMT) from a MySQL datetime format (2005-07-14 23:01:37)
60 *
61 * @param string mysql datetime format
62 * @return int timestamp
63 */
64function mysqldt_to_ts($mysqldt)
65{
66  $date = explode_mysqldt($mysqldt);
67  return mktime($date['hour'], $date['minute'], $date['second'],
68                $date['month'], $date['day'], $date['year']);
69}
70
71/**
72 * creates an ISO 8601 format date (2003-01-20T18:05:41+04:00) from Unix
73 * timestamp (number of seconds since 1970-01-01 00:00:00 GMT)
74 *
75 * function copied from Dotclear project http://dotclear.net
76 *
77 * @param int timestamp
78 * @return string ISO 8601 date format
79 */
80function ts_to_iso8601($ts)
81{
82  $tz = date('O',$ts);
83  $tz = substr($tz, 0, -2).':'.substr($tz, -2);
84  return date('Y-m-d\\TH:i:s',$ts).$tz;
85}
86
87// +-----------------------------------------------------------------------+
88// |                            initialization                             |
89// +-----------------------------------------------------------------------+
90
91// clean $user array (include/user.inc.php has been executed)
92$user = array();
93
94// echo '<pre>'.generate_key(50).'</pre>';
95if (isset($_GET['feed'])
96    and preg_match('/^[A-Za-z0-9]{50}$/', $_GET['feed']))
97{
98  $query = '
99SELECT uf.user_id AS id,
100       ui.status,
101       uf.last_check,
102       u.'.$conf['user_fields']['username'].' AS username
103  FROM '.USER_FEED_TABLE.' AS uf
104    INNER JOIN '.USER_INFOS_TABLE.' AS ui
105      ON ui.user_id = uf.user_id
106    INNER JOIN '.USERS_TABLE.' AS u
107      ON u.'.$conf['user_fields']['id'].' = uf.user_id
108  WHERE uf.id = \''.$_GET['feed'].'\'
109;';
110  $user = mysql_fetch_array(pwg_query($query));
111}
112
113if ( empty($user) )
114{
115  page_not_found('Unknown/missing feed identifier');
116}
117
118$user['forbidden_categories'] = calculate_permissions($user['id'],
119                                                      $user['status']);
120if ('' == $user['forbidden_categories'])
121{
122  $user['forbidden_categories'] = '0';
123}
124
125list($dbnow) = mysql_fetch_row(pwg_query('SELECT NOW();'));
126
127include_once(PHPWG_ROOT_PATH.'include/feedcreator.class.php');
128
129$base_url = get_host_url().cookie_path();
130if ( strrpos($base_url, '/') !== strlen($base_url)-1 )
131{
132  $base_url .= '/';
133}
134$page['root_path']=$base_url;
135
136$rss = new UniversalFeedCreator();
137
138$rss->title = $conf['gallery_title'];
139$rss->title.= ' (as '.$user['username'].')';
140
141$rss->link = $conf['gallery_url'];
142
143// +-----------------------------------------------------------------------+
144// |                            Feed creation                              |
145// +-----------------------------------------------------------------------+
146
147if ( !isset($_GET['image_only']) )
148{
149  $news = news($user['last_check'], $dbnow, true, true);
150
151  if (count($news) > 0)
152  {
153    $item = new FeedItem();
154    $item->title = sprintf(l10n('New on %s'),
155        format_date($dbnow, 'mysql_datetime') );
156    $item->link = $conf['gallery_url'];
157
158    // content creation
159    $item->description = '<ul>';
160    foreach ($news as $line)
161    {
162      $item->description.= '<li>'.$line.'</li>';
163    }
164    $item->description.= '</ul>';
165    $item->descriptionHtmlSyndicated = true;
166
167    $item->date = ts_to_iso8601(mysqldt_to_ts($dbnow));
168    $item->author = 'PhpWebGallery notifier';
169    $item->guid= sprintf('%s', $dbnow);;
170
171    $rss->addItem($item);
172
173    $query = '
174UPDATE '.USER_FEED_TABLE.'
175  SET last_check = \''.$dbnow.'\'
176  WHERE id = \''.$_GET['feed'].'\'
177;';
178    pwg_query($query);
179  }
180}
181else
182{ // update the last check to avoid deletion by maintenance task
183  $query = '
184UPDATE '.USER_FEED_TABLE.'
185  SET last_check = \''.$dbnow.'\'
186  WHERE id = \''.$_GET['feed'].'\'
187;';
188  pwg_query($query);
189}
190
191// build items for new images/albums
192$query = '
193SELECT date_available,
194      COUNT(DISTINCT id) nb_images,
195      COUNT(DISTINCT category_id) nb_cats
196  FROM '.IMAGES_TABLE.' INNER JOIN '.IMAGE_CATEGORY_TABLE.' ON id=image_id
197  WHERE category_id NOT IN ('.$user['forbidden_categories'].')
198  GROUP BY date_available
199  ORDER BY date_available DESC
200  LIMIT 0,5
201;';
202$result = pwg_query($query);
203$dates = array();
204while ($row = mysql_fetch_assoc($result))
205{
206  array_push($dates, $row);
207}
208
209foreach($dates as  $date_detail)
210{ // for each recent post date we create a feed item
211  $date = $date_detail['date_available'];
212  $exploded_date = explode_mysqldt($date);
213  $item = new FeedItem();
214  $item->title = sprintf(l10n('%d new elements'), $date_detail['nb_images']);
215  $item->title .= ' ('.$lang['month'][(int)$exploded_date['month']].' '.$exploded_date['day'].')';
216  $item->link = make_index_url(
217        array(
218          'chronology_field' => 'posted',
219          'chronology_style'=> 'monthly',
220          'chronology_view' => 'calendar',
221          'chronology_date' => explode('-', substr($date,0,10) )
222        )
223      );
224
225  $item->description .=
226    '<a href="'.make_index_url().'">'.$conf['gallery_title'].'</a><br/> ';
227
228  $item->description .=
229        '<li>'
230        .sprintf(l10n('%d new elements'), $date_detail['nb_images'])
231        .' ('
232        .'<a href="'.make_index_url(array('section'=>'recent_pics')).'">'
233          .l10n('recent_pics_cat').'</a>'
234        .')'
235        .'</li>';
236
237  // get some thumbnails ...
238  $query = '
239SELECT DISTINCT id, path, name, tn_ext
240  FROM '.IMAGES_TABLE.' INNER JOIN '.IMAGE_CATEGORY_TABLE.' ON id=image_id
241  WHERE category_id NOT IN ('.$user['forbidden_categories'].')
242    AND date_available="'.$date.'"
243    AND tn_ext IS NOT NULL
244  LIMIT 0,6
245;';
246  $result = pwg_query($query);
247  while ($row = mysql_fetch_assoc($result))
248  {
249    $tn_src = get_thumbnail_url($row);
250    $item->description .= '<img src="'.$tn_src.'"/>';
251  }
252  $item->description .= '...<br/>';
253
254
255  $item->description .=
256        '<li>'
257        .sprintf(l10n('%d categories updated'), $date_detail['nb_cats'])
258        .'</li>';
259  // get some categories ...
260  $query = '
261SELECT DISTINCT c.uppercats, COUNT(DISTINCT i.id) img_count
262  FROM '.IMAGES_TABLE.' i INNER JOIN '.IMAGE_CATEGORY_TABLE.' ON i.id=image_id
263    INNER JOIN '.CATEGORIES_TABLE.' c ON c.id=category_id
264  WHERE category_id NOT IN ('.$user['forbidden_categories'].')
265    AND date_available="'.$date.'"
266  GROUP BY category_id
267  ORDER BY img_count DESC
268  LIMIT 0,6
269;';
270  $result = pwg_query($query);
271  $item->description .= '<ul>';
272  while ($row = mysql_fetch_array($result))
273  {
274    $item->description .=
275          '<li>'
276          .get_cat_display_name_cache($row['uppercats'])
277          .' ('.sprintf(l10n('%d new elements'), $row['img_count']).')'
278          .'</li>';
279  }
280  $item->description .= '</ul>';
281
282  $item->descriptionHtmlSyndicated = true;
283
284  $item->date = ts_to_iso8601(mysqldt_to_ts($date));
285  $item->author = 'PhpWebGallery notifier';
286  $item->guid= sprintf('%s', 'pics-'.$date);;
287
288  $rss->addItem($item);
289}
290
291// send XML feed
292echo $rss->saveFeed('RSS2.0', '', true);
293?>
Note: See TracBrowser for help on using the repository browser.