source: trunk/include/section_init.inc.php @ 1685

Last change on this file since 1685 was 1681, checked in by rub, 17 years ago

Fix Feature Issue ID 0000608: crash when asking random images with no images are allowed

  • Property svn:eol-style set to native
  • Property svn:keywords set to Author Date Id Revision
File size: 20.1 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-2006 PhpWebGallery Team - http://phpwebgallery.net |
6// +-----------------------------------------------------------------------+
7// | branch        : BSF (Best So Far)
8// | file          : $Id: section_init.inc.php 1681 2006-12-27 20:26:36Z rub $
9// | last update   : $Date: 2006-12-27 20:26:36 +0000 (Wed, 27 Dec 2006) $
10// | last modifier : $Author: rub $
11// | revision      : $Revision: 1681 $
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 * This included page checks section related parameter and provides
30 * following informations:
31 *
32 * - $page['title']
33 *
34 * - $page['items']: ordered list of items to display
35 *
36 * - $page['cat_nb_images']: number of items in the section (should be equal
37 * to count($page['items']))
38 *
39 * - $page['thumbnails_include']: include page managing thumbnails to
40 * display
41 */
42
43// "index.php?/category/12-foo/start-24&action=fill_caddie" or
44// "index.php/category/12-foo/start-24&action=fill_caddie"
45// must return :
46//
47// array(
48//   'section'  => 'categories',
49//   'category' => 12,
50//   'start'    => 24
51//   'action'   => 'fill_caddie'
52//   );
53
54$page['section'] = 'categories';
55
56// some ISPs set PATH_INFO to empty string or to SCRIPT_FILENAME while in the
57// default apache implementation it is not set
58if ( $conf['question_mark_in_urls']==false and
59     isset($_SERVER["PATH_INFO"]) and !empty($_SERVER["PATH_INFO"]) )
60{
61  $rewritten = $_SERVER["PATH_INFO"];
62  $rewritten = str_replace('//', '/', $rewritten);
63  $path_count = count( explode('/', $rewritten) );
64  $page['root_path'] = PHPWG_ROOT_PATH.str_repeat('../', $path_count-1);
65}
66else
67{
68  $rewritten = '';
69  foreach (array_keys($_GET) as $keynum => $key)
70  {
71    $rewritten = $key;
72    break;
73  }
74  $page['root_path'] = PHPWG_ROOT_PATH;
75}
76
77// deleting first "/" if displayed
78$tokens = explode(
79  '/',
80  preg_replace('#^/#', '', $rewritten)
81  );
82// $tokens = array(
83//   0 => category,
84//   1 => 12-foo,
85//   2 => start-24
86//   );
87
88$next_token = 0;
89if (basename($_SERVER['SCRIPT_FILENAME']) == 'picture.php')
90{ // the first token must be the identifier for the picture
91  if ( isset($_GET['image_id'])
92       and isset($_GET['cat']) and is_numeric($_GET['cat']) )
93  {// url compatibility with versions below 1.6
94    $url = make_picture_url( array(
95        'section' => 'categories',
96        'category' => $_GET['cat'],
97        'image_id' => $_GET['image_id']
98      ) );
99    redirect($url);
100  }
101  $token = $tokens[$next_token];
102  $next_token++;
103  if ( is_numeric($token) )
104  {
105    $page['image_id'] = $token;
106  }
107  else
108  {
109    preg_match('/^(\d+-)?(.*)?$/', $token, $matches);
110    if (isset($matches[1]) and is_numeric($matches[1]=rtrim($matches[1],'-')) )
111    {
112      $page['image_id'] = $matches[1];
113      if ( !empty($matches[2]) )
114      {
115        $page['image_file'] = $matches[2];
116      }
117
118    }
119    else
120    {
121      if ( !empty($matches[2]) )
122      {
123        $page['image_file'] = $matches[2];
124      }
125      else
126      {
127        die('Fatal: picture identifier is missing');
128      }
129    }
130  }
131}
132
133if (0 === strpos($tokens[$next_token], 'categor'))
134{
135  $page['section'] = 'categories';
136  $next_token++;
137
138  if (isset($tokens[$next_token])
139      and preg_match('/^(\d+)/', $tokens[$next_token], $matches))
140  {
141    $page['category'] = $matches[1];
142    $next_token++;
143  }
144}
145else if (0 === strpos($tokens[$next_token], 'tag'))
146{
147  $page['section'] = 'tags';
148  $page['tags'] = array();
149
150  $next_token++;
151  $i = $next_token;
152
153  $requested_tag_ids = array();
154  $requested_tag_url_names = array();
155
156  while (isset($tokens[$i]))
157  {
158    if ( preg_match('/^(created-|posted-|start-(\d)+)/', $tokens[$i]) )
159      break;
160
161    if ( preg_match('/^(\d+)(?:-(.*))?/', $tokens[$i], $matches) )
162    {
163      array_push($requested_tag_ids, $matches[1]);
164    }
165    else
166    {
167      array_push($requested_tag_url_names, "'".$tokens[$i]."'");
168    }
169    $i++;
170  }
171  $next_token = $i;
172
173  if ( empty($requested_tag_ids) && empty($requested_tag_url_names) )
174  {
175    die('Fatal: at least one tag required');
176  }
177  // tag infos
178  $query = '
179SELECT name, url_name, id
180  FROM '.TAGS_TABLE.'
181  WHERE ';
182  if ( !empty($requested_tag_ids) )
183  {
184    $query.= 'id IN ('.implode(',', $requested_tag_ids ).')';
185  }
186  if ( !empty($requested_tag_url_names) )
187  {
188    if ( !empty($requested_tag_ids) )
189    {
190      $query.= ' OR ';
191    }
192    $query.= 'url_name IN ('.implode(',', $requested_tag_url_names ).')';
193  }
194  $result = pwg_query($query);
195  $tag_infos = array();
196  while ($row = mysql_fetch_assoc($result))
197  {
198    $tag_infos[ $row['id'] ] = $row;
199    array_push($page['tags'], $row );//we loose given tag order; is it important?
200  }
201  if ( empty($page['tags']) )
202  {
203    page_not_found('Requested tag does not exist', get_root_url().'tags.php' );
204  }
205}
206else if (0 === strpos($tokens[$next_token], 'fav'))
207{
208  $page['section'] = 'favorites';
209  $next_token++;
210}
211else if ('most_visited' == $tokens[$next_token])
212{
213  $page['section'] = 'most_visited';
214  $next_token++;
215}
216else if ('best_rated' == $tokens[$next_token])
217{
218  $page['section'] = 'best_rated';
219  $next_token++;
220}
221else if ('recent_pics' == $tokens[$next_token])
222{
223  $page['section'] = 'recent_pics';
224  $next_token++;
225}
226else if ('recent_cats' == $tokens[$next_token])
227{
228  $page['section'] = 'recent_cats';
229  $next_token++;
230}
231else if ('search' == $tokens[$next_token])
232{
233  $page['section'] = 'search';
234  $next_token++;
235
236  preg_match('/(\d+)/', $tokens[$next_token], $matches);
237  if (!isset($matches[1]))
238  {
239    die('Fatal: search identifier is missing');
240  }
241  $page['search'] = $matches[1];
242  $next_token++;
243}
244else if ('list' == $tokens[$next_token])
245{
246  $page['section'] = 'list';
247  $next_token++;
248
249  $page['list'] = array();
250 
251  // No pictures
252  if (empty($tokens[$next_token]))
253  {
254    // Add dummy element list
255    array_push($page['list'], -1);
256  }
257  // With pictures list
258  else
259  {
260    if (!preg_match('/^\d+(,\d+)*$/', $tokens[$next_token]))
261    {
262      die('wrong format on list GET parameter');
263    }
264    foreach (explode(',', $tokens[$next_token]) as $image_id)
265    {
266      array_push($page['list'], $image_id);
267    }
268  }
269  $next_token++;
270}
271
272$i = $next_token;
273
274while (isset($tokens[$i]))
275{
276  if (preg_match('/^start-(\d+)/', $tokens[$i], $matches))
277  {
278    $page['start'] = $matches[1];
279  }
280
281  if (preg_match('/^flat_recent_cat-(\d+)/', $tokens[$i], $matches))
282  {
283    // indicate a special list of images
284    $page['flat_recent_cat'] = $matches[1];
285  }
286
287  if (preg_match('/^(posted|created)/', $tokens[$i] ))
288  {
289    $chronology_tokens = explode('-', $tokens[$i] );
290
291    $page['chronology_field'] = $chronology_tokens[0];
292
293    array_shift($chronology_tokens);
294    $page['chronology_style'] = $chronology_tokens[0];
295
296    array_shift($chronology_tokens);
297    if ( count($chronology_tokens)>0 )
298    {
299      if ('list'==$chronology_tokens[0] or
300          'calendar'==$chronology_tokens[0])
301      {
302        $page['chronology_view'] = $chronology_tokens[0];
303        array_shift($chronology_tokens);
304      }
305      $page['chronology_date'] = $chronology_tokens;
306    }
307  }
308
309  $i++;
310}
311
312
313// $page['nb_image_page'] is the number of picture to display on this page
314// By default, it is the same as the $user['nb_image_page']
315$page['nb_image_page'] = $user['nb_image_page'];
316
317if (pwg_get_session_var('image_order',0) > 0)
318{
319  $orders = get_category_preferred_image_orders();
320
321  $conf['order_by'] = str_replace(
322    'ORDER BY ',
323    'ORDER BY '.$orders[ pwg_get_session_var('image_order',0) ][1].',',
324    $conf['order_by']
325    );
326  $page['super_order_by'] = true;
327}
328
329// +-----------------------------------------------------------------------+
330// |                              category                                 |
331// +-----------------------------------------------------------------------+
332if ('categories' == $page['section'])
333{
334  if (isset($page['category']))
335  {
336    $result = get_cat_info($page['category']);
337    if (empty($result))
338    {
339      page_not_found('Requested category does not exist' );
340    }
341
342    $page = array_merge(
343      $page,
344      array(
345        'comment'            => $result['comment'],
346        'cat_dir'            => $result['dir'],
347        'cat_name'           => $result['name'],
348        'cat_site_id'        => $result['site_id'],
349        'cat_uploadable'     => $result['uploadable'],
350        'cat_commentable'    => $result['commentable'],
351        'cat_id_uppercat'    => $result['id_uppercat'],
352        'uppercats'          => $result['uppercats'],
353        'title'             => 
354          get_cat_display_name($result['name'], '', false),
355        'thumbnails_include' => 
356          (($result['nb_images'] > 0) or (isset($page['flat_recent_cat'])))
357          ? 'include/category_default.inc.php'
358          : 'include/category_cats.inc.php'
359        )
360      );
361  }
362  else
363  {
364    $page['title'] = $lang['no_category'];
365    $page['thumbnails_include'] = 
366      (isset($page['flat_recent_cat']))
367          ? 'include/category_default.inc.php'
368          : 'include/category_cats.inc.php';
369  }
370
371  if (isset($page['flat_recent_cat']))
372  {
373    $page['title'] = $lang['recent_pics_cat'].' : '.$page['title'] ;
374  }
375
376  if 
377    (
378      (!isset($page['chronology_field'])) and
379      (
380        (isset($page['category'])) or 
381        (isset($page['flat_recent_cat']))
382      )
383    )
384  {
385    if ( !empty($result['image_order']) and !isset($page['super_order_by']) )
386    {
387      $conf[ 'order_by' ] = ' ORDER BY '.$result['image_order'];
388    }
389
390    if (isset($page['flat_recent_cat']))
391    {
392      // flat recent categories mode
393        $query = '
394SELECT
395  DISTINCT(ic.image_id)
396FROM '.IMAGES_TABLE.' AS i
397       INNER JOIN '.IMAGE_CATEGORY_TABLE.' AS ic ON i.id = ic.image_id
398       INNER JOIN '.CATEGORIES_TABLE.' AS c ON ic.category_id = c.id
399WHERE
400  date_available  > SUBDATE(
401      CURRENT_DATE,INTERVAL '.$page['flat_recent_cat'].' DAY)'.
402  (isset($page['category']) ? '
403  AND uppercats REGEXP \'(^|,)'.$page['category'].'(,|$)\'' : '' ).'
404'.get_sql_condition_FandF
405  (
406    array
407      (
408        'forbidden_categories' => 'category_id',
409        'visible_categories' => 'category_id',
410        'visible_images' => 'image_id'
411      ),
412    'AND'
413  ).'
414;';
415
416      $where_sql = array_from_query($query, 'image_id');
417      if (!empty($where_sql))
418      {
419        $where_sql = 'image_id in ('.implode(',', $where_sql).')';
420      }
421    }
422    else
423    {
424      // Normal mode
425      $where_sql = 'category_id = '.$page['category'];
426    }
427
428    if (!empty($where_sql))
429    {
430      // Main query
431      $query = '
432SELECT image_id
433  FROM '.IMAGE_CATEGORY_TABLE.'
434    INNER JOIN '.IMAGES_TABLE.' ON id = image_id
435  WHERE
436    '.$where_sql.'
437'.get_sql_condition_FandF
438  (
439    array
440      (
441        'forbidden_categories' => 'category_id',
442        'visible_categories' => 'category_id',
443        'visible_images' => 'image_id'
444      ),
445    'AND'
446  ).'
447  '.$conf['order_by'].'
448;';
449
450      $page['items'] = array_from_query($query, 'image_id');
451    }
452    else
453    {
454      $page['items'] = array();
455    }
456  } //otherwise the calendar will requery all subitems
457}
458// special sections
459else
460{
461  $forbidden = 
462    get_sql_condition_FandF
463    (
464      array
465        (
466          'forbidden_categories' => 'category_id',
467          'visible_categories' => 'category_id',
468          'visible_images' => 'image_id'
469        ),
470      'AND'
471    );
472
473// +-----------------------------------------------------------------------+
474// |                            tags section                               |
475// +-----------------------------------------------------------------------+
476  if ($page['section'] == 'tags')
477  {
478    $page['tag_ids'] = array();
479    foreach ($page['tags'] as $tag)
480    {
481      array_push($page['tag_ids'], $tag['id']);
482    }
483
484    $items = get_image_ids_for_tags($page['tag_ids']);
485
486    // permissions depends on category, so to only keep images that are
487    // reachable to the connected user, we need to check category
488    // associations
489    if (!empty($items) )
490    {
491      $query = '
492SELECT image_id
493  FROM '.IMAGE_CATEGORY_TABLE.' INNER JOIN '.IMAGES_TABLE.' ON image_id=id
494  WHERE image_id IN ('.implode(',', $items).')
495    '.$forbidden.
496    $conf['order_by'].'
497;';
498      $items = array_unique(
499        array_from_query($query, 'image_id')
500        );
501    }
502
503    $title = get_tags_content_title();
504
505    $page = array_merge(
506      $page,
507      array(
508        'title' => $title,
509        'items' => array_values($items),
510        'thumbnails_include' => 'include/category_default.inc.php',
511        )
512      );
513  }
514// +-----------------------------------------------------------------------+
515// |                           search section                              |
516// +-----------------------------------------------------------------------+
517  if ($page['section'] == 'search')
518  {
519    include_once( PHPWG_ROOT_PATH .'include/functions_search.inc.php' );
520
521    $search_result = get_search_results($page['search']);
522    if ( !empty($search_result['items']) and !isset($search_result['as_is']) )
523    {
524      $query = '
525SELECT DISTINCT(id)
526  FROM '.IMAGES_TABLE.'
527    INNER JOIN '.IMAGE_CATEGORY_TABLE.' AS ic ON id = ic.image_id
528  WHERE id IN ('.implode(',', $search_result['items']).')
529    '.$forbidden.'
530  '.$conf['order_by'].'
531;';
532      $page['items'] = array_from_query($query, 'id');
533    }
534    else
535    {
536      $page['items'] = $search_result['items'];
537    }
538
539    $page = array_merge(
540      $page,
541      array(
542        'title' => $lang['search_result'],
543        'thumbnails_include' => 'include/category_default.inc.php',
544        )
545      );
546  }
547// +-----------------------------------------------------------------------+
548// |                           favorite section                            |
549// +-----------------------------------------------------------------------+
550  else if ($page['section'] == 'favorites')
551  {
552    check_user_favorites();
553
554    $query = '
555SELECT image_id
556  FROM '.FAVORITES_TABLE.'
557    INNER JOIN '.IMAGES_TABLE.' ON image_id = id
558  WHERE user_id = '.$user['id'].'
559'.get_sql_condition_FandF
560  (
561    array
562      (
563        'visible_images' => 'image_id'
564      ),
565    'AND'
566  ).'
567  '.$conf['order_by'].'
568;';
569
570    $page = array_merge(
571      $page,
572      array(
573        'title' => $lang['favorites'],
574        'items' => array_from_query($query, 'image_id'),
575        'thumbnails_include' => 'include/category_default.inc.php',
576        )
577      );
578  }
579// +-----------------------------------------------------------------------+
580// |                       recent pictures section                         |
581// +-----------------------------------------------------------------------+
582  else if ($page['section'] == 'recent_pics')
583  {
584    $query = '
585SELECT DISTINCT(id)
586  FROM '.IMAGES_TABLE.'
587    INNER JOIN '.IMAGE_CATEGORY_TABLE.' AS ic ON id = ic.image_id
588  WHERE date_available > \''.
589      date('Y-m-d', time() - 60*60*24*$user['recent_period']).'\'
590    '.$forbidden.'
591  '.$conf['order_by'].'
592;';
593
594    $page = array_merge(
595      $page,
596      array(
597        'title' => '<a href="'.duplicate_index_url().'">'
598                  .$lang['recent_pics_cat'].'</a>',
599        'items' => array_from_query($query, 'id'),
600        'thumbnails_include' => 'include/category_default.inc.php',
601        )
602      );
603  }
604// +-----------------------------------------------------------------------+
605// |                 recently updated categories section                   |
606// +-----------------------------------------------------------------------+
607  else if ($page['section'] == 'recent_cats')
608  {
609    $page = array_merge(
610      $page,
611      array(
612        'title' => $lang['recent_cats_cat'],
613        'thumbnails_include' => 'include/category_cats.inc.php',
614        )
615      );
616  }
617// +-----------------------------------------------------------------------+
618// |                        most visited section                           |
619// +-----------------------------------------------------------------------+
620  else if ($page['section'] == 'most_visited')
621  {
622    $page['super_order_by'] = true;
623    $conf['order_by'] = ' ORDER BY hit DESC, file ASC';
624    $query = '
625SELECT DISTINCT(id)
626  FROM '.IMAGES_TABLE.'
627    INNER JOIN '.IMAGE_CATEGORY_TABLE.' AS ic ON id = ic.image_id
628  WHERE hit > 0
629    '.$forbidden.'
630    '.$conf['order_by'].'
631  LIMIT 0, '.$conf['top_number'].'
632;';
633
634    $page = array_merge(
635      $page,
636      array(
637        'title' => '<a href="'.duplicate_index_url().'">'
638                  .$conf['top_number'].' '.$lang['most_visited_cat'].'</a>',
639        'items' => array_from_query($query, 'id'),
640        'thumbnails_include' => 'include/category_default.inc.php',
641        )
642      );
643  }
644// +-----------------------------------------------------------------------+
645// |                          best rated section                           |
646// +-----------------------------------------------------------------------+
647  else if ($page['section'] == 'best_rated')
648  {
649    $page['super_order_by'] = true;
650    $conf['order_by'] = ' ORDER BY average_rate DESC, id ASC';
651
652    $query ='
653SELECT DISTINCT(id)
654  FROM '.IMAGES_TABLE.'
655    INNER JOIN '.IMAGE_CATEGORY_TABLE.' AS ic ON id = ic.image_id
656  WHERE average_rate IS NOT NULL
657    '.$forbidden.'
658    '.$conf['order_by'].'
659  LIMIT 0, '.$conf['top_number'].'
660;';
661    $page = array_merge(
662      $page,
663      array(
664        'title' => '<a href="'.duplicate_index_url().'">'
665                  .$conf['top_number'].' '.$lang['best_rated_cat'].'</a>',
666        'items' => array_from_query($query, 'id'),
667        'thumbnails_include' => 'include/category_default.inc.php',
668        )
669      );
670  }
671// +-----------------------------------------------------------------------+
672// |                             list section                              |
673// +-----------------------------------------------------------------------+
674  else if ($page['section'] == 'list')
675  {
676    $query ='
677SELECT DISTINCT(id)
678  FROM '.IMAGES_TABLE.'
679    INNER JOIN '.IMAGE_CATEGORY_TABLE.' AS ic ON id = ic.image_id
680  WHERE image_id IN ('.implode(',', $page['list']).')
681    '.$forbidden.'
682  '.$conf['order_by'].'
683;';
684
685    $page = array_merge(
686      $page,
687      array(
688        'title' => '<a href="'.duplicate_index_url().'">'
689                    .$lang['random_cat'].'</a>',
690        'items' => array_from_query($query, 'id'),
691        'thumbnails_include' => 'include/category_default.inc.php',
692        )
693      );
694  }
695}
696
697// +-----------------------------------------------------------------------+
698// |                             chronology                                |
699// +-----------------------------------------------------------------------+
700
701if (isset($page['chronology_field']))
702{
703  include_once( PHPWG_ROOT_PATH.'include/functions_calendar.inc.php' );
704  initialize_calendar();
705}
706
707$page['cat_nb_images'] = isset($page['items']) ? count($page['items']) : 0;
708
709if (basename($_SERVER['SCRIPT_FILENAME']) == 'picture.php'
710    and !isset($page['image_id']) )
711{
712  if ( !empty($page['items']) )
713  {
714    $query = '
715SELECT id,file
716  FROM '.IMAGES_TABLE .'
717  WHERE id IN ('.implode(',',$page['items']).')
718  AND file LIKE "' . $page['image_file'] . '.%" ESCAPE "|"'
719;
720    $result = pwg_query($query);
721    if (mysql_num_rows($result)>0)
722    {
723      list($page['image_id'], $page['image_file']) = mysql_fetch_row($result);
724    }
725  }
726  if ( !isset($page['image_id']) )
727  {
728    $page['image_id'] = -1; // will fail in picture.php
729  }
730}
731
732trigger_action('loc_end_section_init');
733?>
Note: See TracBrowser for help on using the repository browser.