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

Last change on this file since 6641 was 6615, checked in by rvelices, 14 years ago

merge r6414 from branch 2.1
favorite image icon is not taken from php but left to the theme

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