source: trunk/admin/history.php @ 27572

Last change on this file since 27572 was 27572, checked in by rvelices, 10 years ago

small code rewrite on history search page (still memory issues for large number of lines in history)

  • Property svn:eol-style set to LF
File size: 18.0 KB
Line 
1<?php
2// +-----------------------------------------------------------------------+
3// | Piwigo - a PHP based photo gallery                                    |
4// +-----------------------------------------------------------------------+
5// | Copyright(C) 2008-2014 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    $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  /*TODO - no need to get a huge number of rows from db (should take only what needed for display + SQL_CALC_FOUND_ROWS*/
229  $data = trigger_event('get_history', array(), $page['search'], $types);
230  usort($data, 'history_compare');
231
232  $page['nb_lines'] = count($data);
233
234  $history_lines = array();
235  $user_ids = array();
236  $username_of = array();
237  $category_ids = array();
238  $image_ids = array();
239  $has_tags = false;
240
241  foreach ($data as $row)
242  {
243    $user_ids[$row['user_id']] = 1;
244
245    if (isset($row['category_id']))
246    {
247      $category_ids[$row['category_id']] = 1;
248    }
249
250    if (isset($row['image_id']))
251    {
252      $image_ids[$row['image_id']] = 1;
253    }
254
255    if (isset($row['tag_ids']))
256    {
257      $has_tags = true;
258    }
259
260    $history_lines[] = $row;
261  }
262
263  // prepare reference data (users, tags, categories...)
264  if (count($user_ids) > 0)
265  {
266    $query = '
267SELECT '.$conf['user_fields']['id'].' AS id
268     , '.$conf['user_fields']['username'].' AS username
269  FROM '.USERS_TABLE.'
270  WHERE id IN ('.implode(',', array_keys($user_ids)).')
271;';
272    $result = pwg_query($query);
273
274    $username_of = array();
275    while ($row = pwg_db_fetch_assoc($result))
276    {
277      $username_of[$row['id']] = stripslashes($row['username']);
278    }
279  }
280
281  if (count($category_ids) > 0)
282  {
283    $query = '
284SELECT id, uppercats
285  FROM '.CATEGORIES_TABLE.'
286  WHERE id IN ('.implode(',', array_keys($category_ids)).')
287;';
288    $uppercats_of = query2array($query, 'id', 'uppercats');
289
290    $name_of_category = array();
291
292    foreach ($uppercats_of as $category_id => $uppercats)
293    {
294      $name_of_category[$category_id] = get_cat_display_name_cache(
295        $uppercats
296        );
297    }
298  }
299
300  if (count($image_ids) > 0)
301  {
302    $query = '
303SELECT
304    id,
305    IF(name IS NULL, file, name) AS label,
306    filesize,
307    file,
308    path,
309    representative_ext
310  FROM '.IMAGES_TABLE.'
311  WHERE id IN ('.implode(',', array_keys($image_ids)).')
312;';
313    $image_infos = query2array($query, 'id');
314  }
315
316  if ($has_tags > 0)
317  {
318    $query = '
319SELECT
320    id,
321    name, url_name
322  FROM '.TAGS_TABLE;
323
324    global $name_of_tag; // used for preg_replace
325    $name_of_tag = array();
326    $result = pwg_query($query);
327    while ($row=pwg_db_fetch_assoc($result))
328    {
329      $name_of_tag[ $row['id'] ] = '<a href="'.make_index_url( array('tags'=>array($row))).'">'.trigger_event("render_tag_name", $row['name'], $row).'</a>';
330    }
331  }
332
333  $i = 0;
334  $first_line = $page['start'] + 1;
335  $last_line = $page['start'] + $conf['nb_logs_page'];
336
337  $summary['total_filesize'] = 0;
338  $summary['guests_IP'] = array();
339
340  foreach ($history_lines as $line)
341  {
342    if (isset($line['image_type']) and $line['image_type'] == 'high')
343    {
344      $summary['total_filesize'] += @intval($image_infos[$line['image_id']]['filesize']);
345    }
346
347    if ($line['user_id'] == $conf['guest_id'])
348    {
349      if (!isset($summary['guests_IP'][ $line['IP'] ]))
350      {
351        $summary['guests_IP'][ $line['IP'] ] = 0;
352      }
353
354      $summary['guests_IP'][ $line['IP'] ]++;
355    }
356
357    $i++;
358
359    if ($i < $first_line or $i > $last_line)
360    {
361      continue;
362    }
363
364    $user_string = '';
365    if (isset($username_of[$line['user_id']]))
366    {
367      $user_string.= $username_of[$line['user_id']];
368    }
369    else
370    {
371      $user_string.= $line['user_id'];
372    }
373    $user_string.= '&nbsp;<a href="';
374    $user_string.= PHPWG_ROOT_PATH.'admin.php?page=history';
375    $user_string.= '&amp;search_id='.$page['search_id'];
376    $user_string.= '&amp;user_id='.$line['user_id'];
377    $user_string.= '">+</a>';
378
379    $tags_string = '';
380    if (isset($line['tag_ids']))
381    {
382      $tags_string = preg_replace_callback(
383        '/(\d+)/',
384        create_function('$m', 'return isset($name_of_tag[$m[1]]) ? $name_of_tag[$m[1]] : $m[1];'),
385        str_replace(
386          ',',
387          ', ',
388          $line['tag_ids']
389          )
390        );
391    }
392
393    $image_string = '';
394    if (isset($line['image_id']))
395    {
396      $picture_url = make_picture_url(
397        array(
398          'image_id' => $line['image_id'],
399          )
400        );
401
402      if (isset($image_infos[$line['image_id']]))
403      {
404        $element = array(
405          'id' => $line['image_id'],
406          'file' => $image_infos[$line['image_id']]['file'],
407          'path' => $image_infos[$line['image_id']]['path'],
408          'representative_ext' => $image_infos[$line['image_id']]['representative_ext'],
409          );
410        $thumbnail_display = $page['search']['fields']['display_thumbnail'];
411      }
412      else
413      {
414        $thumbnail_display = 'no_display_thumbnail';
415      }
416
417      $image_title = '('.$line['image_id'].')';
418
419      if (isset($image_infos[$line['image_id']]['label']))
420      {
421        $image_title.= ' '.trigger_event('render_element_description', $image_infos[$line['image_id']]['label']);
422      }
423      else
424      {
425        $image_title.= ' unknown filename';
426      }
427
428      $image_string = '';
429
430      switch ($thumbnail_display)
431      {
432        case 'no_display_thumbnail':
433        {
434          $image_string= '<a href="'.$picture_url.'">'.$image_title.'</a>';
435          break;
436        }
437        case 'display_thumbnail_classic':
438        {
439          $image_string =
440            '<a class="thumbnail" href="'.$picture_url.'">'
441            .'<span><img src="'.DerivativeImage::thumb_url($element)
442            .'" alt="'.$image_title.'" title="'.$image_title.'">'
443            .'</span></a>';
444          break;
445        }
446        case 'display_thumbnail_hoverbox':
447        {
448          $image_string =
449            '<a class="over" href="'.$picture_url.'">'
450            .'<span><img src="'.DerivativeImage::thumb_url($element)
451            .'" alt="'.$image_title.'" title="'.$image_title.'">'
452            .'</span>'.$image_title.'</a>';
453          break;
454        }
455      }
456    }
457
458    $template->append(
459      'search_results',
460      array(
461        'DATE'      => $line['date'],
462        'TIME'      => $line['time'],
463        'USER'      => $user_string,
464        'IP'        => $line['IP'],
465        'IMAGE'     => $image_string,
466        'TYPE'      => $line['image_type'],
467        'SECTION'   => $line['section'],
468        'CATEGORY'  => isset($line['category_id'])
469          ? ( isset($name_of_category[$line['category_id']])
470                ? $name_of_category[$line['category_id']]
471                : 'deleted '.$line['category_id'] )
472          : '',
473        'TAGS'       => $tags_string,
474        )
475      );
476  }
477
478  $summary['nb_guests'] = 0;
479  if (count(array_keys($summary['guests_IP'])) > 0)
480  {
481    $summary['nb_guests'] = count(array_keys($summary['guests_IP']));
482
483    // we delete the "guest" from the $username_of hash so that it is
484    // avoided in next steps
485    unset($username_of[ $conf['guest_id'] ]);
486  }
487
488  $summary['nb_members'] = count($username_of);
489
490  $member_strings = array();
491  foreach ($username_of as $user_id => $user_name)
492  {
493    $member_string = $user_name.'&nbsp;<a href="';
494    $member_string.= get_root_url().'admin.php?page=history';
495    $member_string.= '&amp;search_id='.$page['search_id'];
496    $member_string.= '&amp;user_id='.$user_id;
497    $member_string.= '">+</a>';
498
499    $member_strings[] = $member_string;
500  }
501
502  $template->assign(
503    'search_summary',
504    array(
505      'NB_LINES' => l10n_dec(
506        '%d line filtered', '%d lines filtered',
507        $page['nb_lines']
508        ),
509      'FILESIZE' => $summary['total_filesize'] != 0 ? ceil($summary['total_filesize']/1024).' MB' : '',
510      'USERS' => l10n_dec(
511        '%d user', '%d users',
512        $summary['nb_members'] + $summary['nb_guests']
513        ),
514      'MEMBERS' => sprintf(
515        l10n_dec('%d member', '%d members', $summary['nb_members']).': %s',
516        implode(', ', $member_strings)
517        ),
518      'GUESTS' => l10n_dec(
519        '%d guest', '%d guests',
520        $summary['nb_guests']
521        ),
522      )
523    );
524
525  unset($name_of_tag);
526}
527
528// +-----------------------------------------------------------------------+
529// |                            navigation bar                             |
530// +-----------------------------------------------------------------------+
531
532if (isset($page['search_id']))
533{
534  $navbar = create_navigation_bar(
535    get_root_url().'admin.php'.get_query_string_diff(array('start')),
536    $page['nb_lines'],
537    $page['start'],
538    $conf['nb_logs_page']
539    );
540
541  $template->assign('navbar', $navbar);
542}
543
544// +-----------------------------------------------------------------------+
545// |                             filter form                               |
546// +-----------------------------------------------------------------------+
547
548$form = array();
549
550if (isset($page['search']))
551{
552  if (isset($page['search']['fields']['date-after']))
553  {
554    $tokens = explode('-', $page['search']['fields']['date-after']);
555
556    $form['start_year']  = (int)$tokens[0];
557    $form['start_month'] = (int)$tokens[1];
558    $form['start_day']   = (int)$tokens[2];
559  }
560
561  if (isset($page['search']['fields']['date-before']))
562  {
563    $tokens = explode('-', $page['search']['fields']['date-before']);
564
565    $form['end_year']  = (int)$tokens[0];
566    $form['end_month'] = (int)$tokens[1];
567    $form['end_day']   = (int)$tokens[2];
568  }
569
570  $form['types'] = $page['search']['fields']['types'];
571
572  if (isset($page['search']['fields']['user']))
573  {
574    $form['user'] = $page['search']['fields']['user'];
575  }
576  else
577  {
578    $form['user'] = null;
579  }
580
581  $form['image_id'] = @$page['search']['fields']['image_id'];
582  $form['filename'] = @$page['search']['fields']['filename'];
583  $form['ip'] = @$page['search']['fields']['ip'];
584
585  $form['display_thumbnail'] = @$page['search']['fields']['display_thumbnail'];
586}
587else
588{
589  // by default, at page load, we want the selected date to be the current
590  // date
591  $form['start_year']  = $form['end_year']  = date('Y');
592  $form['start_month'] = $form['end_month'] = date('n');
593  $form['start_day']   = $form['end_day']   = date('j');
594  $form['types'] = $types;
595  // Hoverbox by default
596  $form['display_thumbnail'] =
597    pwg_get_cookie_var('display_thumbnail', 'no_display_thumbnail');
598}
599
600
601$month_list = $lang['month'];
602$month_list[0]='------------';
603ksort($month_list);
604
605$template->assign(
606  array(
607    'IMAGE_ID' => @$form['image_id'],
608    'FILENAME' => @$form['filename'],
609    'IP' => @$form['ip'],
610
611    'month_list' => $month_list,
612
613    'START_DAY_SELECTED' => @$form['start_day'],
614    'START_MONTH_SELECTED' => @$form['start_month'],
615    'START_YEAR' => @$form['start_year'],
616
617    'END_DAY_SELECTED' => @$form['end_day'],
618    'END_MONTH_SELECTED' => @$form['end_month'],
619    'END_YEAR'   => @$form['end_year'],
620    )
621  );
622
623$template->assign(
624    array(
625      'type_option_values' => $types,
626      'type_option_selected' => $form['types']
627    )
628  );
629
630
631$query = '
632SELECT
633    '.$conf['user_fields']['id'].' AS id,
634    '.$conf['user_fields']['username'].' AS username
635  FROM '.USERS_TABLE.'
636  ORDER BY username ASC
637;';
638$template->assign(
639  array(
640    'user_options' => query2array($query, 'id','username'),
641    'user_options_selected' => array(@$form['user'])
642  )
643);
644
645$template->assign('display_thumbnails', $display_thumbnails);
646$template->assign('display_thumbnail_selected', $form['display_thumbnail']);
647
648// +-----------------------------------------------------------------------+
649// |                           html code display                           |
650// +-----------------------------------------------------------------------+
651
652$template->assign_var_from_handle('ADMIN_CONTENT', 'history');
653?>
Note: See TracBrowser for help on using the repository browser.