source: trunk/admin/history.php @ 20168

Last change on this file since 20168 was 19703, checked in by plg, 12 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: 18.2 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 * Display filtered history lines
26 */
27
28// +-----------------------------------------------------------------------+
29// |                              functions                                |
30// +-----------------------------------------------------------------------+
31
32// +-----------------------------------------------------------------------+
33// |                           initialization                              |
34// +-----------------------------------------------------------------------+
35
36if (!defined('PHPWG_ROOT_PATH'))
37{
38  die('Hacking attempt!');
39}
40
41include_once(PHPWG_ROOT_PATH.'admin/include/functions.php');
42include_once(PHPWG_ROOT_PATH.'admin/include/functions_history.inc.php');
43
44if (isset($_GET['start']) and is_numeric($_GET['start']))
45{
46  $page['start'] = $_GET['start'];
47}
48else
49{
50  $page['start'] = 0;
51}
52
53$types = array('none', 'picture', 'high', 'other');
54
55$display_thumbnails = array('no_display_thumbnail' => l10n('No display'),
56                            'display_thumbnail_classic' => l10n('Classic display'),
57                            'display_thumbnail_hoverbox' => l10n('Hoverbox display')
58  );
59
60// +-----------------------------------------------------------------------+
61// | Check Access and exit when user status is not ok                      |
62// +-----------------------------------------------------------------------+
63
64check_status(ACCESS_ADMINISTRATOR);
65
66// +-----------------------------------------------------------------------+
67// | Build search criteria and redirect to results                         |
68// +-----------------------------------------------------------------------+
69
70$page['errors'] = array();
71$search = array();
72
73if (isset($_POST['submit']))
74{
75  // dates
76  if (!empty($_POST['start_year']))
77  {
78    $search['fields']['date-after'] = sprintf(
79      '%d-%02d-%02d',
80      $_POST['start_year'],
81      $_POST['start_month'],
82      $_POST['start_day']
83      );
84  }
85
86  if (!empty($_POST['end_year']))
87  {
88    $search['fields']['date-before'] = sprintf(
89      '%d-%02d-%02d',
90      $_POST['end_year'],
91      $_POST['end_month'],
92      $_POST['end_day']
93      );
94  }
95
96  if (empty($_POST['types']))
97  {
98    $search['fields']['types'] = $types;
99  }
100  else
101  {
102    $search['fields']['types'] = $_POST['types'];
103  }
104
105  $search['fields']['user'] = $_POST['user'];
106
107  if (!empty($_POST['image_id']))
108  {
109    $search['fields']['image_id'] = intval($_POST['image_id']);
110  }
111
112  if (!empty($_POST['filename']))
113  {
114    $search['fields']['filename'] = str_replace(
115      '*',
116      '%',
117      pwg_db_real_escape_string($_POST['filename'])
118      );
119  }
120
121  if (!empty($_POST['ip']))
122  {
123    $search['fields']['ip'] = str_replace(
124      '*',
125      '%',
126      pwg_db_real_escape_string($_POST['ip'])
127      );
128  }
129
130  $search['fields']['display_thumbnail'] = $_POST['display_thumbnail'];
131  // Display choise are also save to one cookie
132  if (!empty($_POST['display_thumbnail'])
133      and isset($display_thumbnails[$_POST['display_thumbnail']]))
134  {
135    $cookie_val = $_POST['display_thumbnail'];
136  }
137  else
138  {
139    $cookie_val = null;
140  }
141
142  pwg_set_cookie_var('display_thumbnail', $cookie_val, strtotime('+1 month') );
143
144  // TODO manage inconsistency of having $_POST['image_id'] and
145  // $_POST['filename'] simultaneously
146
147  if (!empty($search))
148  {
149    // register search rules in database, then they will be available on
150    // thumbnails page and picture page.
151    $query ='
152INSERT INTO '.SEARCH_TABLE.'
153  (rules)
154  VALUES
155  (\''.serialize($search).'\')
156;';
157    pwg_query($query);
158
159    $search_id = pwg_db_insert_id(SEARCH_TABLE);
160
161    redirect(
162      PHPWG_ROOT_PATH.'admin.php?page=history&search_id='.$search_id
163      );
164  }
165  else
166  {
167    array_push($page['errors'], l10n('Empty query. No criteria has been entered.'));
168  }
169}
170
171// +-----------------------------------------------------------------------+
172// |                             template init                             |
173// +-----------------------------------------------------------------------+
174
175$template->set_filename('history', 'history.tpl');
176
177// TabSheet initialization
178history_tabsheet();
179
180$template->assign(
181  array(
182    'U_HELP' => get_root_url().'admin/popuphelp.php?page=history',
183    'F_ACTION' => get_root_url().'admin.php?page=history'
184    )
185  );
186
187// +-----------------------------------------------------------------------+
188// |                             history lines                             |
189// +-----------------------------------------------------------------------+
190
191if (isset($_GET['search_id'])
192    and $page['search_id'] = (int)$_GET['search_id'])
193{
194  // what are the lines to display in reality ?
195  $query = '
196SELECT rules
197  FROM '.SEARCH_TABLE.'
198  WHERE id = '.$page['search_id'].'
199;';
200  list($serialized_rules) = pwg_db_fetch_row(pwg_query($query));
201
202  $page['search'] = unserialize($serialized_rules);
203
204  if (isset($_GET['user_id']))
205  {
206    if (!is_numeric($_GET['user_id']))
207    {
208      die('user_id GET parameter must be an integer value');
209    }
210
211    $page['search']['fields']['user'] = $_GET['user_id'];
212
213    $query ='
214INSERT INTO '.SEARCH_TABLE.'
215  (rules)
216  VALUES
217  (\''.serialize($page['search']).'\')
218;';
219    pwg_query($query);
220
221    $search_id = pwg_db_insert_id(SEARCH_TABLE);
222
223    redirect(
224      PHPWG_ROOT_PATH.'admin.php?page=history&search_id='.$search_id
225      );
226  }
227
228  $data = trigger_event('get_history', array(), $page['search'], $types);
229  usort($data, 'history_compare');
230
231  $page['nb_lines'] = count($data);
232
233  $history_lines = array();
234  $user_ids = array();
235  $username_of = array();
236  $category_ids = array();
237  $image_ids = array();
238  $has_tags = false;
239
240  foreach ($data as $row)
241  {
242    $user_ids[$row['user_id']] = 1;
243
244    if (isset($row['category_id']))
245    {
246      $category_ids[$row['category_id']] = 1;
247    }
248
249    if (isset($row['image_id']))
250    {
251      $image_ids[$row['image_id']] = 1;
252    }
253
254    if (isset($row['tag_ids']))
255    {
256      $has_tags = true;
257    }
258
259    $history_lines[] = $row;
260  }
261
262  // prepare reference data (users, tags, categories...)
263  if (count($user_ids) > 0)
264  {
265    $query = '
266SELECT '.$conf['user_fields']['id'].' AS id
267     , '.$conf['user_fields']['username'].' AS username
268  FROM '.USERS_TABLE.'
269  WHERE id IN ('.implode(',', array_keys($user_ids)).')
270;';
271    $result = pwg_query($query);
272
273    $username_of = array();
274    while ($row = pwg_db_fetch_assoc($result))
275    {
276      $username_of[$row['id']] = stripslashes($row['username']);
277    }
278  }
279
280  if (count($category_ids) > 0)
281  {
282    $query = '
283SELECT id, uppercats
284  FROM '.CATEGORIES_TABLE.'
285  WHERE id IN ('.implode(',', array_keys($category_ids)).')
286;';
287    $uppercats_of = simple_hash_from_query($query, 'id', 'uppercats');
288
289    $name_of_category = array();
290
291    foreach ($uppercats_of as $category_id => $uppercats)
292    {
293      $name_of_category[$category_id] = get_cat_display_name_cache(
294        $uppercats
295        );
296    }
297  }
298
299  if (count($image_ids) > 0)
300  {
301    $query = '
302SELECT
303    id,
304    IF(name IS NULL, file, name) AS label,
305    filesize,
306    file,
307    path,
308    representative_ext
309  FROM '.IMAGES_TABLE.'
310  WHERE id IN ('.implode(',', array_keys($image_ids)).')
311;';
312    // $label_of_image = simple_hash_from_query($query, 'id', 'label');
313    $label_of_image = array();
314    $filesize_of_image = array();
315    $file_of_image = array();
316    $path_of_image = array();
317    $representative_ext_of_image = array();
318
319    $result = pwg_query($query);
320    while ($row = pwg_db_fetch_assoc($result))
321    {
322      $label_of_image[ $row['id'] ] = $row['label'];
323
324      if (isset($row['filesize']))
325      {
326        $filesize_of_image[ $row['id'] ] = $row['filesize'];
327      }
328
329      $file_of_image[ $row['id'] ] = $row['file'];
330      $path_of_image[ $row['id'] ] = $row['path'];
331      $representative_ext_of_image[ $row['id'] ] = $row['representative_ext'];
332    }
333  }
334
335  if ($has_tags > 0)
336  {
337    $query = '
338SELECT
339    id,
340    name
341  FROM '.TAGS_TABLE;
342    $name_of_tag = simple_hash_from_query($query, 'id', 'name');
343  }
344
345  $i = 0;
346  $first_line = $page['start'] + 1;
347  $last_line = $page['start'] + $conf['nb_logs_page'];
348
349  $summary['total_filesize'] = 0;
350  $summary['guests_IP'] = array();
351
352  foreach ($history_lines as $line)
353  {
354    if (isset($line['image_type']) and $line['image_type'] == 'high')
355    {
356      if (isset($filesize_of_image[$line['image_id']]))
357      {
358        $summary['total_filesize'] += $filesize_of_image[$line['image_id']];
359      }
360    }
361
362    if ($line['user_id'] == $conf['guest_id'])
363    {
364      if (!isset($summary['guests_IP'][ $line['IP'] ]))
365      {
366        $summary['guests_IP'][ $line['IP'] ] = 0;
367      }
368
369      $summary['guests_IP'][ $line['IP'] ]++;
370    }
371
372    $i++;
373
374    if ($i < $first_line or $i > $last_line)
375    {
376      continue;
377    }
378
379    $user_string = '';
380    if (isset($username_of[$line['user_id']]))
381    {
382      $user_string.= $username_of[$line['user_id']];
383    }
384    else
385    {
386      $user_string.= $line['user_id'];
387    }
388    $user_string.= '&nbsp;<a href="';
389    $user_string.= PHPWG_ROOT_PATH.'admin.php?page=history';
390    $user_string.= '&amp;search_id='.$page['search_id'];
391    $user_string.= '&amp;user_id='.$line['user_id'];
392    $user_string.= '">+</a>';
393
394    $tags_string = '';
395    if (isset($line['tag_ids']))
396    {
397      $tags_string = preg_replace(
398        '/(\d+)/e',
399        'isset($name_of_tag["$1"]) ? $name_of_tag["$1"] : "$1"',
400        str_replace(
401          ',',
402          ', ',
403          $line['tag_ids']
404          )
405        );
406    }
407
408    $image_string = '';
409    if (isset($line['image_id']))
410    {
411      $picture_url = make_picture_url(
412        array(
413          'image_id' => $line['image_id'],
414          )
415        );
416
417      if (isset($file_of_image[$line['image_id']]))
418      {
419        $element = array(
420          'id' => $line['image_id'],
421          'file' => $file_of_image[$line['image_id']],
422          'path' => $path_of_image[$line['image_id']],
423          'representative_ext' => $representative_ext_of_image[$line['image_id']],
424          );
425        $thumbnail_display = $page['search']['fields']['display_thumbnail'];
426      }
427      else
428      {
429        $thumbnail_display = 'no_display_thumbnail';
430      }
431
432      $image_title = '('.$line['image_id'].')';
433
434      if (isset($label_of_image[$line['image_id']]))
435      {
436        $image_title.= ' '.$label_of_image[$line['image_id']];
437      }
438      else
439      {
440        $image_title.= ' unknown filename';
441      }
442
443      $image_string = '';
444
445      switch ($thumbnail_display)
446      {
447        case 'no_display_thumbnail':
448        {
449          $image_string= '<a href="'.$picture_url.'">'.$image_title.'</a>';
450          break;
451        }
452        case 'display_thumbnail_classic':
453        {
454          $image_string =
455            '<a class="thumbnail" href="'.$picture_url.'">'
456            .'<span><img src="'.DerivativeImage::thumb_url($element)
457            .'" alt="'.$image_title.'" title="'.$image_title.'">'
458            .'</span></a>';
459          break;
460        }
461        case 'display_thumbnail_hoverbox':
462        {
463          $image_string =
464            '<a class="over" href="'.$picture_url.'">'
465            .'<span><img src="'.DerivativeImage::thumb_url($element)
466            .'" alt="'.$image_title.'" title="'.$image_title.'">'
467            .'</span>'.$image_title.'</a>';
468          break;
469        }
470      }
471    }
472
473    $template->append(
474      'search_results',
475      array(
476        'DATE'      => $line['date'],
477        'TIME'      => $line['time'],
478        'USER'      => $user_string,
479        'IP'        => $line['IP'],
480        'IMAGE'     => $image_string,
481        'TYPE'      => $line['image_type'],
482        'SECTION'   => $line['section'],
483        'CATEGORY'  => isset($line['category_id'])
484          ? ( isset($name_of_category[$line['category_id']])
485                ? $name_of_category[$line['category_id']]
486                : 'deleted '.$line['category_id'] )
487          : '',
488        'TAGS'       => $tags_string,
489        )
490      );
491  }
492
493  $summary['nb_guests'] = 0;
494  if (count(array_keys($summary['guests_IP'])) > 0)
495  {
496    $summary['nb_guests'] = count(array_keys($summary['guests_IP']));
497
498    // we delete the "guest" from the $username_of hash so that it is
499    // avoided in next steps
500    unset($username_of[ $conf['guest_id'] ]);
501  }
502
503  $summary['nb_members'] = count($username_of);
504
505  $member_strings = array();
506  foreach ($username_of as $user_id => $user_name)
507  {
508    $member_string = $user_name.'&nbsp;<a href="';
509    $member_string.= get_root_url().'admin.php?page=history';
510    $member_string.= '&amp;search_id='.$page['search_id'];
511    $member_string.= '&amp;user_id='.$user_id;
512    $member_string.= '">+</a>';
513
514    $member_strings[] = $member_string;
515  }
516
517  $template->assign(
518    'search_summary',
519    array(
520      'NB_LINES' => l10n_dec(
521        '%d line filtered', '%d lines filtered',
522        $page['nb_lines']
523        ),
524      'FILESIZE' => $summary['total_filesize'] != 0 ? ceil($summary['total_filesize']/1024).' MB' : '',
525      'USERS' => l10n_dec(
526        '%d user', '%d users',
527        $summary['nb_members'] + $summary['nb_guests']
528        ),
529      'MEMBERS' => sprintf(
530        l10n_dec('%d member', '%d members', $summary['nb_members']).': %s',
531        implode(
532          ', ',
533          $member_strings
534          )
535        ),
536      'GUESTS' => l10n_dec(
537        '%d guest', '%d guests',
538        $summary['nb_guests']
539        ),
540      )
541    );
542}
543
544// +-----------------------------------------------------------------------+
545// |                            navigation bar                             |
546// +-----------------------------------------------------------------------+
547
548if (isset($page['search_id']))
549{
550  $navbar = create_navigation_bar(
551    get_root_url().'admin.php'.get_query_string_diff(array('start')),
552    $page['nb_lines'],
553    $page['start'],
554    $conf['nb_logs_page']
555    );
556
557  $template->assign('navbar', $navbar);
558}
559
560// +-----------------------------------------------------------------------+
561// |                             filter form                               |
562// +-----------------------------------------------------------------------+
563
564$form = array();
565
566if (isset($page['search']))
567{
568  if (isset($page['search']['fields']['date-after']))
569  {
570    $tokens = explode('-', $page['search']['fields']['date-after']);
571
572    $form['start_year']  = (int)$tokens[0];
573    $form['start_month'] = (int)$tokens[1];
574    $form['start_day']   = (int)$tokens[2];
575  }
576
577  if (isset($page['search']['fields']['date-before']))
578  {
579    $tokens = explode('-', $page['search']['fields']['date-before']);
580
581    $form['end_year']  = (int)$tokens[0];
582    $form['end_month'] = (int)$tokens[1];
583    $form['end_day']   = (int)$tokens[2];
584  }
585
586  $form['types'] = $page['search']['fields']['types'];
587
588  if (isset($page['search']['fields']['user']))
589  {
590    $form['user'] = $page['search']['fields']['user'];
591  }
592  else
593  {
594    $form['user'] = null;
595  }
596
597  $form['image_id'] = @$page['search']['fields']['image_id'];
598  $form['filename'] = @$page['search']['fields']['filename'];
599  $form['ip'] = @$page['search']['fields']['ip'];
600
601  $form['display_thumbnail'] = @$page['search']['fields']['display_thumbnail'];
602}
603else
604{
605  // by default, at page load, we want the selected date to be the current
606  // date
607  $form['start_year']  = $form['end_year']  = date('Y');
608  $form['start_month'] = $form['end_month'] = date('n');
609  $form['start_day']   = $form['end_day']   = date('j');
610  $form['types'] = $types;
611  // Hoverbox by default
612  $form['display_thumbnail'] =
613    pwg_get_cookie_var('display_thumbnail', 'no_display_thumbnail');
614}
615
616
617$month_list = $lang['month'];
618$month_list[0]='------------';
619ksort($month_list);
620
621$template->assign(
622  array(
623    'IMAGE_ID' => @$form['image_id'],
624    'FILENAME' => @$form['filename'],
625    'IP' => @$form['ip'],
626
627    'month_list' => $month_list,
628
629    'START_DAY_SELECTED' => @$form['start_day'],
630    'START_MONTH_SELECTED' => @$form['start_month'],
631    'START_YEAR' => @$form['start_year'],
632
633    'END_DAY_SELECTED' => @$form['end_day'],
634    'END_MONTH_SELECTED' => @$form['end_month'],
635    'END_YEAR'   => @$form['end_year'],
636    )
637  );
638
639$template->assign(
640    array(
641      'type_option_values' => $types,
642      'type_option_selected' => $form['types']
643    )
644  );
645
646
647$query = '
648SELECT
649    '.$conf['user_fields']['id'].' AS id,
650    '.$conf['user_fields']['username'].' AS username
651  FROM '.USERS_TABLE.'
652  ORDER BY username ASC
653;';
654$template->assign(
655  array(
656    'user_options' => simple_hash_from_query($query, 'id','username'),
657    'user_options_selected' => array(@$form['user'])
658  )
659);
660
661$template->assign('display_thumbnails', $display_thumbnails);
662$template->assign('display_thumbnail_selected', $form['display_thumbnail']);
663
664// +-----------------------------------------------------------------------+
665// |                           html code display                           |
666// +-----------------------------------------------------------------------+
667
668$template->assign_var_from_handle('ADMIN_CONTENT', 'history');
669?>
Note: See TracBrowser for help on using the repository browser.