piwigo/include/functions_url.inc.php
plegall 524011bfa6 Bug fixed: as rvelices notified me by email, my header replacement script was
bugged (r2297 was repeating new and old header).

By the way, I've also removed the replacement keywords. We were using them
because it was a common usage with CVS but it is advised not to use them with
Subversion. Personnaly, it is a problem when I search differences between 2
Piwigo installations outside Subversion.


git-svn-id: http://piwigo.org/svn/trunk@2299 68402e56-0260-453c-a942-63ccdbb3a9ee
2008-04-05 14:14:07 +00:00

740 lines
No EOL
17 KiB
PHP

<?php
// +-----------------------------------------------------------------------+
// | Piwigo - a PHP based picture gallery |
// +-----------------------------------------------------------------------+
// | Copyright(C) 2008 Piwigo Team http://piwigo.org |
// | Copyright(C) 2003-2008 PhpWebGallery Team http://phpwebgallery.net |
// | Copyright(C) 2002-2003 Pierrick LE GALL http://le-gall.net/pierrick |
// +-----------------------------------------------------------------------+
// | This program is free software; you can redistribute it and/or modify |
// | it under the terms of the GNU General Public License as published by |
// | the Free Software Foundation |
// | |
// | This program is distributed in the hope that it will be useful, but |
// | WITHOUT ANY WARRANTY; without even the implied warranty of |
// | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU |
// | General Public License for more details. |
// | |
// | You should have received a copy of the GNU General Public License |
// | along with this program; if not, write to the Free Software |
// | Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, |
// | USA. |
// +-----------------------------------------------------------------------+
/**
* returns a prefix for each url link on displayed page
* and return an empty string for current path
* @return string
*/
function get_root_url()
{
global $page;
if ( isset($page['root_path']) )
{
$root_url = $page['root_path'];
}
else
{// TODO - add HERE the possibility to call PWG functions from external scripts
$root_url = PHPWG_ROOT_PATH;
}
if ( dirname($root_url)!='.' )
{
return $root_url;
}
else
{
return (string)substr($root_url, 2);
}
}
/**
* returns the absolute url to the root of PWG
* @param boolean with_scheme if false - does not add http://toto.com
*/
function get_absolute_root_url($with_scheme=true)
{
// TODO - add HERE the possibility to call PWG functions from external scripts
$url = '';
if ($with_scheme)
{
if (empty($_SERVER['HTTPS']))
{
$url .= 'http://';
}
else
{
$url .= 'https://';
}
$url .= $_SERVER['HTTP_HOST'];
if ($_SERVER['SERVER_PORT'] != 80)
{
$url_port = ':'.$_SERVER['SERVER_PORT'];
if (strrchr($url, ':') != $url_port)
{
$url .= $url_port;
}
}
}
$url .= cookie_path();
return $url;
}
/**
* adds one or more _GET style parameters to an url
* example: add_url_params('/x', array('a'=>'b')) returns /x?a=b
* add_url_params('/x?cat_id=10', array('a'=>'b')) returns /x?cat_id=10&amp;a=b
* @param string url
* @param array params
* @return string
*/
function add_url_params($url, $params)
{
if ( !empty($params) )
{
assert( is_array($params) );
$is_first = true;
foreach($params as $param=>$val)
{
if ($is_first)
{
$is_first = false;
$url .= ( strstr($url, '?')===false ) ? '?' :'&amp;';
}
else
{
$url .= '&amp;';
}
$url .= $param;
if (isset($val))
{
$url .= '='.$val;
}
}
}
return $url;
}
/**
* build an index URL for a specific section
*
* @param array
* @return string
*/
function make_index_url($params = array())
{
global $conf;
$url = get_root_url().'index';
if ($conf['php_extension_in_urls'])
{
$url .= '.php';
}
if ($conf['question_mark_in_urls'])
{
$url .= '?';
}
$url.= make_section_in_url($params);
$url = add_well_known_params_in_url($url, $params);
return $url;
}
/**
* build an index URL with current page parameters, but with redefinitions
* and removes.
*
* duplicate_index_url( array(
* 'category' => array('id'=>12, 'name'=>'toto'),
* array('start')
* ) will create an index URL on the current section (categories), but on
* a redefined category and without the start URL parameter.
*
* @param array redefined keys
* @param array removed keys
* @return string
*/
function duplicate_index_url($redefined = array(), $removed = array())
{
return make_index_url(
params_for_duplication($redefined, $removed)
);
}
/**
* returns $page global array with key redefined and key removed
*
* @param array redefined keys
* @param array removed keys
* @return array
*/
function params_for_duplication($redefined, $removed)
{
global $page;
if (count($removed) > 0)
{
$params = array();
foreach ($page as $page_item_key => $page_item_value)
{
if (!in_array($page_item_key, $removed))
{
$params[$page_item_key] = $page_item_value;
}
}
}
else
{
$params = $page;
}
foreach ($redefined as $redefined_param => $redefined_value)
{
$params[$redefined_param] = $redefined_value;
}
return $params;
}
/**
* create a picture URL with current page parameters, but with redefinitions
* and removes. See duplicate_index_url.
*
* @param array redefined keys
* @param array removed keys
* @return string
*/
function duplicate_picture_url($redefined = array(), $removed = array())
{
return make_picture_url(
params_for_duplication($redefined, $removed)
);
}
/**
* create a picture URL on a specific section for a specific picture
*
* @param array
* @return string
*/
function make_picture_url($params)
{
global $conf;
if (!isset($params['image_id']))
{
die('make_picture_url: image_id is a required parameter');
}
$url = get_root_url().'picture';
if ($conf['php_extension_in_urls'])
{
$url .= '.php';
}
if ($conf['question_mark_in_urls'])
{
$url .= '?';
}
$url.= '/';
switch ( $conf['picture_url_style'] )
{
case 'id-file':
$url .= $params['image_id'];
if ( isset($params['image_file']) )
{
$url .= '-'.get_filename_wo_extension($params['image_file']);
}
break;
case 'file':
if ( isset($params['image_file']) )
{
$fname_wo_ext = get_filename_wo_extension($params['image_file']);
if (! preg_match('/^\d+(-|$)/', $fname_wo_ext) )
{
$url .= $fname_wo_ext;
break;
}
}
default:
$url .= $params['image_id'];
}
if ( !isset($params['category'] ) )
{// make urls shorter ...
unset( $params['flat'] );
}
$url .= make_section_in_url($params);
$url = add_well_known_params_in_url($url, $params);
return $url;
}
/**
*adds to the url the chronology and start parameters
*/
function add_well_known_params_in_url($url, $params)
{
if ( isset($params['chronology_field']) )
{
$url .= '/'. $params['chronology_field'];
$url .= '-'. $params['chronology_style'];
if ( isset($params['chronology_view']) )
{
$url .= '-'. $params['chronology_view'];
}
if ( !empty($params['chronology_date']) )
{
$url .= '-'. implode('-', $params['chronology_date'] );
}
}
if (isset($params['flat']))
{
$url.= '/flat';
}
if (isset($params['start']) and $params['start'] > 0)
{
$url.= '/start-'.$params['start'];
}
return $url;
}
/**
* return the section token of an index or picture URL.
*
* Depending on section, other parameters are required (see function code
* for details)
*
* @param array
* @return string
*/
function make_section_in_url($params)
{
global $conf;
$section_string = '';
$section_of = array(
'category' => 'categories',
'tags' => 'tags',
'list' => 'list',
'search' => 'search',
);
foreach ($section_of as $param => $section)
{
if (isset($params[$param]))
{
$params['section'] = $section;
}
}
if (!isset($params['section']))
{
$params['section'] = 'none';
}
switch($params['section'])
{
case 'categories' :
{
if (!isset($params['category']))
{
$section_string.= '/categories';
}
else
{
is_array($params['category']) or trigger_error(
'make_section_in_url wrong type for category', E_USER_WARNING
);
is_numeric($params['category']['id']) or trigger_error(
'make_section_in_url category id not numeric', E_USER_WARNING
);
isset($params['category']['name']) or trigger_error(
'make_section_in_url category name not set', E_USER_WARNING
);
array_key_exists('permalink', $params['category']) or trigger_error(
'make_section_in_url category permalink not set', E_USER_WARNING
);
$section_string.= '/category/';
if ( empty($params['category']['permalink']) )
{
$section_string.= $params['category']['id'];
if ( $conf['category_url_style']=='id-name' )
{
$section_string.= '-'.str2url($params['category']['name']);
}
}
else
{
$section_string.= $params['category']['permalink'];
}
}
break;
}
case 'tags' :
{
if (!isset($params['tags']) or count($params['tags']) == 0)
{
die('make_section_in_url: require at least one tag');
}
$section_string.= '/tags';
foreach ($params['tags'] as $tag)
{
switch ( $conf['tag_url_style'] )
{
case 'id':
$section_string.= '/'.$tag['id'];
break;
case 'tag':
if (isset($tag['url_name']) and !is_numeric($tag['url_name']) )
{
$section_string.= '/'.$tag['url_name'];
break;
}
default:
$section_string.= '/'.$tag['id'];
if (isset($tag['url_name']))
{
$section_string.= '-'.$tag['url_name'];
}
}
}
break;
}
case 'search' :
{
if (!isset($params['search']))
{
die('make_section_in_url: require a search identifier');
}
$section_string.= '/search/'.$params['search'];
break;
}
case 'list' :
{
if (!isset($params['list']))
{
die('make_section_in_url: require a list of items');
}
$section_string.= '/list/'.implode(',', $params['list']);
break;
}
case 'none' :
{
break;
}
default :
{
$section_string.= '/'.$params['section'];
}
}
return $section_string;
}
/**
* the reverse of make_section_in_url
* returns the 'section' (categories/tags/...) and the data associated with it
*
* Depending on section, other parameters are returned (category/tags/list/...)
*
* @param array of url tokens to parse
* @param int the index in the array of url tokens; in/out
* @return array
*/
function parse_section_url( $tokens, &$next_token)
{
$page=array();
if (0 === strpos(@$tokens[$next_token], 'categor'))
{
$page['section'] = 'categories';
$next_token++;
if (isset($tokens[$next_token]) )
{
if (preg_match('/^(\d+)(?:-(.+))?$/', $tokens[$next_token], $matches))
{
if ( isset($matches[2]) )
$page['hit_by']['cat_url_name'] = $matches[2];
$page['category'] = $matches[1];
$next_token++;
}
else
{// try a permalink
$maybe_permalinks = array();
$current_token = $next_token;
while ( isset($tokens[$current_token])
and strpos($tokens[$current_token], 'created-')!==0
and strpos($tokens[$current_token], 'posted-')!==0
and strpos($tokens[$next_token], 'start-')!==0
and $tokens[$current_token] != 'flat')
{
if (empty($maybe_permalinks))
{
array_push($maybe_permalinks, $tokens[$current_token]);
}
else
{
array_push($maybe_permalinks,
$maybe_permalinks[count($maybe_permalinks)-1]
. '/' . $tokens[$current_token]
);
}
$current_token++;
}
if ( count($maybe_permalinks) )
{
$cat_id = get_cat_id_from_permalinks($maybe_permalinks, $perma_index);
if ( isset($cat_id) )
{
$next_token += $perma_index+1;
$page['category'] = $cat_id;
$page['hit_by']['cat_permalink'] = $maybe_permalinks[$perma_index];
}
else
{
page_not_found('Permalink for album not found');
}
}
}
}
if (isset($page['category']))
{
$result = get_cat_info($page['category']);
if (empty($result))
{
page_not_found('Requested category does not exist' );
}
$page['category']=$result;
}
}
else if (0 === strpos(@$tokens[$next_token], 'tag'))
{
$page['section'] = 'tags';
$page['tags'] = array();
$next_token++;
$i = $next_token;
$requested_tag_ids = array();
$requested_tag_url_names = array();
while (isset($tokens[$i]))
{
if ( preg_match('/^(created-|posted-|start-(\d)+)/', $tokens[$i]) )
break;
if ( preg_match('/^(\d+)(?:-(.*))?/', $tokens[$i], $matches) )
{
array_push($requested_tag_ids, $matches[1]);
}
else
{
array_push($requested_tag_url_names, $tokens[$i]);
}
$i++;
}
$next_token = $i;
if ( empty($requested_tag_ids) && empty($requested_tag_url_names) )
{
bad_request('at least one tag required');
}
$page['tags'] = find_tags($requested_tag_ids, $requested_tag_url_names);
if ( empty($page['tags']) )
{
page_not_found('Requested tag does not exist', get_root_url().'tags.php' );
}
}
else if (0 === strpos(@$tokens[$next_token], 'fav'))
{
$page['section'] = 'favorites';
$next_token++;
}
else if ('most_visited' == @$tokens[$next_token])
{
$page['section'] = 'most_visited';
$next_token++;
}
else if ('best_rated' == @$tokens[$next_token])
{
$page['section'] = 'best_rated';
$next_token++;
}
else if ('recent_pics' == @$tokens[$next_token])
{
$page['section'] = 'recent_pics';
$next_token++;
}
else if ('recent_cats' == @$tokens[$next_token])
{
$page['section'] = 'recent_cats';
$next_token++;
}
else if ('search' == @$tokens[$next_token])
{
$page['section'] = 'search';
$next_token++;
preg_match('/(\d+)/', @$tokens[$next_token], $matches);
if (!isset($matches[1]))
{
bad_request('search identifier is missing');
}
$page['search'] = $matches[1];
$next_token++;
}
else if ('list' == @$tokens[$next_token])
{
$page['section'] = 'list';
$next_token++;
$page['list'] = array();
// No pictures
if (empty($tokens[$next_token]))
{
// Add dummy element list
array_push($page['list'], -1);
}
// With pictures list
else
{
if (!preg_match('/^\d+(,\d+)*$/', $tokens[$next_token]))
{
bad_request('wrong format on list GET parameter');
}
foreach (explode(',', $tokens[$next_token]) as $image_id)
{
array_push($page['list'], $image_id);
}
}
$next_token++;
}
return $page;
}
/**
* the reverse of add_well_known_params_in_url
* parses start, flat and chronology from url tokens
*/
function parse_well_known_params_url($tokens, &$i)
{
$page = array();
while (isset($tokens[$i]))
{
if (preg_match('/^start-(\d+)/', $tokens[$i], $matches))
{
$page['start'] = $matches[1];
}
if ( 'flat' == $tokens[$i] )
{
// indicate a special list of images
$page['flat'] = true;
}
if (preg_match('/^(posted|created)/', $tokens[$i] ))
{
$chronology_tokens = explode('-', $tokens[$i] );
$page['chronology_field'] = $chronology_tokens[0];
array_shift($chronology_tokens);
$page['chronology_style'] = $chronology_tokens[0];
array_shift($chronology_tokens);
if ( count($chronology_tokens)>0 )
{
if ('list'==$chronology_tokens[0] or
'calendar'==$chronology_tokens[0])
{
$page['chronology_view'] = $chronology_tokens[0];
array_shift($chronology_tokens);
}
$page['chronology_date'] = $chronology_tokens;
}
}
$i++;
}
return $page;
}
/**
* Indicate to build url with full path
*
* @param null
* @return null
*/
function set_make_full_url()
{
global $page;
if (!isset($page['save_root_path']))
{
if (isset($page['root_path']))
{
$page['save_root_path']['path'] = $page['root_path'];
}
$page['save_root_path']['count'] = 1;
$page['root_path'] = get_absolute_root_url();
}
else
{
$page['save_root_path']['count'] += 1;
}
}
/**
* Restore old parameter to build url with full path
*
* @param null
* @return null
*/
function unset_make_full_url()
{
global $page;
if (isset($page['save_root_path']))
{
if ($page['save_root_path']['count'] == 1)
{
if (isset($page['save_root_path']['path']))
{
$page['root_path'] = $page['save_root_path']['path'];
}
else
{
unset($page['root_path']);
}
unset($page['save_root_path']);
}
else
{
$page['save_root_path']['count'] -= 1;
}
}
}
/**
* Embellish the url argument
*
* @param $url
* @return $url embellished
*/
function embellish_url($url)
{
return str_replace('/./', '/', $url);
}
?>