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

Last change on this file since 1807 was 1800, checked in by rub, 18 years ago

Replace all flat_cat by flat.

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