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

Last change on this file since 3282 was 3282, checked in by plg, 15 years ago

change: according to topic:15067, svn:keywords property was removed

  • Property svn:eol-style set to LF
File size: 18.1 KB
Line 
1<?php
2// +-----------------------------------------------------------------------+
3// | Piwigo - a PHP based picture gallery                                  |
4// +-----------------------------------------------------------------------+
5// | Copyright(C) 2008-2009 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 * This included page checks section related parameter and provides
26 * following informations:
27 *
28 * - $page['title']
29 *
30 * - $page['items']: ordered list of items to display
31 *
32 */
33
34// "index.php?/category/12-foo/start-24" or
35// "index.php/category/12-foo/start-24"
36// must return :
37//
38// array(
39//   'section'  => 'categories',
40//   'category' => array('id'=>12, ...),
41//   'start'    => 24
42//   );
43
44$page['items'] = array();
45
46// some ISPs set PATH_INFO to empty string or to SCRIPT_FILENAME while in the
47// default apache implementation it is not set
48if ( $conf['question_mark_in_urls']==false and
49     isset($_SERVER["PATH_INFO"]) and !empty($_SERVER["PATH_INFO"]) )
50{
51  $rewritten = $_SERVER["PATH_INFO"];
52  $rewritten = str_replace('//', '/', $rewritten);
53  $path_count = count( explode('/', $rewritten) );
54  $page['root_path'] = PHPWG_ROOT_PATH.str_repeat('../', $path_count-1);
55}
56else
57{
58  $rewritten = '';
59  foreach (array_keys($_GET) as $keynum => $key)
60  {
61    $rewritten = $key;
62    break;
63  }
64  $page['root_path'] = PHPWG_ROOT_PATH;
65}
66
67// deleting first "/" if displayed
68$tokens = explode('/', ltrim($rewritten, '/') );
69// $tokens = array(
70//   0 => category,
71//   1 => 12-foo,
72//   2 => start-24
73//   );
74
75$next_token = 0;
76if (script_basename() == 'picture') // basename without file extention
77{ // the first token must be the identifier for the picture
78  if ( isset($_GET['image_id'])
79       and isset($_GET['cat']) and is_numeric($_GET['cat']) )
80  {// url compatibility with versions below 1.6
81    $url = make_picture_url( array(
82        'section' => 'categories',
83        'category' => get_cat_info($_GET['cat']),
84        'image_id' => $_GET['image_id']
85      ) );
86    redirect($url);
87  }
88  $token = $tokens[$next_token];
89  $next_token++;
90  if ( is_numeric($token) )
91  {
92    $page['image_id'] = $token;
93    if ($page['image_id']==0)
94    {
95      bad_request('invalid picture identifier');
96    }
97  }
98  else
99  {
100    preg_match('/^(\d+-)?(.*)?$/', $token, $matches);
101    if (isset($matches[1]) and is_numeric($matches[1]=rtrim($matches[1],'-')) )
102    {
103      $page['image_id'] = $matches[1];
104      if ( !empty($matches[2]) )
105      {
106        $page['image_file'] = $matches[2];
107      }
108    }
109    else
110    {
111      $page['image_id'] = 0; // more work in picture.php
112      if ( !empty($matches[2]) )
113      {
114        $page['image_file'] = $matches[2];
115      }
116      else
117      {
118        bad_request('picture identifier is missing');
119      }
120    }
121  }
122}
123
124$page = array_merge( $page, parse_section_url( $tokens, $next_token) );
125if ( !isset($page['section']) )
126{
127  $page['section'] = 'categories';
128
129  switch (script_basename())
130  {
131    case 'picture':
132      break;
133    case 'index':
134    {
135      // No section defined, go to selected url
136      if (!empty($conf['random_index_redirect']) and empty($tokens[$next_token]) )
137      {
138        $random_index_redirect = array();
139        foreach ($conf['random_index_redirect'] as $random_url => $random_url_condition)
140        {
141          if (empty($random_url_condition) or eval($random_url_condition))
142          {
143            $random_index_redirect[] = $random_url;
144          }
145        }
146        if (!empty($random_index_redirect))
147        {
148          redirect($random_index_redirect[mt_rand(0, count($random_index_redirect)-1)]);
149        }
150      }
151      break;
152    }
153    default:
154      trigger_error('script_basename "'.script_basename().'" unknown',
155        E_USER_WARNING);
156  }
157}
158
159
160$page = array_merge( $page, parse_well_known_params_url( $tokens, $next_token) );
161
162
163if ( script_basename()=='picture' and 'categories'==$page['section'] and
164      !isset($page['category']) and !isset($page['chronology_field']) )
165{ //access a picture only by id, file or id-file without given section
166  $page['flat']=true;
167}
168
169// $page['nb_image_page'] is the number of picture to display on this page
170// By default, it is the same as the $user['nb_image_page']
171$page['nb_image_page'] = $user['nb_image_page'];
172
173// if flat mode is active, we must consider the image set as a standard set
174// and not as a category set because we can't use the #image_category.rank :
175// displayed images are not directly linked to the displayed category
176if ('categories' == $page['section'] and !isset($page['flat']))
177{
178  $conf['order_by'] = $conf['order_by_inside_category'];
179}
180
181if (pwg_get_session_var('image_order',0) > 0)
182{
183  $image_order_id = pwg_get_session_var('image_order');
184
185  $orders = get_category_preferred_image_orders();
186
187  // the current session stored image_order might be not compatible with
188  // current image set, for example if the current image_order is the rank
189  // and that we are displaying images related to a tag.
190  //
191  // In case of incompatibility, the session stored image_order is removed.
192  if ($orders[$image_order_id][2])
193  {
194    $conf['order_by'] = str_replace(
195      'ORDER BY ',
196      'ORDER BY '.$orders[$image_order_id][1].',',
197      $conf['order_by']
198    );
199    $page['super_order_by'] = true;
200
201  }
202  else
203  {
204    pwg_unset_session_var('image_order');
205    $page['super_order_by'] = false;
206  }
207}
208
209$forbidden = get_sql_condition_FandF(
210      array
211        (
212          'forbidden_categories' => 'category_id',
213          'visible_categories' => 'category_id',
214          'visible_images' => 'id'
215        ),
216      'AND'
217  );
218
219// +-----------------------------------------------------------------------+
220// |                              category                                 |
221// +-----------------------------------------------------------------------+
222if ('categories' == $page['section'])
223{
224  if (isset($page['category']))
225  {
226    $page = array_merge(
227      $page,
228      array(
229        'comment'           =>
230            trigger_event(
231              'render_category_description',
232              $page['category']['comment'],
233              'main_page_category_description'
234            ),
235        'title'             =>
236          get_cat_display_name($page['category']['upper_names'], '', false),
237        )
238      );
239  }
240  else
241  {
242    $page['title'] = l10n('no_category');
243  }
244
245  if
246    (
247      (!isset($page['chronology_field'])) and
248      (
249        (isset($page['category'])) or
250        (isset($page['flat']))
251      )
252    )
253  {
254    if ( !empty($page['category']['image_order']) and !isset($page['super_order_by']) )
255    {
256      $conf[ 'order_by' ] = ' ORDER BY '.$page['category']['image_order'];
257    }
258
259    if (isset($page['flat']))
260    {// flat categories mode
261      if ( isset($page['category']) )
262      { // get all allowed sub-categories
263        $query = '
264SELECT id
265  FROM '.CATEGORIES_TABLE.'
266  WHERE
267    uppercats LIKE "'.$page['category']['uppercats'].',%" '
268    .get_sql_condition_FandF(
269      array
270        (
271          'forbidden_categories' => 'id',
272          'visible_categories' => 'id',
273        ),
274      "\n  AND"
275          );
276        $subcat_ids = array_from_query($query, 'id');
277        $subcat_ids[] = $page['category']['id'];
278        $where_sql = 'category_id IN ('.implode(',',$subcat_ids).')';
279        // remove categories from forbidden because just checked above
280        $forbidden = get_sql_condition_FandF(
281              array( 'visible_images' => 'id' ),
282              'AND'
283          );
284      }
285      else
286      {
287        $where_sql = '1=1';
288      }
289    }
290    else
291    {// Normal mode
292      $where_sql = 'category_id = '.$page['category']['id'];
293    }
294
295    // Main query
296    $query = '
297SELECT DISTINCT(image_id)
298  FROM '.IMAGE_CATEGORY_TABLE.'
299    INNER JOIN '.IMAGES_TABLE.' ON id = image_id
300  WHERE
301    '.$where_sql.'
302'.$forbidden.'
303  '.$conf['order_by'].'
304;';
305
306    $page['items'] = array_from_query($query, 'image_id');
307  } //otherwise the calendar will requery all subitems
308}
309// special sections
310else
311{
312// +-----------------------------------------------------------------------+
313// |                            tags section                               |
314// +-----------------------------------------------------------------------+
315  if ($page['section'] == 'tags')
316  {
317    $page['tag_ids'] = array();
318    foreach ($page['tags'] as $tag)
319    {
320      array_push($page['tag_ids'], $tag['id']);
321    }
322
323    $items = get_image_ids_for_tags($page['tag_ids']);
324
325    // permissions depends on category, so to only keep images that are
326    // reachable to the connected user, we need to check category
327    // associations
328    if (!empty($items) )
329    {
330      $query = '
331SELECT DISTINCT image_id
332  FROM '.IMAGE_CATEGORY_TABLE.' INNER JOIN '.IMAGES_TABLE.' ON image_id=id
333  WHERE image_id IN ('.implode(',', $items).')
334    '.$forbidden.
335    $conf['order_by'].'
336;';
337      $items =  array_from_query($query, 'image_id');
338    }
339
340    $page = array_merge(
341      $page,
342      array(
343        'title' => get_tags_content_title(),
344        'items' => $items,
345        )
346      );
347  }
348// +-----------------------------------------------------------------------+
349// |                           search section                              |
350// +-----------------------------------------------------------------------+
351  if ($page['section'] == 'search')
352  {
353    include_once( PHPWG_ROOT_PATH .'include/functions_search.inc.php' );
354
355    $search_result = get_search_results($page['search'], @$page['super_order_by'] );
356    if ( isset($search_result['qs']) )
357    {//save the details of the query search
358      $page['qsearch_details'] = $search_result['qs'];
359    }
360
361    $page = array_merge(
362      $page,
363      array(
364        'items' => $search_result['items'],
365        'title' => '<a href="'.duplicate_index_url(array('start'=>0)).'">'
366                  .l10n('search_result').'</a>',
367        )
368      );
369  }
370// +-----------------------------------------------------------------------+
371// |                           favorite section                            |
372// +-----------------------------------------------------------------------+
373  else if ($page['section'] == 'favorites')
374  {
375    check_user_favorites();
376
377    $page = array_merge(
378      $page,
379      array(
380        'title' => l10n('favorites')
381            )
382    );
383
384    if (!empty($_GET['action']) && ($_GET['action'] == 'remove_all_from_favorites'))
385    {
386      $query = '
387DELETE FROM '.FAVORITES_TABLE.'
388  WHERE user_id = '.$user['id'].'
389;';
390      pwg_query($query);
391      redirect(make_index_url( array('section'=>'favorites') ));
392    }
393    else
394    {
395      $query = '
396SELECT image_id
397  FROM '.FAVORITES_TABLE.'
398    INNER JOIN '.IMAGES_TABLE.' ON image_id = id
399  WHERE user_id = '.$user['id'].'
400'.get_sql_condition_FandF
401  (
402    array
403      (
404        'visible_images' => 'id'
405      ),
406    'AND'
407  ).'
408  '.$conf['order_by'].'
409;';
410      $page = array_merge(
411        $page,
412        array(
413          'items' => array_from_query($query, 'image_id'),
414         )
415      );
416
417      if (count($page['items'])>0)
418      {
419        $template->assign(
420          'favorite',
421          array(
422            'FAVORITE_IMG'  =>
423            get_root_url().get_themeconf('icon_dir').'/del_all_favorites.png',
424            'U_FAVORITE'    => add_url_params(
425              make_index_url( array('section'=>'favorites') ),
426              array('action'=>'remove_all_from_favorites')
427               ),
428             )
429           );
430      }
431    }
432  }
433// +-----------------------------------------------------------------------+
434// |                       recent pictures section                         |
435// +-----------------------------------------------------------------------+
436  else if ($page['section'] == 'recent_pics')
437  {
438    if ( !isset($page['super_order_by']) )
439    {
440      $conf['order_by'] = str_replace(
441        'ORDER BY ',
442        'ORDER BY date_available DESC,',
443        $conf['order_by']
444        );
445    }
446
447    $query = '
448SELECT DISTINCT(id)
449  FROM '.IMAGES_TABLE.'
450    INNER JOIN '.IMAGE_CATEGORY_TABLE.' AS ic ON id = ic.image_id
451  WHERE
452    date_available >= SUBDATE(
453      CURRENT_DATE,INTERVAL '.$user['recent_period'].' DAY)
454    '.$forbidden.'
455  '.$conf['order_by'].'
456;';
457
458    $page = array_merge(
459      $page,
460      array(
461        'title' => '<a href="'.duplicate_index_url(array('start'=>0)).'">'
462                  .l10n('recent_pics_cat').'</a>',
463        'items' => array_from_query($query, 'id'),
464        )
465      );
466  }
467// +-----------------------------------------------------------------------+
468// |                 recently updated categories section                   |
469// +-----------------------------------------------------------------------+
470  else if ($page['section'] == 'recent_cats')
471  {
472    $page = array_merge(
473      $page,
474      array(
475        'title' => l10n('recent_cats_cat'),
476        )
477      );
478  }
479// +-----------------------------------------------------------------------+
480// |                        most visited section                           |
481// +-----------------------------------------------------------------------+
482  else if ($page['section'] == 'most_visited')
483  {
484    $page['super_order_by'] = true;
485    $conf['order_by'] = ' ORDER BY hit DESC, file ASC';
486    $query = '
487SELECT DISTINCT(id)
488  FROM '.IMAGES_TABLE.'
489    INNER JOIN '.IMAGE_CATEGORY_TABLE.' AS ic ON id = ic.image_id
490  WHERE hit > 0
491    '.$forbidden.'
492    '.$conf['order_by'].'
493  LIMIT 0, '.$conf['top_number'].'
494;';
495
496    $page = array_merge(
497      $page,
498      array(
499        'title' => '<a href="'.duplicate_index_url(array('start'=>0)).'">'
500                  .$conf['top_number'].' '.l10n('most_visited_cat').'</a>',
501        'items' => array_from_query($query, 'id'),
502        )
503      );
504  }
505// +-----------------------------------------------------------------------+
506// |                          best rated section                           |
507// +-----------------------------------------------------------------------+
508  else if ($page['section'] == 'best_rated')
509  {
510    $page['super_order_by'] = true;
511    $conf['order_by'] = ' ORDER BY average_rate DESC, id ASC';
512
513    $query ='
514SELECT DISTINCT(id)
515  FROM '.IMAGES_TABLE.'
516    INNER JOIN '.IMAGE_CATEGORY_TABLE.' AS ic ON id = ic.image_id
517  WHERE average_rate IS NOT NULL
518    '.$forbidden.'
519    '.$conf['order_by'].'
520  LIMIT 0, '.$conf['top_number'].'
521;';
522    $page = array_merge(
523      $page,
524      array(
525        'title' => '<a href="'.duplicate_index_url(array('start'=>0)).'">'
526                  .$conf['top_number'].' '.l10n('best_rated_cat').'</a>',
527        'items' => array_from_query($query, 'id'),
528        )
529      );
530  }
531// +-----------------------------------------------------------------------+
532// |                             list section                              |
533// +-----------------------------------------------------------------------+
534  else if ($page['section'] == 'list')
535  {
536    $query ='
537SELECT DISTINCT(id)
538  FROM '.IMAGES_TABLE.'
539    INNER JOIN '.IMAGE_CATEGORY_TABLE.' AS ic ON id = ic.image_id
540  WHERE image_id IN ('.implode(',', $page['list']).')
541    '.$forbidden.'
542  '.$conf['order_by'].'
543;';
544
545    $page = array_merge(
546      $page,
547      array(
548        'title' => '<a href="'.duplicate_index_url(array('start'=>0)).'">'
549                    .l10n('random_cat').'</a>',
550        'items' => array_from_query($query, 'id'),
551        )
552      );
553  }
554}
555
556// +-----------------------------------------------------------------------+
557// |                             chronology                                |
558// +-----------------------------------------------------------------------+
559
560if (isset($page['chronology_field']))
561{
562  include_once( PHPWG_ROOT_PATH.'include/functions_calendar.inc.php' );
563  initialize_calendar();
564}
565
566// add meta robots noindex, nofollow to avoid unnecesary robot crawls
567$page['meta_robots']=array();
568if ( isset($page['chronology_field'])
569      or ( isset($page['flat']) and isset($page['category']) )
570      or 'list'==$page['section'] or 'recent_pics'==$page['section'] )
571{
572  $page['meta_robots']=array('noindex'=>1, 'nofollow'=>1);
573}
574elseif ('tags' == $page['section'])
575{
576  if ( count($page['tag_ids'])>1 )
577  {
578    $page['meta_robots']=array('noindex'=>1, 'nofollow'=>1);
579  }
580}
581elseif ('recent_cats'==$page['section'])
582{
583  $page['meta_robots']['noindex']=1;
584}
585elseif ('search'==$page['section'])
586{
587  $page['meta_robots']['nofollow']=1;
588}
589if ( $filter['enabled'] )
590{
591  $page['meta_robots']['noindex']=1;
592}
593
594// see if we need a redirect because of a permalink
595if ( 'categories'==$page['section'] and isset($page['category']) )
596{
597  $need_redirect=false;
598  if ( empty($page['category']['permalink']) )
599  {
600    if ( $conf['category_url_style'] == 'id-name' and
601        @$page['hit_by']['cat_url_name'] !== str2url($page['category']['name']) )
602    {
603      $need_redirect=true;
604    }
605  }
606  else
607  {
608    if ( $page['category']['permalink'] !== @$page['hit_by']['cat_permalink'] )
609    {
610      $need_redirect=true;
611    }
612  }
613
614  if ($need_redirect)
615  {
616    $redirect_url = ( script_basename()=='picture'
617        ? duplicate_picture_url()
618          : duplicate_index_url()
619      );
620    if (!headers_sent())
621    { // this is a permanent redirection
622      set_status_header(301);
623      redirect_http( $redirect_url );
624    }
625    redirect( $redirect_url );
626  }
627  unset( $need_redirect, $page['hit_by'] );
628}
629
630trigger_action('loc_end_section_init');
631?>
Note: See TracBrowser for help on using the repository browser.