source: trunk/admin/history.php @ 27572

Revision 27572, 18.0 KB checked in by rvelices, 6 years ago (diff)

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

  • Property svn:eol-style set to LF
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.