Source for file jUrl.class.php

Documentation is available at jUrl.class.php

  1. <?php
  2. /**
  3. @package     jelix
  4. @subpackage  core_url
  5. @author      Laurent Jouanneau
  6. @contributor Thibault PIRONT < nuKs >
  7. @copyright   2005-2008 Laurent Jouanneau
  8. @copyright   2007 Thibault PIRONT
  9. *  Some parts of this file are took from an experimental branch of the Copix project (CopixUrl.class.php, Copix 2.3dev20050901, http://www.copix.org),
  10. *  Some lines of code are still copyrighted 2001-2005 CopixTeam (LGPL licence).
  11. *  Initial authors of this parts are Gerald Croes and Laurent Jouanneau,
  12. *  and this parts were adapted/improved for Jelix by Laurent Jouanneau
  13. @link        http://www.jelix.org
  14. @licence     GNU Lesser General Public Licence see LICENCE file or http://www.gnu.org/licenses/lgpl.html
  15. */
  16.  
  17. /**
  18.  * interface for url engines
  19.  * @package  jelix
  20.  * @subpackage core_url
  21.  * @author      Laurent Jouanneau
  22.  * @copyright   2005 CopixTeam, 2005-2006 Laurent Jouanneau
  23.  */
  24. interface jIUrlEngine {
  25.     /**
  26.         * Parse some url components
  27.         * @param string $scriptNamePath    /path/index.php
  28.         * @param string $pathinfo          the path info part of the url (part between script name and query)
  29.         * @param array  $params            url parameters (query part e.g. $_REQUEST)
  30.         * @return jUrlAction 
  31.         */
  32.     public function parse($scriptNamePath$pathinfo$params );
  33.  
  34.     /**
  35.     * Create a jurl object with the given action data
  36.     * @param jUrlAction $url  information about the action
  37.     * @return jUrl the url correspondant to the action
  38.     */
  39.     public function create($urlact);
  40.  
  41. }
  42. /**
  43.  * base class for jUrl and jUrlAction
  44.  * @package  jelix
  45.  * @subpackage core_url
  46.  * @author      Laurent Jouanneau
  47.  * @copyright   2005-2006 Laurent Jouanneau
  48.  */
  49. abstract class jUrlBase {
  50.  
  51.     /**
  52.      * parameters
  53.      */
  54.     public $params=array();
  55.  
  56.     /**
  57.     * add or change the value of a parameter
  58.     * @param    string    $name    parameter name
  59.     * @param    string    $value   parameter value
  60.     */
  61.     public function setParam ($name$value){
  62.         $this->params[$name$value;
  63.     }
  64.  
  65.     /**
  66.     * delete a parameter
  67.     * @param    string    $name    parameter name
  68.     */
  69.     public function delParam ($name){
  70.         if (array_key_exists($name$this->params))
  71.             unset ($this->params[$name]);
  72.     }
  73.  
  74.     /**
  75.     * get a parameter value
  76.     * @param string  $name    parameter name
  77.     * @param string  $defaultValue   the default value returned if the parameter doesn't exists
  78.     * @return string the value
  79.     */
  80.     public function getParam ($name$defaultValue=null){
  81.         return array_key_exists($name$this->params)$this->params[$name:$defaultValue;
  82.     }
  83.  
  84.     /**
  85.     * Clear parameters
  86.     */
  87.     public function clearParam (){
  88.         $this->params = array ();
  89.     }
  90.  
  91.  
  92.     /**
  93.      * get the url string corresponding to the url/action
  94.      * @param boolean $forxml  true: some characters will be escaped
  95.      * @return string 
  96.      */
  97.     abstract public function toString($forxml false);
  98.  
  99.  
  100.     /**
  101.      * magic method for echo and others...
  102.      */
  103.     public function __toString(){
  104.         return $this->toString();
  105.     }
  106.  
  107.  
  108. }
  109.  
  110. /**
  111.  * A container to store url data for an action
  112.  * @package  jelix
  113.  * @subpackage core_url
  114.  * @author      Laurent Jouanneau
  115.  * @copyright   2005-2006 Laurent Jouanneau
  116.  */
  117. class jUrlAction extends jUrlBase {
  118.  
  119.     /**
  120.      * the request type
  121.      * @var string 
  122.      */
  123.     public $requestType='';
  124.  
  125.     /**
  126.      * constructor...
  127.      */
  128.     function __construct ($params=array(),$request=''){
  129.         $this->params=$params;
  130.         $this->requestType=$request;
  131.         if($this->requestType == ''){
  132.             $this->requestType = $GLOBALS['gJCoord']->request->type;
  133.         }
  134.     }
  135.  
  136.     /**
  137.      * get the url string corresponding to the action
  138.      * @param boolean $forxml  true: some characters will be escaped
  139.      * @return string 
  140.      */
  141.     public function toString($forxml false){
  142.         return $this->toUrl()->toString($forxml);
  143.     }
  144.  
  145.     /**
  146.      * get the jUrl object corresponding to the action
  147.      * @return jUrl 
  148.      */
  149.     public function toUrl({
  150.         return jUrl::getEngine()->create($this);
  151.     }
  152. }
  153.  
  154.  
  155. /**
  156.  * Object that contains url data, and which provides static method helpers
  157.  * @package  jelix
  158.  * @subpackage core_url
  159.  * @author      Laurent Jouanneau (for the original code from Copix and enhancement for jelix)
  160.  * @author      Gerald Croes (for the original code from Copix)
  161.  * @copyright   2005 CopixTeam, 2005-2006 Laurent Jouanneau
  162.  */
  163. class jUrl extends jUrlBase {
  164.  
  165.      /**#@+
  166.      * constant for get() method
  167.      * @var integer
  168.      */
  169.     const STRING=0;
  170.     const XMLSTRING=1;
  171.     const JURL=2;
  172.     const JURLACTION=3;
  173.     /**#@-*/
  174.     
  175.     /**
  176.     * script name including its path
  177.     * @var string 
  178.     */
  179.     public $scriptName;
  180.  
  181.     /**
  182.     * path info part of the url
  183.     * @var string 
  184.     */
  185.     public $pathInfo = '';
  186.  
  187.     /**
  188.     * constructor
  189.     * @param    string    $scriptname    script name
  190.     * @param    array    $params    parameters
  191.     * @param    string    $pathInfo    path info contents
  192.     */
  193.     function __construct ($scriptname=''$params=array ()$pathInfo=''){
  194.         $this->params      = $params;
  195.         $this->scriptName  = $scriptname;
  196.         $this->pathInfo    = $pathInfo;
  197.     }
  198.  
  199.  
  200.     /**
  201.     * converts the url to a string
  202.     * @param boolean $forxml  true: some characters will be escaped
  203.     * @return string 
  204.     */
  205.     public function toString ($forxml false){
  206.         return $this->getPath().$this->getQuery($forxml);
  207.     }
  208.  
  209.     /**
  210.      * get the path part of the url (scriptName + pathinfo)
  211.      * @return string 
  212.      * @since 1.0.4
  213.      */
  214.     public function getPath({
  215.         $url $this->scriptName;
  216.         if(substr($this->scriptName,-1== '/')
  217.             $url.=ltrim($this->pathInfo,'/');
  218.         else
  219.             $url.= $this->pathInfo;
  220.         return $url;
  221.     }
  222.  
  223.     /**
  224.      * get the query part of the url
  225.      * @param boolean $forxml  true: some characters will be escaped
  226.      * @return string 
  227.      * @since 1.0.4
  228.      */
  229.     public function getQuery($forxml false{
  230.         $url '';
  231.         if (count ($this->params)>0){
  232.             $q http_build_query($this->params''($forxml?'&amp;':'&'));
  233.             if(strpos($q'%3A')!==false)
  234.                 $q str_replace'%3A'':'$q);
  235.             $url .='?'.$q;
  236.         }
  237.         return $url;
  238.     }
  239.  
  240.     //============================== static helper methods
  241.  
  242.     /**
  243.     * get current Url
  244.     * @param boolean $forxml if true, escape some characters to include the url into an html/xml document
  245.     * @return string the url
  246.     */
  247.     static function getCurrentUrl ($forxml false{
  248.         if(isset($_SERVER["REQUEST_URI"])){
  249.            return $_SERVER["REQUEST_URI"];
  250.         }
  251.         static $url false;
  252.         if ($url === false){
  253.             $url 'http://'.$_SERVER['HTTP_HOST'].$GLOBALS['gJCoord']->request->urlScript.$GLOBALS['gJCoord']->request->urlPathInfo.'?';
  254.             $q http_build_query($_GET''($forxml?'&amp;':'&'));
  255.             if(strpos($q'%3A')!==false)
  256.                 $q str_replace'%3A'':'$q);
  257.             $url .=$q;
  258.         }
  259.         return $url;
  260.     }
  261.  
  262.     /**
  263.     * Adds parameters to the given url
  264.     * @param string $url  an URL
  265.     * @param array $params some parameters to append to the url
  266.     * @param boolean $forxml if true, escape some characters to include the url into an html/xml document
  267.     * @return string the url
  268.     */
  269.     static function appendToUrlString ($url$params array ()$forxml false){
  270.         $q http_build_query($params''($forxml?'&amp;':'&'));
  271.         if(strpos($q'%3A')!==false)
  272.             $q str_replace'%3A'':'$q);
  273.         if ((($pos strpos $url'?')) !== false&& ($pos !== (strlen ($url)-1))){
  274.             return $url ($forxml '&amp;' '&').$q;
  275.         }else{
  276.             return $url '?'.$q;
  277.         }
  278.     }
  279.  
  280.     /**
  281.     * Gets the url corresponding to an action, in the given format
  282.     * @param string $actSel  action selector. You can use # instead of the module
  283.     *                 or the action name, to specify the current url.
  284.     * @param array $params associative array with the parameters
  285.     * @param integer $what the format you want : one of the jUrl const,
  286.     *                                      STRING XMLSTRING JURL JURLACTION
  287.     * @return mixed a value, depending of the $what parameter
  288.     */
  289.     static function get ($actSel$params array ()$what=0{
  290.  
  291.         $sel new jSelectorAct($actSel,true);
  292.         $params['module'$sel->module;
  293.         $params['action'$sel->resource;
  294.         $ua new jUrlAction($params$sel->request);
  295.  
  296.         if($what == 3return $ua;
  297.  
  298.         $url jUrl::getEngine()->create($ua);
  299.  
  300.         if($what == 2return $url;
  301.  
  302.         return $url->toString($what != 0);
  303.     }
  304.  
  305.     /**
  306.      * Parse a url
  307.      * @param string $scriptNamePath    /path/index.php
  308.      * @param string $pathinfo          the path info of the url.
  309.      * @param array  $params            url parameter ($_REQUEST)
  310.      * @return jUrlAction 
  311.      */
  312.     static function parse($scriptNamePath$pathinfo$params ){
  313.          return jUrl::getEngine()->parse($scriptNamePath,$pathinfo$params);
  314.     }
  315.  
  316.     /**
  317.      * escape and simplier a string to be a part of an url path
  318.      * remove or replace not allowed characters etc..
  319.      * @param string $str the string to escape
  320.      * @param boolean $highlevel false : just to a urlencode. true, replace some characters
  321.      * @return string escaped string
  322.      */
  323.     static function escape($str$highlevel=false){
  324.         static $url_escape_from null;
  325.         static $url_escape_to null;
  326.  
  327.         if($highlevel){
  328.             if($url_escape_from == null){
  329.                 $url_escape_from explode(' ',jLocale::get('jelix~format.url_escape_from'));
  330.                 $url_escape_to explode(' ',jLocale::get('jelix~format.url_escape_to'));
  331.             }
  332.             // we don't use strtr because it is not utf8 compliant
  333.             $str=str_replace($url_escape_from$url_escape_to$str)// supprime les caractères accentuĂ©s, et les quotes, doubles quotes
  334.             $str=preg_replace("/([^\w])/"," ",$str)// remplace tout ce qui n'est pas lettre par un espace
  335.             //$str=preg_replace("/(?<=\s)\w{1,2}(?=\s)/"," ",$str); // enleve les mots de moins de 2 lettres
  336.             $str=preg_replace("/( +)/","-",trim($str))// on remplace les espaces et groupes d'espaces par -
  337.             $str=strtolower($str)// on met en minuscule
  338.             return $str;
  339.         }else{
  340.             return urlencode (str_replace (array ('-'' ')array ('--','-')$str));
  341.         }
  342.     }
  343.  
  344.     /**
  345.      * perform the opposit of escape
  346.      * @param string $str the string to escape
  347.      * @return string 
  348.      */
  349.     static function unescape($str){
  350.         return strtr ($strarray ('--'=>'-''-'=>' '));
  351.     }
  352.  
  353.     /**
  354.      * return the current url engine
  355.      * @return jIUrlEngine 
  356.      * @internal call with true parameter, to force to re-instancy the engine. usefull for test suite
  357.      */
  358.     static function getEngine($reset=false){
  359.         static $engine null;
  360.  
  361.         if($reset$engine=null// for unit tests
  362.  
  363.         if($engine === null){
  364.             global $gJConfig;
  365.             $name $gJConfig->urlengine['engine'];
  366.             if!isset($gJConfig->_pluginsPathList_urls[$name])
  367.                 || !file_exists($gJConfig->_pluginsPathList_urls[$name]) ){
  368.                     throw new jException('jelix~errors.urls.engine.notfound'$name);
  369.             }
  370.             require_once($gJConfig->_pluginsPathList_urls[$name].$name.'.urls.php');
  371.  
  372.             $cl=$name.'UrlEngine';
  373.             $engine new $cl();
  374.         }
  375.         return $engine;
  376.     }
  377.  
  378. }
  379.  
  380. ?>

Documentation generated on Wed, 07 Sep 2011 13:48:12 +0200 by phpDocumentor 1.4.3