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
RevLine 
[1727]1<?php
2// +-----------------------------------------------------------------------+
[8728]3// | Piwigo - a PHP based photo gallery                                    |
[2297]4// +-----------------------------------------------------------------------+
[26461]5// | Copyright(C) 2008-2014 Piwigo Team                  http://piwigo.org |
[2297]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// +-----------------------------------------------------------------------+
[1727]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');
[1881]42include_once(PHPWG_ROOT_PATH.'admin/include/functions_history.inc.php');
[1727]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
[1844]53$types = array('none', 'picture', 'high', 'other');
54
[5576]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
[1727]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
[1892]70$page['errors'] = array();
[1727]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
[2157]96  if (empty($_POST['types']))
97  {
98    $search['fields']['types'] = $types;
99  }
100  else
101  {
102    $search['fields']['types'] = $_POST['types'];
103  }
[1890]104
105  $search['fields']['user'] = $_POST['user'];
[1892]106
107  if (!empty($_POST['image_id']))
108  {
109    $search['fields']['image_id'] = intval($_POST['image_id']);
110  }
[2245]111
[1892]112  if (!empty($_POST['filename']))
113  {
114    $search['fields']['filename'] = str_replace(
115      '*',
116      '%',
[4325]117      pwg_db_real_escape_string($_POST['filename'])
[1892]118      );
119  }
120
[14688]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
[1992]130  $search['fields']['display_thumbnail'] = $_POST['display_thumbnail'];
131  // Display choise are also save to one cookie
[5576]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  }
[14688]141
[5576]142  pwg_set_cookie_var('display_thumbnail', $cookie_val, strtotime('+1 month') );
[1992]143
[1892]144  // TODO manage inconsistency of having $_POST['image_id'] and
145  // $_POST['filename'] simultaneously
[2245]146
[1727]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
[4892]159    $search_id = pwg_db_insert_id(SEARCH_TABLE);
[2245]160
[1727]161    redirect(
162      PHPWG_ROOT_PATH.'admin.php?page=history&search_id='.$search_id
163      );
164  }
165  else
166  {
[25018]167    $page['errors'][] = l10n('Empty query. No criteria has been entered.');
[1727]168  }
169}
170
171// +-----------------------------------------------------------------------+
172// |                             template init                             |
173// +-----------------------------------------------------------------------+
174
[2530]175$template->set_filename('history', 'history.tpl');
[1727]176
[1881]177// TabSheet initialization
178history_tabsheet();
179
[2245]180$template->assign(
[1727]181  array(
[5920]182    'U_HELP' => get_root_url().'admin/popuphelp.php?page=history',
[2245]183    'F_ACTION' => get_root_url().'admin.php?page=history'
[1727]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;';
[4325]200  list($serialized_rules) = pwg_db_fetch_row(pwg_query($query));
[1727]201
202  $page['search'] = unserialize($serialized_rules);
203
[1890]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'];
[2157]212
[1890]213    $query ='
214INSERT INTO '.SEARCH_TABLE.'
215  (rules)
216  VALUES
217  (\''.serialize($page['search']).'\')
218;';
219    pwg_query($query);
220
[4892]221    $search_id = pwg_db_insert_id(SEARCH_TABLE);
[2245]222
[1890]223    redirect(
224      PHPWG_ROOT_PATH.'admin.php?page=history&search_id='.$search_id
225      );
226  }
227
[27572]228  /*TODO - no need to get a huge number of rows from db (should take only what needed for display + SQL_CALC_FOUND_ROWS*/
[2157]229  $data = trigger_event('get_history', array(), $page['search'], $types);
230  usort($data, 'history_compare');
[1727]231
[2157]232  $page['nb_lines'] = count($data);
[1727]233
[1883]234  $history_lines = array();
235  $user_ids = array();
[1929]236  $username_of = array();
[1883]237  $category_ids = array();
238  $image_ids = array();
[14688]239  $has_tags = false;
[2157]240
241  foreach ($data as $row)
[1727]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
[1891]255    if (isset($row['tag_ids']))
256    {
[14688]257      $has_tags = true;
[1891]258    }
259
[14688]260    $history_lines[] = $row;
[1727]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();
[4325]275    while ($row = pwg_db_fetch_assoc($result))
[1727]276    {
[4304]277      $username_of[$row['id']] = stripslashes($row['username']);
[1727]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;';
[27572]288    $uppercats_of = query2array($query, 'id', 'uppercats');
[1727]289
290    $name_of_category = array();
[2245]291
[1727]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 = '
[1883]303SELECT
304    id,
305    IF(name IS NULL, file, name) AS label,
306    filesize,
[1991]307    file,
308    path,
[12796]309    representative_ext
[1727]310  FROM '.IMAGES_TABLE.'
311  WHERE id IN ('.implode(',', array_keys($image_ids)).')
312;';
[27572]313    $image_infos = query2array($query, 'id');
[1727]314  }
[1891]315
[14688]316  if ($has_tags > 0)
[1891]317  {
318    $query = '
319SELECT
320    id,
[23151]321    name, url_name
[14688]322  FROM '.TAGS_TABLE;
[26972]323
324    global $name_of_tag; // used for preg_replace
[23151]325    $name_of_tag = array();
326    $result = pwg_query($query);
327    while ($row=pwg_db_fetch_assoc($result))
328    {
[26649]329      $name_of_tag[ $row['id'] ] = '<a href="'.make_index_url( array('tags'=>array($row))).'">'.trigger_event("render_tag_name", $row['name'], $row).'</a>';
[23151]330    }
[1891]331  }
[2245]332
[1727]333  $i = 0;
[1883]334  $first_line = $page['start'] + 1;
335  $last_line = $page['start'] + $conf['nb_logs_page'];
[1727]336
[1893]337  $summary['total_filesize'] = 0;
338  $summary['guests_IP'] = array();
[1883]339
[1727]340  foreach ($history_lines as $line)
341  {
[16282]342    if (isset($line['image_type']) and $line['image_type'] == 'high')
[1883]343    {
[27572]344      $summary['total_filesize'] += @intval($image_infos[$line['image_id']]['filesize']);
[1883]345    }
[1893]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      }
[2245]353
[1893]354      $summary['guests_IP'][ $line['IP'] ]++;
355    }
[2245]356
[1883]357    $i++;
[2245]358
[1883]359    if ($i < $first_line or $i > $last_line)
360    {
361      continue;
362    }
[1890]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>';
[1891]378
379    $tags_string = '';
380    if (isset($line['tag_ids']))
381    {
[26972]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];'),
[1891]385        str_replace(
386          ',',
387          ', ',
388          $line['tag_ids']
389          )
390        );
391    }
[1896]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        );
[1992]401
[27572]402      if (isset($image_infos[$line['image_id']]))
[9808]403      {
404        $element = array(
405          'id' => $line['image_id'],
[27572]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'],
[9808]409          );
410        $thumbnail_display = $page['search']['fields']['display_thumbnail'];
411      }
412      else
413      {
414        $thumbnail_display = 'no_display_thumbnail';
415      }
[1992]416
417      $image_title = '('.$line['image_id'].')';
418
[27572]419      if (isset($image_infos[$line['image_id']]['label']))
[1896]420      {
[27572]421        $image_title.= ' '.trigger_event('render_element_description', $image_infos[$line['image_id']]['label']);
[1896]422      }
423      else
424      {
[1992]425        $image_title.= ' unknown filename';
[1896]426      }
[1992]427
428      $image_string = '';
429
[9808]430      switch ($thumbnail_display)
[1992]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.'">'
[12796]441            .'<span><img src="'.DerivativeImage::thumb_url($element)
[1992]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.'">'
[12796]450            .'<span><img src="'.DerivativeImage::thumb_url($element)
[1992]451            .'" alt="'.$image_title.'" title="'.$image_title.'">'
452            .'</span>'.$image_title.'</a>';
453          break;
454        }
455      }
[1896]456    }
[2245]457
458    $template->append(
459      'search_results',
[1727]460      array(
461        'DATE'      => $line['date'],
462        'TIME'      => $line['time'],
[1890]463        'USER'      => $user_string,
[1727]464        'IP'        => $line['IP'],
[1896]465        'IMAGE'     => $image_string,
[1844]466        'TYPE'      => $line['image_type'],
[1727]467        'SECTION'   => $line['section'],
468        'CATEGORY'  => isset($line['category_id'])
[1821]469          ? ( isset($name_of_category[$line['category_id']])
470                ? $name_of_category[$line['category_id']]
471                : 'deleted '.$line['category_id'] )
[1727]472          : '',
[1891]473        'TAGS'       => $tags_string,
[1727]474        )
475      );
476  }
[1883]477
[1893]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  }
[2245]487
[1893]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="';
[2245]494    $member_string.= get_root_url().'admin.php?page=history';
[1893]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  }
[2245]501
502  $template->assign(
503    'search_summary',
[1883]504    array(
[1932]505      'NB_LINES' => l10n_dec(
506        '%d line filtered', '%d lines filtered',
[1893]507        $page['nb_lines']
508        ),
[16282]509      'FILESIZE' => $summary['total_filesize'] != 0 ? ceil($summary['total_filesize']/1024).' MB' : '',
[1932]510      'USERS' => l10n_dec(
511        '%d user', '%d users',
[1893]512        $summary['nb_members'] + $summary['nb_guests']
513        ),
514      'MEMBERS' => sprintf(
[1932]515        l10n_dec('%d member', '%d members', $summary['nb_members']).': %s',
[25005]516        implode(', ', $member_strings)
[1893]517        ),
[1932]518      'GUESTS' => l10n_dec(
519        '%d guest', '%d guests',
[1893]520        $summary['nb_guests']
521        ),
[1883]522      )
523    );
[26972]524
525  unset($name_of_tag);
[1727]526}
527
528// +-----------------------------------------------------------------------+
529// |                            navigation bar                             |
530// +-----------------------------------------------------------------------+
531
532if (isset($page['search_id']))
533{
534  $navbar = create_navigation_bar(
[2245]535    get_root_url().'admin.php'.get_query_string_diff(array('start')),
[1727]536    $page['nb_lines'],
537    $page['start'],
538    $conf['nb_logs_page']
539    );
540
[3172]541  $template->assign('navbar', $navbar);
[1727]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']);
[2245]555
[1727]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']);
[1817]564
565    $form['end_year']  = (int)$tokens[0];
566    $form['end_month'] = (int)$tokens[1];
567    $form['end_day']   = (int)$tokens[2];
[1727]568  }
[1817]569
[1844]570  $form['types'] = $page['search']['fields']['types'];
[1890]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  }
[1892]580
581  $form['image_id'] = @$page['search']['fields']['image_id'];
582  $form['filename'] = @$page['search']['fields']['filename'];
[14688]583  $form['ip'] = @$page['search']['fields']['ip'];
[1992]584
585  $form['display_thumbnail'] = @$page['search']['fields']['display_thumbnail'];
[1727]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');
[1844]594  $form['types'] = $types;
[1992]595  // Hoverbox by default
596  $form['display_thumbnail'] =
[5576]597    pwg_get_cookie_var('display_thumbnail', 'no_display_thumbnail');
[1727]598}
599
600
[2245]601$month_list = $lang['month'];
602$month_list[0]='------------';
603ksort($month_list);
604
605$template->assign(
[1727]606  array(
[1892]607    'IMAGE_ID' => @$form['image_id'],
608    'FILENAME' => @$form['filename'],
[14688]609    'IP' => @$form['ip'],
[2245]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'],
[1727]620    )
621  );
[1817]622
[2245]623$template->assign(
[1844]624    array(
[2245]625      'type_option_values' => $types,
626      'type_option_selected' => $form['types']
[1890]627    )
628  );
629
[2245]630
[1890]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;';
[2245]638$template->assign(
639  array(
[27572]640    'user_options' => query2array($query, 'id','username'),
[2245]641    'user_options_selected' => array(@$form['user'])
642  )
643);
[1890]644
[5576]645$template->assign('display_thumbnails', $display_thumbnails);
646$template->assign('display_thumbnail_selected', $form['display_thumbnail']);
[1890]647
[1727]648// +-----------------------------------------------------------------------+
649// |                           html code display                           |
650// +-----------------------------------------------------------------------+
651
652$template->assign_var_from_handle('ADMIN_CONTENT', 'history');
[2245]653?>
Note: See TracBrowser for help on using the repository browser.