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. @contributor Loic Mathaud
  8. @contributor Hadrien Lanneau
  9. @copyright   2005-2011 Laurent Jouanneau
  10. @copyright   2007 Thibault Piront
  11. @copyright   2006 Loic Mathaud, 2010 Hadrien Lanneau
  12. *  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),
  13. *  Some lines of code are still copyrighted 2001-2005 CopixTeam (LGPL licence).
  14. *  Initial authors of this parts are Gerald Croes and Laurent Jouanneau,
  15. *  and this parts were adapted for Jelix by Laurent Jouanneau
  16. @link        http://jelix.org
  17. @licence     GNU Lesser General Public Licence see LICENCE file or http://www.gnu.org/licenses/lgpl.html
  18. */
  19.  
  20.  
  21. /**
  22.  * Object that contains url data, and which provides static method helpers
  23.  * @package  jelix
  24.  * @subpackage core_url
  25.  * @author      Laurent Jouanneau (for the original code from Copix and enhancement for jelix)
  26.  * @author      Gerald Croes (for the original code from Copix)
  27.  * @contributor Loic Mathaud
  28.  * @contributor Thibault Piront (nuKs)
  29.  */
  30. class jUrl extends jUrlBase {
  31.  
  32.      /**#@+
  33.      * constant for get() method
  34.      * @var integer
  35.      */
  36.     const STRING=0;
  37.     const XMLSTRING=1;
  38.     const JURL=2;
  39.     const JURLACTION=3;
  40.     /**#@-*/
  41.  
  42.     /**
  43.     * script name including its path
  44.     * @var string 
  45.     */
  46.     public $scriptName;
  47.  
  48.     /**
  49.     * path info part of the url
  50.     * @var string 
  51.     */
  52.     public $pathInfo = '';
  53.  
  54.     /**
  55.     * constructor
  56.     * @param    string    $scriptname    script name
  57.     * @param    array    $params    parameters
  58.     * @param    string    $pathInfo    path info contents
  59.     */
  60.     function __construct ($scriptname=''$params=array ()$pathInfo=''){
  61.         $this->params      = $params;
  62.         $this->scriptName  = $scriptname;
  63.         $this->pathInfo    = $pathInfo;
  64.     }
  65.  
  66.  
  67.     /**
  68.     * converts the url to a string
  69.     * @param boolean $forxml  true: some characters will be escaped
  70.     * @return string 
  71.     */
  72.     public function toString ($forxml false){
  73.         return $this->getPath().$this->getQuery($forxml);
  74.     }
  75.  
  76.     /**
  77.      * get the path part of the url (scriptName + pathinfo)
  78.      * @return string 
  79.      * @since 1.0.4
  80.      */
  81.     public function getPath({
  82.         $url $this->scriptName;
  83.         if(substr($this->scriptName,-1== '/')
  84.             $url.=ltrim($this->pathInfo,'/');
  85.         else
  86.             $url.= $this->pathInfo;
  87.         return $url;
  88.     }
  89.  
  90.     /**
  91.      * get the query part of the url
  92.      * @param boolean $forxml  true: some characters will be escaped
  93.      * @return string 
  94.      * @since 1.0.4
  95.      */
  96.     public function getQuery($forxml false{
  97.         if (count ($this->params)>0){
  98.             $q http_build_query($this->params''($forxml?'&amp;':'&'));
  99.             if(!$q)
  100.                 return '';
  101.             if(strpos($q'%3A')!==false)
  102.                 $q str_replace'%3A'':'$q);
  103.             return '?'.$q;
  104.         }
  105.         return '';
  106.     }
  107.  
  108.     //============================== static helper methods
  109.  
  110.     /**
  111.     * get current Url
  112.     * @param boolean $forxml if true, escape some characters to include the url into an html/xml document
  113.     * @return string the url
  114.     */
  115.     static function getCurrentUrl ($forxml false{
  116.         if(isset($_SERVER["REQUEST_URI"])){
  117.            return $_SERVER["REQUEST_URI"];
  118.         }
  119.         static $url false;
  120.         if ($url === false){
  121.             $req $GLOBALS['gJCoord']->request;
  122.             $url $req->getServerURI().$req->urlScript.$req->urlPathInfo.'?';
  123.             $q http_build_query($_GET''($forxml?'&amp;':'&'));
  124.             if(strpos($q'%3A')!==false)
  125.                 $q str_replace'%3A'':'$q);
  126.             $url .=$q;
  127.         }
  128.         return $url;
  129.     }
  130.  
  131.     /**
  132.     * Adds parameters to the given url
  133.     * @param string $url  an URL
  134.     * @param array $params some parameters to append to the url
  135.     * @param boolean $forxml if true, escape some characters to include the url into an html/xml document
  136.     * @return string the url
  137.     */
  138.     static function appendToUrlString ($url$params array ()$forxml false){
  139.         $q http_build_query($params''($forxml?'&amp;':'&'));
  140.         if(strpos($q'%3A')!==false)
  141.             $q str_replace'%3A'':'$q);
  142.         if ((($pos strpos $url'?')) !== false&& ($pos !== (strlen ($url)-1))){
  143.             return $url ($forxml '&amp;' '&').$q;
  144.         }else{
  145.             return $url '?'.$q;
  146.         }
  147.     }
  148.  
  149.     /**
  150.     * Gets the url corresponding to an action, in the given format
  151.     * @param string $actSel  action selector. You can use # instead of the module
  152.     *                 or the action name, to specify the current url.
  153.     * @param array $params associative array with the parameters
  154.     * @param integer $what the format you want : one of the jUrl const,
  155.     *                                      STRING XMLSTRING JURL JURLACTION
  156.     * @return mixed a value, depending of the $what parameter
  157.     */
  158.     static function get ($actSel$params array ()$what=0{
  159.  
  160.         $sel new jSelectorAct($actSel,truetrue);
  161.         $params['module'$sel->module;
  162.         $params['action'$sel->resource;
  163.         $ua new jUrlAction($params$sel->request);
  164.  
  165.         if($what == 3return $ua;
  166.  
  167.         $url jUrl::getEngine()->create($ua);
  168.  
  169.         if($what == 2return $url;
  170.  
  171.         return $url->toString($what != 0);
  172.     }
  173.  
  174.     /**
  175.     * Gets the absolute url corresponding to an action, in the given format with
  176.     * the domainName in defaultConfig or current
  177.     * @param string $actSel  action selector. You can use # instead of the module
  178.     *                 or the action name, to specify the current url.
  179.     * @param array $params associative array with the parameters
  180.     * @param integer $what the format you want : only jUrl::STRING or jUrl::XMLSTRING
  181.     * @param string $domainName Customized domain name
  182.     * @return string the url string
  183.     */
  184.     static function getFull ($actSel$params array ()$what=0$domainName null{
  185.         global $gJCoord;
  186.  
  187.         $domain '';
  188.  
  189.         $url self::get($actSel$params($what != self::XMLSTRING?self::STRING:$what));
  190.         if (!preg_match('/^http/'$url)) {
  191.             if ($domainName{
  192.                 $domain $domainName;
  193.                 if (!preg_match('/^http/'$domainName))
  194.                     $domain $gJCoord->request->getProtocol($domain;
  195.             }
  196.             else {
  197.                 $domain $gJCoord->request->getServerURI();
  198.             }
  199.  
  200.             if ($domain == ''{
  201.                 throw new jException('jelix~errors.urls.domain.void');
  202.             }
  203.         }
  204.         else if ($domainName != ''{
  205.             $url str_replace($gJCoord->request->getDomainName()$domainName$url);
  206.         }
  207.  
  208.         return $domain.$url;
  209.     }
  210.  
  211.     /**
  212.      * Parse a url
  213.      * @param string $scriptNamePath    /path/index.php
  214.      * @param string $pathinfo          the path info of the url.
  215.      * @param array  $params            url parameter ($_REQUEST)
  216.      * @return jUrlAction 
  217.      */
  218.     static function parse($scriptNamePath$pathinfo$params ){
  219.          return jUrl::getEngine()->parse($scriptNamePath,$pathinfo$params);
  220.     }
  221.  
  222.     /**
  223.      * Parse a url from the request
  224.      * @param jRequest $request 
  225.      * @param array  $params            url parameters ($_REQUEST, or $_GET)
  226.      * @return jUrlAction 
  227.      * @since 1.1
  228.      */
  229.     static function parseFromRequest($request$params ){
  230.          return jUrl::getEngine()->parseFromRequest($request$params);
  231.     }
  232.  
  233.     /**
  234.      * escape and simplier a string to be a part of an url path
  235.      * remove or replace not allowed characters etc..
  236.      * @param string $str the string to escape
  237.      * @param boolean $highlevel false : just to a urlencode. true, replace some characters
  238.      * @return string escaped string
  239.      */
  240.     static function escape($str$highlevel=false){
  241.         static $url_escape_from null;
  242.         static $url_escape_to null;
  243.  
  244.         if($highlevel){
  245.             if($url_escape_from == null){
  246.                 $url_escape_from explode(' ',jLocale::get('jelix~format.url_escape_from'));
  247.                 $url_escape_to explode(' ',jLocale::get('jelix~format.url_escape_to'));
  248.             }
  249.             // first, we do transliteration.
  250.             // we don't use iconv because it is system dependant
  251.             // we don't use strtr because it is not utf8 compliant
  252.             $str str_replace($url_escape_from$url_escape_to$str);
  253.             // then we replace all non word characters by a space
  254.             $str preg_replace("/([^\w])/"," ",$str);
  255.             // then we remove words of 2 letters
  256.             //$str=preg_replace("/(?<=\s)\w{1,2}(?=\s)/"," ",$str);
  257.             // then we replace all spaces by a -
  258.             $str preg_replace("/( +)/","-",trim($str));
  259.             // we convert all character to lower case
  260.             $str strtolower($str);
  261.             return $str;
  262.         }else{
  263.             return urlencode (str_replace (array ('-'' ')array ('--','-')$str));
  264.         }
  265.     }
  266.  
  267.     /**
  268.      * perform the opposit of escape
  269.      * @param string $str the string to escape
  270.      * @return string 
  271.      */
  272.     static function unescape($str){
  273.         return strtr ($strarray ('--'=>'-''-'=>' '));
  274.     }
  275.  
  276.     /**
  277.      * return the current url engine
  278.      * @return jIUrlEngine 
  279.      * @internal call with true parameter, to force to re-instancy the engine. useful for test suite
  280.      */
  281.     static function getEngine($reset=false){
  282.         static $engine null;
  283.  
  284.         if($engine === null || $reset){
  285.             global $gJConfig;
  286.             $name $gJConfig->urlengine['engine'];
  287.             if!isset($gJConfig->_pluginsPathList_urls[$name])
  288.                 || !file_exists($gJConfig->_pluginsPathList_urls[$name]) ){
  289.                     throw new jException('jelix~errors.urls.engine.notfound'$name);
  290.             }
  291.             require_once($gJConfig->_pluginsPathList_urls[$name].$name.'.urls.php');
  292.  
  293.             $cl $name.'UrlEngine';
  294.             $engine new $cl();
  295.         }
  296.         return $engine;
  297.     }
  298. }

Documentation generated on Thu, 19 Sep 2013 00:07:51 +0200 by phpDocumentor 1.4.3