source: trunk/comments.php @ 1598

Last change on this file since 1598 was 1598, checked in by rvelices, 17 years ago
  • comments.php improvements:
    • unvalidated comments are shown only for administrators
    • added delete/validate icons for admins
    • removed some unused code
  • display of comment content performed through an event
  • replace some get_thumbnail_src with get_thumbnail_url
  • Property svn:eol-style set to native
  • Property svn:keywords set to Author Date Id Revision
File size: 13.6 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-2005 PhpWebGallery Team - http://phpwebgallery.net |
6// +-----------------------------------------------------------------------+
7// | branch        : BSF (Best So Far)
8// | file          : $Id: comments.php 1598 2006-11-08 04:28:30Z rvelices $
9// | last update   : $Date: 2006-11-08 04:28:30 +0000 (Wed, 08 Nov 2006) $
10// | last modifier : $Author: rvelices $
11// | revision      : $Revision: 1598 $
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
28// +-----------------------------------------------------------------------+
29// |                           initialization                              |
30// +-----------------------------------------------------------------------+
31define('PHPWG_ROOT_PATH','./');
32include_once(PHPWG_ROOT_PATH.'include/common.inc.php');
33
34// +-----------------------------------------------------------------------+
35// | Check Access and exit when user status is not ok                      |
36// +-----------------------------------------------------------------------+
37check_status(ACCESS_GUEST);
38
39$sort_order = array(
40  'descending' => 'DESC',
41  'ascending' => 'ASC'
42  );
43
44// sort_by : database fields proposed for sorting comments list
45$sort_by = array(
46  'date' => 'comment date',
47  'image_id' => 'picture'
48  );
49
50// items_number : list of number of items to display per page
51$items_number = array(5,10,20,50,'all');
52
53// since when display comments ?
54//
55$since_options = array(
56  1 => array('label' => l10n('today'),
57             'clause' => 'date > SUBDATE(CURDATE(), INTERVAL 1 DAY)'),
58  2 => array('label' => sprintf(l10n('last %d days'), 7),
59             'clause' => 'date > SUBDATE(CURDATE(), INTERVAL 7 DAY)'),
60  3 => array('label' => sprintf(l10n('last %d days'), 30),
61             'clause' => 'date > SUBDATE(CURDATE(), INTERVAL 30 DAY)'),
62  4 => array('label' => l10n('the beginning'),
63             'clause' => '1=1') // stupid but generic
64  );
65
66$page['since'] = isset($_GET['since']) ? $_GET['since'] : 3;
67
68// on which field sorting
69//
70$page['sort_by'] = 'date';
71// if the form was submitted, it overloads default behaviour
72if (isset($_GET['sort_by']))
73{
74  $page['sort_by'] = $_GET['sort_by'];
75}
76
77// order to sort
78//
79$page['sort_order'] = $sort_order['descending'];
80// if the form was submitted, it overloads default behaviour
81if (isset($_GET['sort_order']))
82{
83  $page['sort_order'] = $sort_order[$_GET['sort_order']];
84}
85
86// number of items to display
87//
88$page['items_number'] = 5;
89if (isset($_GET['items_number']))
90{
91  $page['items_number'] = $_GET['items_number'];
92}
93
94// which category to filter on ?
95$page['cat_clause'] = '1=1';
96if (isset($_GET['cat']) and 0 != $_GET['cat'])
97{
98  $page['cat_clause'] =
99    'category_id IN ('.implode(',', get_subcat_ids(array($_GET['cat']))).')';
100}
101
102// search a particular author
103$page['author_clause'] = '1=1';
104if (isset($_GET['author']) and !empty($_GET['author']))
105{
106  if (function_exists('mysql_real_escape_string'))
107  {
108    $author = mysql_real_escape_string($_GET['author']);
109  }
110  else
111  {
112    $author = mysql_escape_string($_GET['author']);
113  }
114
115  $page['author_clause'] = 'author = \''.$author.'\'';
116}
117
118// search a substring among comments content
119$page['keyword_clause'] = '1=1';
120if (isset($_GET['keyword']) and !empty($_GET['keyword']))
121{
122  if (function_exists('mysql_real_escape_string'))
123  {
124    $keyword = mysql_real_escape_string($_GET['keyword']);
125  }
126  else
127  {
128    $keyword = mysql_escape_string($_GET['keyword']);
129  }
130  $page['keyword_clause'] =
131    '('.
132    implode(' AND ',
133            array_map(
134              create_function(
135                '$s',
136                'return "content LIKE \'%$s%\'";'
137                ),
138              preg_split('/[\s,;]+/', $keyword)
139              )
140      ).
141    ')';
142}
143
144// which status to filter on ?
145if ( is_admin() )
146{
147  $page['status_clause'] = '1=1';
148}
149else
150{
151  $page['status_clause'] = 'validated="true"';
152}
153
154
155// +-----------------------------------------------------------------------+
156// |                         comments management                           |
157// +-----------------------------------------------------------------------+
158if (is_admin() and !is_adviser() )
159{
160  if (isset($_GET['delete']) and is_numeric($_GET['delete']) )
161  {// comments deletion
162    $query = '
163DELETE FROM '.COMMENTS_TABLE.'
164  WHERE id='.$_GET['delete'].'
165;';
166    pwg_query($query);
167  }
168
169  if (isset($_GET['validate']) and is_numeric($_GET['validate']) )
170  {  // comments validation
171    $query = '
172UPDATE '.COMMENTS_TABLE.'
173  SET validated = \'true\'
174    , validation_date = NOW()
175  WHERE id='.$_GET['validate'].'
176;';
177    pwg_query($query);
178  }
179}
180// +-----------------------------------------------------------------------+
181// |                       page header and options                         |
182// +-----------------------------------------------------------------------+
183
184$title= l10n('title_comments');
185$page['body_id'] = 'theCommentsPage';
186include(PHPWG_ROOT_PATH.'include/page_header.php');
187
188$template->set_filenames(array('comments'=>'comments.tpl'));
189$template->assign_vars(
190  array(
191    'L_COMMENT_TITLE' => $title,
192
193    'F_ACTION'=>PHPWG_ROOT_PATH.'comments.php',
194    'F_KEYWORD'=>@$_GET['keyword'],
195    'F_AUTHOR'=>@$_GET['author'],
196
197    'U_HOME' => make_index_url(),
198    )
199  );
200
201// +-----------------------------------------------------------------------+
202// |                          form construction                            |
203// +-----------------------------------------------------------------------+
204
205// Search in a particular category
206$blockname = 'category';
207
208$template->assign_block_vars(
209  $blockname,
210  array('SELECTED' => '',
211        'VALUE'=> 0,
212        'OPTION' => '------------'
213    ));
214
215$query = '
216SELECT id,name,uppercats,global_rank
217  FROM '.CATEGORIES_TABLE;
218if ($user['forbidden_categories'] != '')
219{
220  $query.= '
221    WHERE id NOT IN ('.$user['forbidden_categories'].')';
222}
223$query.= '
224;';
225display_select_cat_wrapper($query, array(@$_GET['cat']), $blockname, true);
226
227// Filter on recent comments...
228$blockname = 'since_option';
229
230foreach ($since_options as $id => $option)
231{
232  $selected = ($id == $page['since']) ? 'selected="selected"' : '';
233
234  $template->assign_block_vars(
235    $blockname,
236    array('SELECTED' => $selected,
237          'VALUE'=> $id,
238          'CONTENT' => $option['label']
239      ));
240}
241
242// Sort by
243$blockname = 'sort_by_option';
244
245foreach ($sort_by as $key => $value)
246{
247  $selected = ($key == $page['sort_by']) ? 'selected="selected"' : '';
248
249  $template->assign_block_vars(
250    $blockname,
251    array('SELECTED' => $selected,
252          'VALUE'=> $key,
253          'CONTENT' => l10n($value)
254      ));
255}
256
257// Sorting order
258$blockname = 'sort_order_option';
259
260foreach (array_keys($sort_order) as $option)
261{
262  $selected = ($option == $page['sort_order']) ? 'selected="selected"' : '';
263
264  $template->assign_block_vars(
265    $blockname,
266    array('SELECTED' => $selected,
267          'VALUE'=> $option,
268          'CONTENT' => l10n($option)
269      ));
270}
271
272// Number of items
273$blockname = 'items_number_option';
274
275foreach ($items_number as $option)
276{
277  $selected = ($option == $page['items_number']) ? 'selected="selected"' : '';
278
279  $template->assign_block_vars(
280    $blockname,
281    array('SELECTED' => $selected,
282          'VALUE'=> $option,
283          'CONTENT' => is_numeric($option) ? $option : l10n($option)
284      ));
285}
286
287// +-----------------------------------------------------------------------+
288// |                            navigation bar                             |
289// +-----------------------------------------------------------------------+
290
291if (isset($_GET['start']) and is_numeric($_GET['start']))
292{
293  $start = $_GET['start'];
294}
295else
296{
297  $start = 0;
298}
299
300$query = '
301SELECT COUNT(DISTINCT(id))
302  FROM '.IMAGE_CATEGORY_TABLE.' AS ic
303    INNER JOIN '.COMMENTS_TABLE.' AS com
304    ON ic.image_id = com.image_id
305  WHERE '.$since_options[$page['since']]['clause'].'
306    AND '.$page['cat_clause'].'
307    AND '.$page['author_clause'].'
308    AND '.$page['keyword_clause'].'
309    AND '.$page['status_clause'];
310if ($user['forbidden_categories'] != '')
311{
312  $query.= '
313    AND category_id NOT IN ('.$user['forbidden_categories'].')';
314}
315$query.= '
316;';
317list($counter) = mysql_fetch_row(pwg_query($query));
318
319$url = PHPWG_ROOT_PATH
320    .'comments.php'
321    .get_query_string_diff(array('start','delete','validate'));
322
323$navbar = create_navigation_bar($url,
324                                $counter,
325                                $start,
326                                $page['items_number'],
327                                '');
328
329$template->assign_vars(array('NAVBAR' => $navbar));
330
331// +-----------------------------------------------------------------------+
332// |                        last comments display                          |
333// +-----------------------------------------------------------------------+
334
335$comments = array();
336$element_ids = array();
337$category_ids = array();
338
339$query = '
340SELECT com.id AS comment_id
341     , com.image_id
342     , ic.category_id
343     , com.author
344     , com.date
345     , com.content
346     , com.id AS comment_id
347     , com.validated
348  FROM '.IMAGE_CATEGORY_TABLE.' AS ic
349    INNER JOIN '.COMMENTS_TABLE.' AS com
350    ON ic.image_id = com.image_id
351  WHERE '.$since_options[$page['since']]['clause'].'
352    AND '.$page['cat_clause'].'
353    AND '.$page['author_clause'].'
354    AND '.$page['keyword_clause'].'
355    AND '.$page['status_clause'];
356if ($user['forbidden_categories'] != '')
357{
358  $query.= '
359    AND category_id NOT IN ('.$user['forbidden_categories'].')';
360}
361$query.= '
362  GROUP BY comment_id
363  ORDER BY '.$page['sort_by'].' '.$page['sort_order'];
364if ('all' != $page['items_number'])
365{
366  $query.= '
367  LIMIT '.$start.','.$page['items_number'];
368}
369$query.= '
370;';
371$result = pwg_query($query);
372while ($row = mysql_fetch_assoc($result))
373{
374  array_push($comments, $row);
375  array_push($element_ids, $row['image_id']);
376  array_push($category_ids, $row['category_id']);
377}
378
379if (count($comments) > 0)
380{
381  // retrieving element informations
382  $elements = array();
383  $query = '
384SELECT id, name, file, path, tn_ext
385  FROM '.IMAGES_TABLE.'
386  WHERE id IN ('.implode(',', $element_ids).')
387;';
388  $result = pwg_query($query);
389  while ($row = mysql_fetch_assoc($result))
390  {
391    $elements[$row['id']] = $row;
392  }
393
394  // retrieving category informations
395  $categories = array();
396  $query = '
397SELECT id, name, uppercats
398  FROM '.CATEGORIES_TABLE.'
399  WHERE id IN ('.implode(',', $category_ids).')
400;';
401  $result = pwg_query($query);
402  while ($row = mysql_fetch_assoc($result))
403  {
404    $categories[$row['id']] = $row;
405  }
406
407  foreach ($comments as $comment)
408  {
409    if (!empty($elements[$comment['image_id']]['name']))
410    {
411      $name=$elements[$comment['image_id']]['name'];
412    }
413    else
414    {
415      $name=get_name_from_file($elements[$comment['image_id']]['file']);
416    }
417
418    // source of the thumbnail picture
419    $thumbnail_src = get_thumbnail_url( $elements[$comment['image_id']] );
420
421    // link to the full size picture
422    $url = make_picture_url(
423            array(
424              'category' => $comment['category_id'],
425              'cat_name' => $categories[ $comment['category_id']] ['name'],
426              'image_id' => $comment['image_id'],
427              'image_file' => $elements[$comment['image_id']]['file'],
428            )
429          );
430
431    $author = $comment['author'];
432    if (empty($comment['author']))
433    {
434      $author = l10n('guest');
435    }
436
437    $template->assign_block_vars(
438      'comment',
439      array(
440        'U_PICTURE' => $url,
441        'TN_SRC' => $thumbnail_src,
442        'ALT' => $name,
443        'AUTHOR' => $author,
444        'DATE'=>format_date($comment['date'],'mysql_datetime',true),
445        'CONTENT'=>trigger_event('render_comment_content',$comment['content']),
446        ));
447
448    if ( is_admin() )
449    {
450      $url = get_root_url().'comments.php'.get_query_string_diff(array('delete','validate'));
451      $template->assign_block_vars(
452        'comment.action_delete',
453        array(
454          'U_DELETE' => add_url_params($url,
455                          array('delete'=>$comment['comment_id'])
456                         ),
457          ));
458      if ($comment['validated'] != 'true')
459      {
460        $template->assign_block_vars(
461          'comment.action_validate',
462          array(
463            'U_VALIDATE' => add_url_params($url,
464                            array('validate'=>$comment['comment_id'])
465                           ),
466            ));
467      }
468    }
469  }
470}
471// +-----------------------------------------------------------------------+
472// |                           html code display                           |
473// +-----------------------------------------------------------------------+
474$template->assign_block_vars('title',array());
475$template->parse('comments');
476include(PHPWG_ROOT_PATH.'include/page_tail.php');
477?>
Note: See TracBrowser for help on using the repository browser.