2005-08-21 06:49:02 +00:00
< ? php
/* SVN FILE: $Id$ */
2005-06-30 02:09:47 +00:00
/**
2005-10-18 22:27:39 +00:00
* Parses the request URL into controller , action , and parameters .
2005-12-27 03:33:44 +00:00
*
2005-08-21 06:49:02 +00:00
* Long description for file
*
* PHP versions 4 and 5
*
2007-02-02 10:39:45 +00:00
* CakePHP ( tm ) : Rapid Development Framework < http :// www . cakephp . org />
* Copyright 2005 - 2007 , Cake Software Foundation , Inc .
2006-05-26 05:29:17 +00:00
* 1785 E . Sahara Avenue , Suite 490 - 204
* Las Vegas , Nevada 89104
2005-08-21 06:49:02 +00:00
*
2005-12-23 21:57:26 +00:00
* Licensed under The MIT License
* Redistributions of files must retain the above copyright notice .
2005-08-21 06:49:02 +00:00
*
2005-12-27 03:33:44 +00:00
* @ filesource
2007-02-02 10:39:45 +00:00
* @ copyright Copyright 2005 - 2007 , Cake Software Foundation , Inc .
* @ link http :// www . cakefoundation . org / projects / info / cakephp CakePHP ( tm ) Project
2006-05-26 05:29:17 +00:00
* @ package cake
* @ subpackage cake . cake . libs
2007-02-02 10:39:45 +00:00
* @ since CakePHP ( tm ) v 0.2 . 9
2006-05-26 05:29:17 +00:00
* @ version $Revision $
* @ modifiedby $LastChangedBy $
* @ lastmodified $Date $
* @ license http :// www . opensource . org / licenses / mit - license . php The MIT License
2005-08-21 06:49:02 +00:00
*/
/**
2006-02-18 23:42:21 +00:00
* Included libraries .
*
*/
2006-11-22 16:33:50 +00:00
if ( ! class_exists ( 'Object' )) {
2007-02-26 02:11:30 +00:00
uses ( 'object' );
2006-11-22 16:33:50 +00:00
}
2005-06-30 02:09:47 +00:00
/**
2006-02-18 23:42:21 +00:00
* Parses the request URL into controller , action , and parameters .
*
2006-05-26 05:29:17 +00:00
* @ package cake
* @ subpackage cake . cake . libs
2006-02-18 23:42:21 +00:00
*/
2007-02-26 02:11:30 +00:00
class Router extends Object {
2006-09-16 02:10:02 +00:00
2005-06-30 02:09:47 +00:00
/**
2006-02-18 23:42:21 +00:00
* Array of routes
*
* @ var array
2007-05-26 06:26:06 +00:00
* @ access public
2006-02-18 23:42:21 +00:00
*/
2006-09-06 03:41:38 +00:00
var $routes = array ();
2006-04-29 21:51:30 +00:00
/**
* CAKE_ADMIN route
*
* @ var array
2007-05-26 06:26:06 +00:00
* @ access private
2006-04-29 21:51:30 +00:00
*/
2006-09-06 03:41:38 +00:00
var $__admin = null ;
2006-08-12 16:46:42 +00:00
/**
* Directive for Router to parse out file extensions for mapping to Content - types .
*
* @ var boolean
2007-05-26 06:26:06 +00:00
* @ access private
2006-08-12 16:46:42 +00:00
*/
2006-09-06 03:41:38 +00:00
var $__parseExtensions = false ;
2007-02-03 02:32:42 +00:00
/**
2007-02-03 23:10:03 +00:00
* List of valid extensions to parse from a URL . If null , any extension is allowed .
2007-02-03 02:32:42 +00:00
*
2007-02-03 23:10:03 +00:00
* @ var array
2007-05-26 06:26:06 +00:00
* @ access private
2007-02-03 02:32:42 +00:00
*/
2007-02-03 23:10:03 +00:00
var $__validExtensions = null ;
2006-05-26 05:29:17 +00:00
/**
2006-09-06 03:41:38 +00:00
* 'Constant' regular expression definitions for named route elements
2006-05-26 05:29:17 +00:00
*
2006-09-06 03:41:38 +00:00
* @ var array
2007-05-26 06:26:06 +00:00
* @ access private
2006-05-26 05:29:17 +00:00
*/
2006-09-06 03:41:38 +00:00
var $__named = array (
2006-09-10 17:25:44 +00:00
'Action' => 'index|show|list|add|create|edit|update|remove|del|delete|new|view|item' ,
'Year' => '[12][0-9]{3}' ,
2007-04-12 07:17:39 +00:00
'Month' => '0[1-9]|1[012]' ,
'Day' => '0[1-9]|[12][0-9]|3[01]' ,
2006-09-10 17:25:44 +00:00
'ID' => '[0-9]+'
2006-09-06 03:41:38 +00:00
);
2006-09-22 16:39:15 +00:00
/**
* The route matching the URL of the current request
*
* @ var array
2007-05-26 06:26:06 +00:00
* @ access private
2006-09-22 16:39:15 +00:00
*/
var $__currentRoute = array ();
2007-07-24 13:50:50 +00:00
/**
* HTTP header shortcut map . Used for evaluating header - based route expressions .
*
* @ var array
* @ access private
*/
var $__headerMap = array (
'type' => 'content_type' ,
'method' => 'request_method' ,
'server' => 'server_name'
);
/**
* Default HTTP request method => controller action map .
*
* @ var array
* @ access private
*/
var $__resourceMap = array (
'index' => array ( 'method' => 'GET' , 'id' => false ),
'view' => array ( 'method' => 'GET' , 'id' => true ),
'add' => array ( 'method' => 'POST' , 'id' => false ),
'edit' => array ( 'method' => 'PUT' , 'id' => true ),
'delete' => array ( 'method' => 'DELETE' , 'id' => true )
);
2006-09-28 20:29:52 +00:00
/**
* Maintains the parameter stack for the current request
*
* @ var array
2007-05-26 06:26:06 +00:00
* @ access private
2006-09-28 20:29:52 +00:00
*/
var $__params = array ();
/**
* Maintains the path stack for the current request
*
* @ var array
2007-05-26 06:26:06 +00:00
* @ access private
2006-09-28 20:29:52 +00:00
*/
var $__paths = array ();
2007-03-12 01:52:40 +00:00
/**
* Maintains the mapped elements for array based urls
*
* @ var array
2007-05-26 06:26:06 +00:00
* @ access private
2007-03-12 01:52:40 +00:00
*/
var $__mapped = array ();
2006-09-28 20:29:52 +00:00
/**
2007-02-26 02:11:30 +00:00
* Initialize the Router object
*
*/
2006-05-26 05:29:17 +00:00
function __construct () {
if ( defined ( 'CAKE_ADMIN' )) {
$admin = CAKE_ADMIN ;
if ( ! empty ( $admin )) {
2006-12-06 20:38:28 +00:00
$this -> __admin = array (
'/:' . $admin . '/:controller/:action/*' ,
'/^(?:\/(?:(' . $admin . ')(?:\\/([a-zA-Z0-9_\\-\\.\\;\\:]+)(?:\\/([a-zA-Z0-9_\\-\\.\\;\\:]+)(?:[\\/\\?](.*))?)?)?))[\/]*$/' ,
array ( $admin , 'controller' , 'action' ), array ()
);
2006-05-26 05:29:17 +00:00
}
}
}
2006-08-12 13:02:51 +00:00
/**
* Gets a reference to the Router object instance
*
2007-05-26 06:26:06 +00:00
* @ return object Object instance
* @ access public
* @ static
2006-08-12 13:02:51 +00:00
*/
function & getInstance () {
static $instance = array ();
if ( ! isset ( $instance [ 0 ]) || ! $instance [ 0 ]) {
$instance [ 0 ] =& new Router ();
}
return $instance [ 0 ];
}
2006-09-06 03:41:38 +00:00
/**
* Gets the named route elements for use in app / config / routes . php
*
2007-05-26 06:26:06 +00:00
* @ return array Named route elements
* @ access public
* @ static
2006-09-06 03:41:38 +00:00
*/
2006-09-10 17:25:44 +00:00
function getNamedExpressions () {
2006-09-06 03:41:38 +00:00
$_this =& Router :: getInstance ();
return $_this -> __named ;
}
2005-06-30 02:09:47 +00:00
/**
2007-02-26 02:11:30 +00:00
* Returns this object ' s routes array . Returns false if there are no routes available .
2006-02-18 23:42:21 +00:00
*
2006-09-06 03:41:38 +00:00
* @ param string $route An empty string , or a route string " / "
* @ param array $default NULL or an array describing the default route
2006-09-10 17:25:44 +00:00
* @ param array $params An array matching the named elements in the route to regular expressions which that element should match .
2006-02-18 23:42:21 +00:00
* @ see routes
2006-05-26 05:29:17 +00:00
* @ return array Array of routes
2007-05-26 06:26:06 +00:00
* @ access public
* @ static
2006-02-18 23:42:21 +00:00
*/
2006-09-22 16:39:15 +00:00
function connect ( $route , $default = array (), $params = array ()) {
2006-08-12 16:46:42 +00:00
$_this =& Router :: getInstance ();
2006-05-26 05:29:17 +00:00
2007-07-24 13:50:50 +00:00
if ( defined ( 'CAKE_ADMIN' ) && $default == null && $route == CAKE_ADMIN ) {
$_this -> routes [] = $_this -> __admin ;
$_this -> __admin = null ;
2006-05-26 05:29:17 +00:00
}
2007-07-24 13:50:50 +00:00
$default = am ( array ( 'plugin' => null , 'controller' => null ), $default );
2006-08-12 13:02:51 +00:00
2007-02-02 23:55:47 +00:00
if ( ! empty ( $default ) && empty ( $default [ 'action' ])) {
$default [ 'action' ] = 'index' ;
2006-09-28 20:29:52 +00:00
}
2007-02-26 02:11:30 +00:00
if ( $route = $_this -> writeRoute ( $route , $default , $params )) {
$_this -> routes [] = $route ;
}
return $_this -> routes ;
}
2007-07-24 13:50:50 +00:00
/**
* Creates REST resource routes for the given controller ( s )
*
* @ param mixed $controller A controller name or array of controller names ( i . e . " Posts " or " ListItems " )
2007-07-27 02:46:30 +00:00
* @ param array $options
2007-07-24 13:50:50 +00:00
* @ access public
* @ static
*/
function mapResources ( $controller , $options = array ()) {
$_this =& Router :: getInstance ();
$options = am (
array ( 'prefix' => '/' ),
$options
);
$prefix = $options [ 'prefix' ];
foreach (( array ) $controller as $ctlName ) {
$urlName = Inflector :: underscore ( $ctlName );
foreach ( $_this -> __resourceMap as $action => $params ) {
$id = null ;
if ( $params [ 'id' ]) {
$id = '/:id' ;
}
Router :: connect (
" { $prefix } { $urlName } { $id } " ,
array ( 'controller' => $urlName , 'action' => $action , '[method]' => $params [ 'method' ])
);
}
}
}
2007-02-26 02:11:30 +00:00
/**
2007-03-04 09:12:09 +00:00
* Builds a route regular expression
2007-02-26 02:11:30 +00:00
*
* @ param string $route An empty string , or a route string " / "
* @ param array $default NULL or an array describing the default route
* @ param array $params An array matching the named elements in the route to regular expressions which that element should match .
* @ return string
* @ see routes
2007-05-26 06:26:06 +00:00
* @ access public
* @ static
2007-02-26 02:11:30 +00:00
*/
function writeRoute ( $route , $default , $params ) {
if ( empty ( $route ) || ( $route == '/' )) {
return array ( $route , '/^[\/]*$/' , array (), $default , array ());
2006-05-26 05:29:17 +00:00
} else {
2007-02-26 02:11:30 +00:00
$names = array ();
2007-04-17 07:00:26 +00:00
$elements = Set :: filter ( array_map ( 'trim' , explode ( '/' , $route )));
2006-05-26 05:29:17 +00:00
if ( ! count ( $elements )) {
return false ;
}
2007-06-20 06:15:35 +00:00
foreach ( $elements as $element ) {
2006-09-22 16:39:15 +00:00
$q = null ;
2006-05-26 05:29:17 +00:00
if ( preg_match ( '/^:(.+)$/' , $element , $r )) {
2006-09-10 17:25:44 +00:00
if ( isset ( $params [ $r [ 1 ]])) {
2006-12-06 20:38:28 +00:00
if ( array_key_exists ( $r [ 1 ], $default )) {
2006-09-22 16:39:15 +00:00
$q = '?' ;
2006-09-10 17:25:44 +00:00
}
$parsed [] = '(?:\/(' . $params [ $r [ 1 ]] . '))' . $q ;
2006-09-06 03:41:38 +00:00
} else {
$parsed [] = '(?:\/([^\/]+))?' ;
}
2006-08-12 13:02:51 +00:00
$names [] = $r [ 1 ];
2007-06-20 06:15:35 +00:00
} elseif ( preg_match ( '/^\*$/' , $element , $r )) {
2006-05-26 05:29:17 +00:00
$parsed [] = '(?:\/(.*))?' ;
} else {
$parsed [] = '/' . $element ;
}
}
2007-02-26 02:11:30 +00:00
return array ( $route , '#^' . join ( '' , $parsed ) . '[\/]*$#' , $names , $default , $params );
2006-05-26 05:29:17 +00:00
}
}
2005-06-30 02:09:47 +00:00
/**
2006-02-18 23:42:21 +00:00
* Parses given URL and returns an array of controllers , action and parameters
* taken from that URL .
*
* @ param string $url URL to be parsed
2007-05-26 06:26:06 +00:00
* @ return array Parsed elements from URL
* @ access public
* @ static
2006-02-18 23:42:21 +00:00
*/
2006-05-26 05:29:17 +00:00
function parse ( $url ) {
2006-08-12 16:46:42 +00:00
$_this =& Router :: getInstance ();
2007-02-26 02:11:30 +00:00
$_this -> __connectDefaultRoutes ();
2007-07-24 13:50:50 +00:00
$out = array ( 'pass' => array ());
2007-02-26 02:11:30 +00:00
$r = $ext = null ;
2006-05-26 05:29:17 +00:00
2007-03-28 16:42:11 +00:00
if ( $url && strpos ( $url , '/' ) !== 0 ) {
2007-02-26 02:11:30 +00:00
$url = '/' . $url ;
2006-05-26 05:29:17 +00:00
}
if ( strpos ( $url , '?' ) !== false ) {
$url = substr ( $url , 0 , strpos ( $url , '?' ));
}
2007-02-26 02:11:30 +00:00
extract ( $_this -> __parseExtension ( $url ));
2006-05-26 05:29:17 +00:00
2007-06-20 06:15:35 +00:00
foreach ( $_this -> routes as $route ) {
2007-07-24 13:50:50 +00:00
if (( $r = $_this -> matchRoute ( $route , $url )) !== false ) {
2006-09-22 16:39:15 +00:00
$_this -> __currentRoute [] = $route ;
2007-07-24 13:50:50 +00:00
list ( $route , $regexp , $names , $defaults ) = $route ;
2006-09-22 16:39:15 +00:00
2006-05-26 05:29:17 +00:00
// remove the first element, which is the url
2007-07-24 13:50:50 +00:00
array_shift ( $r );
2006-05-26 05:29:17 +00:00
// hack, pre-fill the default route names
2007-06-20 06:15:35 +00:00
foreach ( $names as $name ) {
2006-05-26 05:29:17 +00:00
$out [ $name ] = null ;
}
if ( is_array ( $defaults )) {
2007-06-20 06:15:35 +00:00
foreach ( $defaults as $name => $value ) {
2006-05-26 05:29:17 +00:00
if ( preg_match ( '#[a-zA-Z_\-]#i' , $name )) {
2007-07-27 17:51:33 +00:00
$out [ $name ] = $value ;
2006-05-26 05:29:17 +00:00
} else {
2007-07-27 17:51:33 +00:00
$out [ 'pass' ][] = $value ;
2006-05-26 05:29:17 +00:00
}
}
}
2007-06-20 06:15:35 +00:00
foreach ( Set :: filter ( $r , true ) as $key => $found ) {
2006-05-26 05:29:17 +00:00
// if $found is a named url element (i.e. ':action')
2007-02-26 02:11:30 +00:00
if ( isset ( $names [ $key ])) {
2007-07-27 17:51:33 +00:00
$out [ $names [ $key ]] = $_this -> stripEscape ( $found );
2007-06-20 06:15:35 +00:00
} elseif ( isset ( $names [ $key ]) && empty ( $names [ $key ]) && empty ( $out [ $names [ $key ]])) {
2006-12-26 18:06:42 +00:00
break ; //leave the default values;
2006-05-26 05:29:17 +00:00
} else {
// unnamed elements go in as 'pass'
2007-07-27 13:32:26 +00:00
$out [ 'pass' ] = am ( $out [ 'pass' ], array_map (
array ( & $_this , 'stripEscape' ),
Set :: filter ( explode ( '/' , $found ), true )
));
2006-05-26 05:29:17 +00:00
}
}
break ;
}
}
2006-08-12 16:46:42 +00:00
if ( ! empty ( $ext )) {
2006-08-22 12:08:44 +00:00
$out [ 'url' ][ 'ext' ] = $ext ;
2006-08-12 16:46:42 +00:00
}
2006-05-26 05:29:17 +00:00
return $out ;
}
2007-07-24 13:50:50 +00:00
/**
* Checks to see if the given URL matches the given route
*
* @ param array $route
* @ param string $url
* @ return mixed Boolean false on failure , otherwise array
* @ access public
*/
function matchRoute ( $route , $url ) {
$_this =& Router :: getInstance ();
list ( $route , $regexp , $names , $defaults ) = $route ;
if ( ! preg_match ( $regexp , $url , $r )) {
return false ;
} else {
foreach ( $defaults as $key => $val ) {
if ( preg_match ( '/^\[(\w+)\]$/' , $key , $header )) {
if ( isset ( $_this -> __headerMap [ $header [ 1 ]])) {
$header = $_this -> __headerMap [ $header [ 1 ]];
} else {
$header = 'http_' . $header [ 1 ];
}
if ( env ( strtoupper ( $header )) != $val ) {
return false ;
}
}
}
}
return $r ;
}
2007-02-26 02:11:30 +00:00
/**
* Parses a file extension out of a URL , if Router :: parseExtensions () is enabled .
*
* @ param string $url
* @ return array Returns an array containing the altered URL and the parsed extension .
2007-05-26 06:26:06 +00:00
* @ access private
2007-02-26 02:11:30 +00:00
*/
function __parseExtension ( $url ) {
$ext = null ;
$_this =& Router :: getInstance ();
if ( $_this -> __parseExtensions ) {
2007-06-20 06:15:35 +00:00
if ( preg_match ( '/\.[0-9a-zA-Z]*$/' , $url , $match ) == 1 ) {
2007-02-26 02:11:30 +00:00
$match = substr ( $match [ 0 ], 1 );
2007-06-20 06:15:35 +00:00
if ( empty ( $_this -> __validExtensions )) {
2007-02-26 02:11:30 +00:00
$url = substr ( $url , 0 , strpos ( $url , '.' . $match ));
$ext = $match ;
} else {
2007-06-20 06:15:35 +00:00
foreach ( $_this -> __validExtensions as $name ) {
if ( strcasecmp ( $name , $match ) === 0 ) {
2007-02-26 02:11:30 +00:00
$url = substr ( $url , 0 , strpos ( $url , '.' . $name ));
$ext = $match ;
}
}
}
}
}
return compact ( 'ext' , 'url' );
}
/**
* Connects the default , built - in routes , including admin routes , and ( deprecated ) web services
* routes .
*
2007-05-26 06:26:06 +00:00
* @ access private
2007-02-26 02:11:30 +00:00
*/
function __connectDefaultRoutes () {
$_this =& Router :: getInstance ();
$default_route = array (
'/:controller/:action/*' ,
'/^(?:\/(?:([a-zA-Z0-9_\\-\\.\\;\\:]+)(?:\\/([a-zA-Z0-9_\\-\\.\\;\\:]+)(?:[\\/\\?](.*))?)?))[\\/]*$/' ,
array ( 'controller' , 'action' ), array ()
);
if ( defined ( 'CAKE_ADMIN' ) && $_this -> __admin != null ) {
$_this -> routes [] = $_this -> __admin ;
$_this -> __admin = null ;
}
2007-03-06 23:48:25 +00:00
$_this -> connect ( '/bare/:controller/:action/*' , array ( 'bare' => '1' ));
$_this -> connect ( '/ajax/:controller/:action/*' , array ( 'bare' => '1' ));
2007-02-26 02:11:30 +00:00
if ( defined ( 'WEBSERVICES' ) && WEBSERVICES == 'on' ) {
trigger_error ( 'Deprecated: webservices routes are deprecated and will not be supported in future versions. Use Router::parseExtensions() instead.' , E_USER_WARNING );
$_this -> connect ( '/rest/:controller/:action/*' , array ( 'webservices' => 'Rest' ));
$_this -> connect ( '/rss/:controller/:action/*' , array ( 'webservices' => 'Rss' ));
$_this -> connect ( '/soap/:controller/:action/*' , array ( 'webservices' => 'Soap' ));
$_this -> connect ( '/xml/:controller/:action/*' , array ( 'webservices' => 'Xml' ));
$_this -> connect ( '/xmlrpc/:controller/:action/*' , array ( 'webservices' => 'XmlRpc' ));
}
$_this -> routes [] = $default_route ;
2007-08-07 23:19:42 +00:00
$Inflector =& Inflector :: getInstance ();
$plugins = array_map ( array ( & $Inflector , 'underscore' ), Configure :: listObjects ( 'plugin' ));
if ( ! empty ( $plugins )) {
array_unshift ( $_this -> routes , array (
" /:plugin/:controller/:action/* " ,
'/^(?:\/(?:(' . implode ( '|' , $plugins ) . ')(?:\\/([a-zA-Z0-9_\\-\\.\\;\\:]+)(?:\\/([a-zA-Z0-9_\\-\\.\\;\\:]+)(?:[\\/\\?](.*))?)?)?))[\/]*$/' ,
array ( 'plugin' , 'controller' , 'action' ), array ()
));
}
2007-02-26 02:11:30 +00:00
}
2006-09-22 16:39:15 +00:00
/**
* Takes parameter and path information back from the Dispatcher
*
2007-05-26 06:26:06 +00:00
* @ param array $params Parameters and path information
* @ access public
* @ static
2006-09-22 16:39:15 +00:00
*/
2007-02-23 00:14:51 +00:00
function setRequestInfo ( $params ) {
2006-09-22 16:39:15 +00:00
$_this =& Router :: getInstance ();
2006-12-15 16:10:57 +00:00
$defaults = array ( 'plugin' => null , 'controller' => null , 'action' => null );
$params [ 0 ] = am ( $defaults , $params [ 0 ]);
$params [ 1 ] = am ( $defaults , $params [ 1 ]);
2006-09-22 16:39:15 +00:00
list ( $_this -> __params [], $_this -> __paths []) = $params ;
}
2006-10-20 17:24:37 +00:00
/**
* Gets parameter information
*
2007-05-26 06:26:06 +00:00
* @ param boolean $current Get current parameter ( true )
* @ return array Parameter information
* @ access public
* @ static
2006-10-20 17:24:37 +00:00
*/
function getParams ( $current = false ) {
$_this =& Router :: getInstance ();
2006-12-31 08:27:02 +00:00
if ( $current ) {
return $_this -> __params [ count ( $_this -> __params ) - 1 ];
}
return $_this -> __params [ 0 ];
}
/**
* Gets URL parameter by name
*
2007-05-26 06:26:06 +00:00
* @ param string $name Parameter name
* @ param boolean $current Current parameter
* @ return string Parameter value
* @ access public
* @ static
2006-12-31 08:27:02 +00:00
*/
2007-02-23 00:14:51 +00:00
function getParam ( $name = 'controller' , $current = false ) {
2006-12-31 08:27:02 +00:00
$_this =& Router :: getInstance ();
2007-02-23 00:14:51 +00:00
$params = Router :: getParams ( $current );
2007-01-20 20:50:57 +00:00
if ( isset ( $params [ $name ])) {
return $params [ $name ];
2006-10-20 17:24:37 +00:00
}
2007-01-20 20:50:57 +00:00
return null ;
2006-10-20 17:24:37 +00:00
}
/**
* Gets path information
*
2007-05-26 06:26:06 +00:00
* @ param boolean $current Current parameter
2006-10-20 17:24:37 +00:00
* @ return array
2007-05-26 06:26:06 +00:00
* @ access public
* @ static
2006-10-20 17:24:37 +00:00
*/
function getPaths ( $current = false ) {
$_this =& Router :: getInstance ();
if ( $current ) {
2006-10-26 16:29:10 +00:00
return $_this -> __paths [ count ( $_this -> __paths ) - 1 ];
2006-10-20 17:24:37 +00:00
}
return $_this -> __paths [ 0 ];
}
2006-09-28 20:29:52 +00:00
/**
* Reloads default Router settings
*
2007-05-26 06:26:06 +00:00
* @ access public
* @ static
2006-09-28 20:29:52 +00:00
*/
function reload () {
$_this =& Router :: getInstance ();
foreach ( get_class_vars ( 'Router' ) as $key => $val ) {
$_this -> { $key } = $val ;
}
}
2006-09-22 16:39:15 +00:00
/**
* Finds URL for specified action .
*
* Returns an URL pointing to a combination of controller and action . Param
* $url can be :
* + Empty - the method will find adress to actuall controller / action .
* + '/' - the method will find base URL of application .
* + A combination of controller / action - the method will find url for it .
*
* @ param mixed $url Cake - relative URL , like " /products/edit/92 " or " /presidents/elect/4 "
* or an array specifying any of the following : 'controller' , 'action' ,
* and / or 'plugin' , in addition to named arguments ( keyed array elements ),
* and standard URL arguments ( indexed array elements )
* @ param boolean $full If true , the full base URL will be prepended to the result
* @ return string Full translated URL with base path .
2007-05-26 06:26:06 +00:00
* @ access public
* @ static
2006-09-22 16:39:15 +00:00
*/
function url ( $url = null , $full = false ) {
$_this =& Router :: getInstance ();
2007-02-26 02:11:30 +00:00
$defaults = $params = array ( 'plugin' => null , 'controller' => null , 'action' => 'index' );
2007-03-04 09:12:09 +00:00
2007-06-20 06:15:35 +00:00
if ( ! empty ( $_this -> __params )) {
2007-06-22 01:25:35 +00:00
if ( isset ( $this ) && ! isset ( $this -> params [ 'requested' ])) {
2007-04-02 19:20:50 +00:00
$params = $_this -> __params [ 0 ];
2007-06-22 01:25:35 +00:00
} elseif ( isset ( $this ) && isset ( $this -> params [ 'requested' ])) {
$params = end ( $_this -> __params );
} else {
2007-04-02 19:20:50 +00:00
$params = end ( $_this -> __params );
}
2007-02-02 23:55:47 +00:00
}
2007-02-26 02:11:30 +00:00
$path = array ( 'base' => null );
2007-04-29 03:46:58 +00:00
2007-06-20 06:15:35 +00:00
if ( ! empty ( $_this -> __paths )) {
2007-06-22 01:25:35 +00:00
if ( isset ( $this ) && ! isset ( $this -> params [ 'requested' ])) {
2007-04-02 19:20:50 +00:00
$path = $_this -> __paths [ 0 ];
2007-06-22 01:25:35 +00:00
} elseif ( isset ( $this ) && isset ( $this -> params [ 'requested' ])) {
$path = end ( $_this -> __paths );
} else {
2007-04-02 19:20:50 +00:00
$path = end ( $_this -> __paths );
}
2007-02-02 23:55:47 +00:00
}
2006-11-08 02:07:11 +00:00
$base = $_this -> stripPlugin ( $path [ 'base' ], $params [ 'plugin' ]);
2007-04-17 07:51:01 +00:00
$extension = $output = $mapped = $q = $frag = null ;
2006-09-22 16:39:15 +00:00
if ( is_array ( $url ) && ! empty ( $url )) {
2006-11-03 19:38:54 +00:00
if ( isset ( $url [ 'full_base' ]) && $url [ 'full_base' ] == true ) {
$full = true ;
unset ( $url [ 'full_base' ]);
}
2006-11-10 17:08:31 +00:00
if ( isset ( $url [ '?' ])) {
$q = $url [ '?' ];
unset ( $url [ '?' ]);
}
2007-04-17 07:51:01 +00:00
if ( isset ( $url [ '#' ])) {
$frag = '#' . urlencode ( $url [ '#' ]);
unset ( $url [ '#' ]);
}
2006-09-22 16:39:15 +00:00
if ( ! isset ( $url [ 'action' ])) {
if ( ! isset ( $url [ 'controller' ]) || $params [ 'controller' ] == $url [ 'controller' ]) {
$url [ 'action' ] = $params [ 'action' ];
2007-02-26 02:11:30 +00:00
} else {
$url [ 'action' ] = 'index' ;
2006-09-22 16:39:15 +00:00
}
}
2007-02-26 02:11:30 +00:00
$url = am ( array ( 'controller' => $params [ 'controller' ], 'plugin' => $params [ 'plugin' ]), $url );
2006-12-24 04:32:22 +00:00
2006-09-22 16:39:15 +00:00
if ( isset ( $url [ 'ext' ])) {
$extension = '.' . $url [ 'ext' ];
}
2006-12-07 05:58:08 +00:00
if ( defined ( 'CAKE_ADMIN' ) && ! isset ( $url [ CAKE_ADMIN ]) && isset ( $params [ CAKE_ADMIN ])) {
2006-12-25 10:51:08 +00:00
$url [ CAKE_ADMIN ] = CAKE_ADMIN ;
$url [ 'action' ] = str_replace ( CAKE_ADMIN . '_' , '' , $url [ 'action' ]);
2006-12-07 22:41:20 +00:00
} elseif ( defined ( 'CAKE_ADMIN' ) && isset ( $url [ CAKE_ADMIN ]) && $url [ CAKE_ADMIN ] == false ) {
2006-12-07 05:58:08 +00:00
unset ( $url [ CAKE_ADMIN ]);
2006-09-22 16:39:15 +00:00
}
2007-02-26 02:11:30 +00:00
$match = false ;
2007-04-29 03:46:58 +00:00
2006-11-10 17:08:31 +00:00
foreach ( $_this -> routes as $route ) {
2007-02-26 02:11:30 +00:00
if ( $match = $_this -> mapRouteElements ( $route , $url )) {
2006-11-10 17:08:31 +00:00
list ( $output , $url ) = $match ;
2007-02-26 02:11:30 +00:00
if ( strpos ( $output , '/' ) === 0 ) {
2006-11-10 17:08:31 +00:00
$output = substr ( $output , 1 );
}
break ;
}
}
2006-09-22 16:39:15 +00:00
$named = $args = array ();
2007-04-17 07:51:01 +00:00
$skip = am ( array_keys ( $_this -> __mapped ), array ( 'bare' , 'action' , 'controller' , 'plugin' , 'ext' , '?' , '#' ));
2007-04-29 03:46:58 +00:00
2007-06-20 06:15:35 +00:00
if ( defined ( 'CAKE_ADMIN' )) {
2006-12-25 10:51:08 +00:00
$skip [] = CAKE_ADMIN ;
2006-12-26 13:46:22 +00:00
}
2007-04-29 03:46:58 +00:00
$_this -> __mapped = array ();
2006-12-25 10:51:08 +00:00
$keys = array_values ( array_diff ( array_keys ( $url ), $skip ));
2006-09-22 16:39:15 +00:00
$count = count ( $keys );
2007-04-29 03:46:58 +00:00
2006-09-22 16:39:15 +00:00
for ( $i = 0 ; $i < $count ; $i ++ ) {
2007-03-12 01:52:40 +00:00
if ( $i == 0 && is_numeric ( $keys [ $i ]) && in_array ( 'id' , $keys )) {
$args [ 0 ] = $url [ $keys [ $i ]];
2007-06-20 06:15:35 +00:00
} elseif ( is_numeric ( $keys [ $i ]) || $keys [ $i ] == 'id' ) {
2006-09-22 16:39:15 +00:00
$args [] = $url [ $keys [ $i ]];
2007-06-20 06:15:35 +00:00
} elseif ( ! empty ( $path [ 'namedArgs' ]) && in_array ( $keys [ $i ], array_keys ( $path [ 'namedArgs' ])) && ! empty ( $url [ $keys [ $i ]])) {
2007-03-04 09:12:09 +00:00
$named [] = $keys [ $i ] . $path [ 'argSeparator' ] . $url [ $keys [ $i ]];
2007-06-20 06:15:35 +00:00
} elseif ( ! empty ( $url [ $keys [ $i ]]) || is_numeric ( $url [ $keys [ $i ]])) {
2007-03-04 09:12:09 +00:00
$named [] = $keys [ $i ] . $path [ 'argSeparator' ] . $url [ $keys [ $i ]];
2006-09-28 20:29:52 +00:00
}
}
2007-03-04 09:12:09 +00:00
2006-11-10 17:08:31 +00:00
if ( $match === false ) {
2007-07-22 04:07:06 +00:00
list ( $args , $named ) = array ( Set :: filter ( $args , true ), Set :: filter ( $named , true ));
2007-02-05 23:45:26 +00:00
if ( empty ( $named ) && empty ( $args ) && ( ! isset ( $url [ 'action' ]) || $url [ 'action' ] == 'index' )) {
2006-11-10 17:08:31 +00:00
$url [ 'action' ] = null ;
2006-09-22 16:39:15 +00:00
}
2007-04-17 07:00:26 +00:00
$urlOut = Set :: filter ( array ( $url [ 'plugin' ], $url [ 'controller' ], $url [ 'action' ]));
2007-02-03 01:03:33 +00:00
2007-06-20 06:15:35 +00:00
if ( $url [ 'plugin' ] == $url [ 'controller' ]) {
2006-12-25 10:51:08 +00:00
array_shift ( $urlOut );
}
2006-11-10 17:08:31 +00:00
if ( defined ( 'CAKE_ADMIN' ) && isset ( $url [ CAKE_ADMIN ]) && $url [ CAKE_ADMIN ]) {
array_unshift ( $urlOut , CAKE_ADMIN );
}
2007-07-24 13:50:50 +00:00
$output = join ( '/' , $urlOut ) . '/' ;
2006-09-22 16:39:15 +00:00
}
2007-03-04 09:12:09 +00:00
2007-07-22 04:07:06 +00:00
foreach ( array ( 'args' , 'named' ) as $var ) {
if ( ! empty ( ${$var} )) {
${$var} = join ( '/' , ${$var} );
if ( $output { strlen ( $output ) - 1 } != '/' ) {
${$var} = '/' . ${$var} ;
}
$output .= ${$var} ;
2007-03-04 09:12:09 +00:00
}
}
$output = str_replace ( '//' , '/' , $base . '/' . $output );
2006-09-22 16:39:15 +00:00
} else {
2007-07-22 04:07:06 +00:00
if ((( strpos ( $url , '://' )) || ( strpos ( $url , 'javascript:' ) === 0 ) || ( strpos ( $url , 'mailto:' ) === 0 )) || ( substr ( $url , 0 , 1 ) == '#' )) {
2006-09-22 16:39:15 +00:00
return $url ;
}
if ( empty ( $url )) {
2006-09-28 20:29:52 +00:00
return $path [ 'here' ];
2007-06-20 06:15:35 +00:00
} elseif ( $url { 0 } == '/' ) {
2006-09-22 16:39:15 +00:00
$output = $base . $url ;
} else {
2006-12-07 18:59:58 +00:00
$output = $base . '/' ;
2006-12-07 22:41:20 +00:00
if ( defined ( 'CAKE_ADMIN' ) && isset ( $params [ CAKE_ADMIN ])) {
2006-12-07 18:59:58 +00:00
$output .= CAKE_ADMIN . '/' ;
}
2007-05-20 01:40:34 +00:00
if ( ! empty ( $params [ 'plugin' ])) {
$output .= Inflector :: underscore ( $params [ 'plugin' ]) . '/' ;
}
$output .= Inflector :: underscore ( $params [ 'controller' ]) . '/' . $url ;
2006-09-22 16:39:15 +00:00
}
2007-04-30 11:12:11 +00:00
$output = str_replace ( '//' , '/' , $output );
2006-09-22 16:39:15 +00:00
}
if ( $full ) {
$output = FULL_BASE_URL . $output ;
}
2007-07-25 04:38:28 +00:00
if ( ! empty ( $extension ) && substr ( $output , - 1 ) == '/' ) {
2007-07-17 13:45:20 +00:00
$output = substr ( $output , 0 , - 1 );
}
2007-04-17 07:51:01 +00:00
return $output . $extension . $_this -> queryString ( $q ) . $frag ;
2006-09-22 16:39:15 +00:00
}
2006-09-28 20:29:52 +00:00
/**
2006-11-08 02:07:11 +00:00
* Maps a URL array onto a route and returns the string result , or false if no match
2006-09-28 20:29:52 +00:00
*
2007-05-26 06:26:06 +00:00
* @ param array $route Route Route
* @ param array $url URL URL to map
* @ return mixed Result ( as string ) or false if no match
* @ access public
* @ static
2006-09-28 20:29:52 +00:00
*/
function mapRouteElements ( $route , $url ) {
2007-02-26 02:11:30 +00:00
$_this =& Router :: getInstance ();
2006-12-06 20:38:28 +00:00
$params = $route [ 2 ];
2007-03-04 09:12:09 +00:00
$defaults = am ( array ( 'plugin' => null , 'controller' => null , 'action' => null ), $route [ 3 ]);
$pass = Set :: diff ( $url , $defaults );
2007-02-26 02:11:30 +00:00
if ( ! strpos ( $route [ 0 ], '*' ) && ! empty ( $pass )) {
return false ;
}
2007-03-12 01:52:40 +00:00
2007-05-13 02:00:24 +00:00
if ( defined ( 'CAKE_ADMIN' ) && isset ( $pass [ CAKE_ADMIN ])) {
return false ;
}
2007-06-20 06:15:35 +00:00
foreach ( $pass as $key => $value ) {
if ( ! is_numeric ( $key )) {
2007-03-12 01:52:40 +00:00
unset ( $pass [ $key ]);
2007-02-02 23:55:47 +00:00
}
}
krsort ( $defaults );
krsort ( $url );
2007-07-30 13:15:59 +00:00
if ( Set :: diff ( $url , $defaults ) == array ()) {
return array ( Router :: __mapRoute ( $route , am ( $url , compact ( 'pass' ))), array ());
2007-02-26 02:11:30 +00:00
} elseif ( ! empty ( $params ) && ! empty ( $route [ 3 ])) {
2007-02-02 23:55:47 +00:00
$required = array_diff ( array_keys ( $defaults ), array_keys ( $url ));
2007-07-30 13:15:59 +00:00
2007-06-20 06:15:35 +00:00
if ( ! empty ( $required )) {
2006-12-25 10:51:08 +00:00
return false ;
}
2006-12-06 20:38:28 +00:00
$filled = array_intersect_key ( $url , array_combine ( $params , array_keys ( $params )));
$keysFilled = array_keys ( $filled );
sort ( $params );
sort ( $keysFilled );
2007-02-26 02:11:30 +00:00
2006-12-06 20:38:28 +00:00
if ( $keysFilled != $params ) {
return false ;
}
2007-02-26 02:11:30 +00:00
if ( Set :: diff ( $keysFilled , $params ) != array ()) {
2006-12-25 10:51:08 +00:00
return false ;
}
2006-12-07 05:58:08 +00:00
} else {
2007-02-02 23:55:47 +00:00
$required = array_diff ( array_keys ( $defaults ), array_keys ( $url ));
2007-06-20 06:15:35 +00:00
if ( empty ( $required ) && $defaults [ 'plugin' ] == $url [ 'plugin' ] && $defaults [ 'controller' ] == $url [ 'controller' ] && $defaults [ 'action' ] == $url [ 'action' ]) {
2007-03-04 09:12:09 +00:00
return array ( Router :: __mapRoute ( $route , am ( $url , array ( 'pass' => $pass ))), $url );
2007-02-02 23:55:47 +00:00
}
2006-12-07 05:58:08 +00:00
return false ;
2006-12-06 20:38:28 +00:00
}
2007-02-02 23:55:47 +00:00
2007-06-20 06:15:35 +00:00
if ( isset ( $route [ 3 ][ 'controller' ]) && ! empty ( $route [ 3 ][ 'controller' ]) && $url [ 'controller' ] != $route [ 3 ][ 'controller' ]) {
2007-02-02 23:55:47 +00:00
return false ;
}
2007-06-20 06:15:35 +00:00
if ( ! empty ( $route [ 4 ])) {
2006-12-25 10:51:08 +00:00
foreach ( $route [ 4 ] as $key => $reg ) {
if ( isset ( $url [ $key ]) && ! preg_match ( '/' . $reg . '/' , $url [ $key ])) {
return false ;
}
2006-11-10 17:08:31 +00:00
}
}
2007-07-30 13:15:59 +00:00
return array ( Router :: __mapRoute ( $route , am ( $url , compact ( 'pass' ))), $url );
2006-12-06 20:38:28 +00:00
}
/**
* Merges URL parameters into a route string
*
2007-05-26 06:26:06 +00:00
* @ param array $route Route
* @ param array $params Parameters
* @ return string Merged URL with parameters
* @ access private
2006-12-06 20:38:28 +00:00
*/
function __mapRoute ( $route , $params = array ()) {
2007-02-26 02:11:30 +00:00
$_this =& Router :: getInstance ();
2006-12-06 20:38:28 +00:00
if ( isset ( $params [ 'pass' ]) && is_array ( $params [ 'pass' ])) {
2007-03-07 07:53:43 +00:00
$_this -> __mapped = $params [ 'pass' ];
2007-04-17 07:00:26 +00:00
$params [ 'pass' ] = implode ( '/' , Set :: filter ( $params [ 'pass' ], true ));
2006-12-06 20:38:28 +00:00
} elseif ( ! isset ( $params [ 'pass' ])) {
$params [ 'pass' ] = '' ;
}
2007-07-31 05:00:24 +00:00
if ( isset ( $params [ 'plugin' ])) {
if ( strpos ( $route [ 0 ], 'plugin' ) === false && ! empty ( $route [ 2 ])) {
$route [ 2 ] = array_merge ( $route [ 2 ], array ( 'plugin' ));
$route [ 0 ] = '/:plugin' . $route [ 0 ];
}
}
2006-12-06 20:38:28 +00:00
if ( strpos ( $route [ 0 ], '*' )) {
$out = str_replace ( '*' , $params [ 'pass' ], $route [ 0 ]);
} else {
2007-02-26 02:11:30 +00:00
$out = $route [ 0 ];
2006-12-06 20:38:28 +00:00
}
2006-12-29 04:16:53 +00:00
2006-11-10 17:08:31 +00:00
foreach ( $route [ 2 ] as $key ) {
2007-07-31 02:01:29 +00:00
$string = null ;
if ( isset ( $params [ $key ])) {
$string = $params [ $key ];
unset ( $params [ $key ]);
}
$out = str_replace ( ':' . $key , $string , $out );
$_this -> __mapped [ $key ] = $string ;
2006-11-10 17:08:31 +00:00
}
2007-03-04 09:12:09 +00:00
return $out ;
2006-11-10 17:08:31 +00:00
}
/**
* Generates a well - formed querystring from $q
*
2007-05-26 06:26:06 +00:00
* @ param mixed $q Query string
* @ param array $extra Extra querystring parameters
2006-11-10 17:08:31 +00:00
* @ return array
2007-05-26 06:26:06 +00:00
* @ access public
* @ static
2006-11-10 17:08:31 +00:00
*/
function queryString ( $q , $extra = array ()) {
2007-02-26 02:11:30 +00:00
if ( empty ( $q ) && empty ( $extra )) {
2006-11-10 17:08:31 +00:00
return null ;
2006-11-08 02:07:11 +00:00
}
2007-02-26 02:11:30 +00:00
$out = '' ;
if ( is_array ( $q )) {
$q = am ( $extra , $q );
} else {
$out = $q ;
$q = $extra ;
}
$out .= http_build_query ( $q );
if ( strpos ( $out , '?' ) !== 0 ) {
$out = '?' . $out ;
}
return $out ;
2006-09-28 20:29:52 +00:00
}
2006-09-22 16:39:15 +00:00
/**
2007-02-26 02:11:30 +00:00
* Returns the route matching the current request URL .
2006-09-22 16:39:15 +00:00
*
2007-05-26 06:26:06 +00:00
* @ return array Matching route
* @ access public
* @ static
2006-09-22 16:39:15 +00:00
*/
function requestRoute () {
$_this =& Router :: getInstance ();
return $_this -> __currentRoute [ 0 ];
}
/**
* Returns the route matching the current request ( useful for requestAction traces )
*
2007-05-26 06:26:06 +00:00
* @ return array Matching route
* @ access public
* @ static
2006-09-22 16:39:15 +00:00
*/
function currentRoute () {
$_this =& Router :: getInstance ();
return $_this -> __currentRoute [ count ( $_this -> __currentRoute ) - 1 ];
}
2006-11-08 02:07:11 +00:00
/**
2007-02-26 02:11:30 +00:00
* Removes the plugin name from the base URL .
2006-11-08 02:07:11 +00:00
*
2007-05-26 06:26:06 +00:00
* @ param string $base Base URL
* @ param string $plugin Plugin name
2006-11-08 02:07:11 +00:00
* @ return base url with plugin name removed if present
2007-05-26 06:26:06 +00:00
* @ access public
* @ static
2006-11-08 02:07:11 +00:00
*/
function stripPlugin ( $base , $plugin ) {
if ( $plugin != null ) {
$base = preg_replace ( '/' . $plugin . '/' , '' , $base );
$base = str_replace ( '//' , '' , $base );
$pos1 = strrpos ( $base , '/' );
$char = strlen ( $base ) - 1 ;
if ( $pos1 == $char ) {
$base = substr ( $base , 0 , $char );
}
}
return $base ;
}
2007-05-26 06:26:06 +00:00
/**
* Strip escape characters from parameter values .
*
* @ param mixed $param Either an array , or a string
* @ return mixed Array or string escaped
* @ access public
* @ static
*/
2007-05-21 03:29:49 +00:00
function stripEscape ( $param ) {
2007-06-07 19:27:42 +00:00
$_this =& Router :: getInstance ();
2007-06-20 06:15:35 +00:00
if ( ! is_array ( $param ) || empty ( $param )) {
if ( is_bool ( $param )) {
2007-05-25 03:33:12 +00:00
return $param ;
}
2007-05-23 20:00:16 +00:00
$return = preg_replace ( '/^[\\t ]*(?:-!)+/' , '' , $param );
2007-05-21 03:29:49 +00:00
return $return ;
}
2007-06-20 06:15:35 +00:00
foreach ( $param as $key => $value ) {
if ( is_string ( $value )) {
2007-05-23 20:00:16 +00:00
$return [ $key ] = preg_replace ( '/^[\\t ]*(?:-!)+/' , '' , $value );
2007-05-21 03:29:49 +00:00
} else {
foreach ( $value as $array => $string ) {
2007-06-07 19:27:42 +00:00
$return [ $key ][ $array ] = $_this -> stripEscape ( $string );
2007-05-21 03:29:49 +00:00
}
}
}
return $return ;
}
2006-08-12 16:46:42 +00:00
/**
2006-11-03 19:38:54 +00:00
* Instructs the router to parse out file extensions from the URL . For example ,
2006-11-14 16:20:52 +00:00
* http :// example . com / posts . rss would yield an file extension of " rss " .
2006-11-03 19:38:54 +00:00
* The file extension itself is made available in the controller as
* $this -> params [ 'url' ][ 'ext' ], and is used by the RequestHandler component to
* automatically switch to alternate layouts and templates , and load helpers
* corresponding to the given content , i . e . RssHelper .
2006-08-12 16:46:42 +00:00
*
2007-02-26 02:11:30 +00:00
* A list of valid extension can be passed to this method , i . e . Router :: parseExtensions ( 'rss' , 'xml' );
* If no parameters are given , anything after the first . ( dot ) after the last / in the URL will be
* parsed , excluding querystring parameters ( i . e . ? q =... ) .
2007-02-03 02:32:42 +00:00
*
2007-05-26 06:26:06 +00:00
* @ access public
* @ static
2006-08-12 16:46:42 +00:00
*/
2007-02-03 21:47:38 +00:00
function parseExtensions () {
2006-08-12 16:46:42 +00:00
$_this =& Router :: getInstance ();
$_this -> __parseExtensions = true ;
2007-02-03 21:47:38 +00:00
if ( func_num_args () > 0 ) {
$_this -> __validExtensions = func_get_args ();
}
2006-08-12 16:46:42 +00:00
}
2007-07-24 13:50:50 +00:00
/**
* Takes an array of params and converts it to named args
*
* @ access public
* @ param array $params
* @ param mixed $named
* @ param string $separator
* @ static
*/
function getArgs ( $params , $named = true , $separator = ':' ) {
$passedArgs = $namedArgs = array ();
if ( is_array ( $named )) {
if ( array_key_exists ( $params [ 'action' ], $named )) {
$named = $named [ $params [ 'action' ]];
}
$namedArgs = true ;
}
if ( ! empty ( $params [ 'pass' ])) {
$passedArgs = $params [ 'pass' ];
if ( $namedArgs === true || $named == true ) {
$namedArgs = array ();
$c = count ( $passedArgs );
for ( $i = 0 ; $i <= $c ; $i ++ ) {
if ( isset ( $passedArgs [ $i ]) && strpos ( $passedArgs [ $i ], $separator ) !== false ) {
list ( $argKey , $argVal ) = explode ( $separator , $passedArgs [ $i ]);
if ( $named === true || ( ! empty ( $named ) && in_array ( $argKey , array_keys ( $named )))) {
$passedArgs [ $argKey ] = $argVal ;
$namedArgs [ $argKey ] = $argVal ;
unset ( $passedArgs [ $i ]);
unset ( $params [ 'pass' ][ $i ]);
}
} elseif ( $separator === '/' ) {
$ii = $i + 1 ;
if ( isset ( $passedArgs [ $i ]) && isset ( $passedArgs [ $ii ])) {
$argKey = $passedArgs [ $i ];
$argVal = $passedArgs [ $ii ];
if ( empty ( $namedArgs ) || ( ! empty ( $namedArgs ) && in_array ( $argKey , array_keys ( $namedArgs )))) {
$passedArgs [ $argKey ] = $argVal ;
$namedArgs [ $argKey ] = $argVal ;
unset ( $passedArgs [ $i ], $passedArgs [ $ii ]);
unset ( $params [ 'pass' ][ $i ], $params [ 'pass' ][ $ii ]);
}
}
}
}
}
}
return array ( $passedArgs , $namedArgs );
}
2005-06-30 02:09:47 +00:00
}
2007-05-26 06:26:06 +00:00
2007-06-20 06:15:35 +00:00
if ( ! function_exists ( 'http_build_query' )) {
2007-02-26 02:11:30 +00:00
/**
* Implements http_build_query for PHP4 .
*
2007-05-26 06:26:06 +00:00
* @ param string $data Data to set in query string
* @ param string $prefix If numeric indices , prepend this to index for elements in base array .
* @ param string $argSep String used to separate arguments
* @ param string $baseKey Base key
* @ return string URL encoded query string
2007-02-26 02:11:30 +00:00
* @ see http :// php . net / http_build_query
*/
function http_build_query ( $data , $prefix = null , $argSep = null , $baseKey = null ) {
2007-06-20 06:15:35 +00:00
if ( empty ( $argSep )) {
2007-02-26 02:11:30 +00:00
$argSep = ini_get ( 'arg_separator.output' );
}
if ( is_object ( $data )) {
$data = get_object_vars ( $data );
}
$out = array ();
2007-06-20 06:15:35 +00:00
foreach (( array ) $data as $key => $v ) {
if ( is_numeric ( $key ) && ! empty ( $prefix )) {
2007-02-26 02:11:30 +00:00
$key = $prefix . $key ;
}
$key = urlencode ( $key );
2007-06-20 06:15:35 +00:00
if ( ! empty ( $baseKey )) {
2007-02-26 02:11:30 +00:00
$key = $baseKey . '[' . $key . ']' ;
}
2007-06-20 06:15:35 +00:00
if ( is_array ( $v ) || is_object ( $v )) {
2007-02-26 02:11:30 +00:00
$out [] = http_build_query ( $v , $prefix , $argSep , $key );
} else {
2007-03-22 18:52:45 +00:00
$out [] = $key . '=' . urlencode ( $v );
2007-02-26 02:11:30 +00:00
}
}
return implode ( $argSep , $out );
}
}
2007-05-03 04:35:25 +00:00
?>