PageRenderTime 53ms CodeModel.GetById 21ms RepoModel.GetById 0ms app.codeStats 0ms

/core/helpers/url.php

http://rapyd-framework.googlecode.com/
PHP | 471 lines | 353 code | 85 blank | 33 comment | 58 complexity | ab8417f0828b600e75c9d6751e94bec0 MD5 | raw file
  1. <?php if (!defined('RAPYD_PATH')) exit('No direct script access allowed');
  2. class rpd_url_helper {
  3. public static $lang = '';
  4. //clause, and params expected i.e. for: orderby/{field}/{direction} ordeby need 2 params
  5. public static $semantic = array(
  6. 'search'=>1,
  7. 'reset'=>1,
  8. 'pag'=>1,
  9. 'orderby'=>2,
  10. 'show'=>1,
  11. 'create'=>1,
  12. 'modify'=>1,
  13. 'delete'=>1,
  14. 'insert'=>1,
  15. 'update'=>1,
  16. 'do_delete'=>1,
  17. 'process'=>1);
  18. public static function get_url() {
  19. if (isset($_SERVER['HTTP_X_ORIGINAL_URL'])) $_SERVER['REQUEST_URI'] = $_SERVER['HTTP_X_ORIGINAL_URL'];
  20. $url_string = (isset($_SERVER['REQUEST_URI'])) ? $_SERVER['REQUEST_URI'] : @getenv('REQUEST_URI');
  21. return $url_string;
  22. }
  23. // --------------------------------------------------------------------
  24. public static function get_uri($with_lang=true) {
  25. static $uri_string = '';
  26. if ($uri_string=='')
  27. {
  28. $uri_string = (isset($_SERVER['PATH_INFO'])) ? $_SERVER['PATH_INFO'] : @getenv('PATH_INFO');
  29. $uri_string = trim($uri_string,'/');
  30. }
  31. if (!$with_lang && rpd::get_lang('set')!='') $uri_string = ltrim(preg_replace('@^'.rpd::get_lang('set').'(\/.*)?$@i', '$2', $uri_string),'/');
  32. return $uri_string;
  33. }
  34. // --------------------------------------------------------------------
  35. public static function get_qs() {
  36. return $_SERVER['QUERY_STRING'];
  37. }
  38. // --------------------------------------------------------------------
  39. /**
  40. * take an 'application' URI (ie. controller/method/param)
  41. * and return a full URL (ie. http://host/rapydpath/[index.php]/controller/method/param)
  42. */
  43. public static function url($uri, $lang=null)
  44. {
  45. $language_seg = '';
  46. if (is_null($lang))
  47. $language_seg = rpd::get_lang('segment');
  48. elseif ($lang!='')
  49. $language_seg = $lang;
  50. if ($language_seg!='')
  51. $language_seg = rtrim($language_seg,'/').'/';
  52. if (rpd::get_lang('set')!='')
  53. $uri = ltrim(preg_replace('@^'.rpd::get_lang('set').'(\/.*)?$@i', '$2', $uri),'/');
  54. if (defined('CI_VERSION')) {
  55. $config = get_config();
  56. $base_url = $config['base_url'];
  57. $index_page = $config['index_page'];
  58. $language_seg = '';
  59. } else {
  60. $base_url = rpd::config('basename');
  61. $index_page = rpd::config('index_page');
  62. }
  63. if($base_url!='')
  64. $uri = preg_replace("#^".preg_quote(trim($base_url,'/').'/')."(.*)#",'\\1',$uri);
  65. if ($index_page!='')
  66. return rtrim($base_url,'/').'/'.$index_page.'/'.$language_seg.trim($uri,'/');
  67. else
  68. return rtrim($base_url,'/').'/'.$language_seg.trim($uri,'/');
  69. }
  70. /**
  71. *reverse or url(), return an application uri removing [http://host/path/index.php/]uri
  72. *
  73. */
  74. public static function uri($url, $as_array=false)
  75. {
  76. if (defined('CI_VERSION')) {
  77. $config = get_config();
  78. $base_url = $config['base_url'];
  79. $index_page = $config['index_page'];
  80. } else {
  81. $base_url = rpd::config('basename');
  82. $index_page = rpd::config('index_page');
  83. }
  84. $base_arr = parse_url(rtrim($base_url,'/').'/'.$index_page.'/');
  85. $url_arr = parse_url($url);
  86. $uri = ($base_arr['path'] != '/') ? trim(str_replace($base_arr['path'], '', $url_arr['path']), '/') : '';
  87. return ($as_array) ? explode("/",$uri) : $uri;
  88. }
  89. // --------------------------------------------------------------------
  90. public static function get_self() {
  91. $url = self::get_url();
  92. if (strpos($url, '?') === false) return $url;
  93. return substr($url, 0, strpos($url,'?'));
  94. }
  95. // --------------------------------------------------------------------
  96. //l'opposto di parse_str() in php non esiste come funziona nativa
  97. public static function unparse_str($array) {
  98. $query_string = '?';
  99. foreach($array as $key => $val) {
  100. if (is_array($val)) {
  101. foreach($val as $sub_key => $sub_val) {
  102. // Integer subkeys are numerically indexed arrays
  103. $sub_key = is_int($sub_key) ? '[]' : '['.$sub_key.']';
  104. $query_string .= $key.rawurlencode($sub_key).'='.rawurlencode($sub_val).'&';
  105. }
  106. }
  107. else {
  108. $query_string .= $key.'='.rawurlencode($val).'&';
  109. }
  110. }
  111. $query_string = rtrim($query_string, '&');
  112. return $query_string;
  113. }
  114. // --------------------------------------------------------------------
  115. public static function append($key, $value, $url=null) {
  116. return (rpd::config('url_method')=='uri') ? self::uri_append($key, $value, $url) : self::qs_append($key, $value, $url);
  117. }
  118. public static function remove($keys, $url=null, $params=null) {
  119. return (rpd::config('url_method')=='uri') ? self::uri_remove($keys, $url, $params) : self::qs_remove($keys, $url);
  120. }
  121. public static function remove_all($cid=null, $url=null) {
  122. return (rpd::config('url_method')=='uri') ? self::uri_remove_all($cid, $url) : self::qs_remove_all($cid, $url);
  123. }
  124. public static function replace($key, $newkey, $url=null) {
  125. return (rpd::config('url_method')=='uri') ? self::uri_replace($key, $newkey, $url) : self::qs_replace($key, $newkey, $url);
  126. }
  127. public static function value($key, $default=FALSE, $params=null) {
  128. return (rpd::config('url_method')=='uri') ? self::uri_value($key, $default, $params) : self::qs_value($key, $default);
  129. }
  130. // --------------------------------------------------------------------
  131. //vedere se ?¨ il caso di usare le rwrules per ovviare ai problemi con i namespace
  132. public static function qs_append($key, $value, $url=null) {
  133. $qs_array = array();
  134. $url = (isset($url)) ? $url : self::get_url();
  135. if (strpos($url, '?') !== false) {
  136. $qs = substr($url, strpos($url,'?')+1);
  137. $url = substr($url, 0, strpos($url,'?'));
  138. parse_str($qs, $qs_array);
  139. }
  140. $qs_array[$key] = $value;
  141. $query_string = self::unparse_str($qs_array);
  142. return ($url . $query_string);
  143. }
  144. // --------------------------------------------------------------------
  145. public static function qs_remove($keys, $url=null) {
  146. $qs_array = array();
  147. $url = (isset($url)) ? $url : self::get_url();
  148. if (strpos($url, '?') === false) return $url;
  149. $qs = substr($url, strpos($url,'?')+1);
  150. $url = substr($url, 0, strpos($url,'?'));
  151. parse_str($qs, $qs_array);
  152. if (!is_array($keys)) {
  153. if ($keys=='ALL')
  154. return $url;
  155. $keys = array($keys);
  156. }
  157. foreach ($keys as $key) {
  158. unset($qs_array[$key]);
  159. }
  160. $query_string = self::unparse_str($qs_array);
  161. return ($url . $query_string);
  162. }
  163. // --------------------------------------------------------------------
  164. public static function qs_remove_all($cid=null, $url=null) {
  165. $semantic = array( 'search', 'reset', 'checkbox',
  166. 'pag', 'orderby', 'show',
  167. 'create', 'modify', 'delete',
  168. 'insert', 'update', 'do_delete' );
  169. if (isset($cid)) {
  170. foreach ($semantic as $key) {
  171. $keys[] = $key.$cid;
  172. }
  173. $semantic = $keys;
  174. }
  175. return self::remove($semantic, $url);
  176. }
  177. // --------------------------------------------------------------------
  178. public static function qs_replace($key, $newkey, $url=null) {
  179. $qs_array = array();
  180. $url = (isset($url)) ? $url : self::get_url();
  181. if (strpos($url, '?') !== false) {
  182. $qs = substr($url, strpos($url,'?')+1);
  183. $url = substr($url, 0, strpos($url,'?'));
  184. parse_str($qs, $qs_array);
  185. }
  186. if (isset($qs_array[$key])) {
  187. $qs_array[$newkey] = $qs_array[$key];
  188. unset($qs_array[$key]);
  189. }
  190. $query_string = self::unparse_str($qs_array);
  191. return ($url . $query_string);
  192. }
  193. // --------------------------------------------------------------------
  194. public static function qs_value($key, $default=FALSE) {
  195. if (strpos($key,'|')) {
  196. $keys = explode('|',$key);
  197. foreach ($keys as $k) {
  198. $v = self::value($k, $default);
  199. if ($v != $default) return $v;
  200. }
  201. return $default;
  202. }
  203. if (strpos($key,'.')) {
  204. list($namespace, $subkey) = explode('.',$key);
  205. return (isset($_GET[$namespace][$subkey])) ? $_GET[$namespace][$subkey] : $default;
  206. }
  207. else {
  208. return (isset($_GET[$key])) ? $_GET[$key] : $default;
  209. }
  210. }
  211. // --------------------------------------------------------------------
  212. public static function uri_append($key, $value=null, $url=null) {
  213. $url = (isset($url)) ? $url : self::get_url();
  214. $seg_array = self::uri($url, true);
  215. $key_position = array_search($key,$seg_array);
  216. if ($key_position!==false) {
  217. array_splice($seg_array, $key_position,count((array)$value)+1, array_merge((array)$key, array_map('strval', (array)$value)));
  218. } else {
  219. $seg_array = array_merge($seg_array, array_merge((array)$key, array_map('strval', (array)$value)));
  220. }
  221. return self::url(implode('/',$seg_array));
  222. }
  223. // --------------------------------------------------------------------
  224. public static function uri_remove($keys, $url=null, $params=1) {
  225. $url = (isset($url)) ? $url : self::get_url();
  226. $seg_array = self::uri($url, true);
  227. if (!is_array($keys)) {
  228. //if ($keys=='ALL')
  229. // return $uri;
  230. $keys = array($keys);
  231. }
  232. foreach ($keys as $key) {
  233. $key_position = array_search($key,$seg_array);
  234. if ($key_position!==false) {
  235. $kkey = preg_replace('@\d*$@', '', $key);
  236. if (isset(self::$semantic[$kkey])) {
  237. array_splice($seg_array, $key_position,self::$semantic[$kkey]+1);
  238. } else {
  239. array_splice($seg_array, $key_position, $params+1);
  240. }
  241. }
  242. }
  243. return self::url(implode('/',$seg_array));
  244. }
  245. // --------------------------------------------------------------------
  246. public static function uri_remove_all($cid=null, $url=null) {
  247. $keys = array();
  248. if (isset($cid)) {
  249. foreach (self::$semantic as $key=>$params) {
  250. $keys[] = $key.$cid;
  251. }
  252. return self::uri_remove($keys, $url);
  253. } else {
  254. $url = (isset($url)) ? $url : self::get_url();
  255. foreach (self::$semantic as $key=>$params) {
  256. if (preg_match_all('@('.$key.'\d*)@', $url, $matches))
  257. foreach($matches[1] as $mkey)
  258. {
  259. $url = self::uri_remove($mkey, $url, self::$semantic[$key]+1);
  260. }
  261. }
  262. return $url;
  263. }
  264. }
  265. // --------------------------------------------------------------------
  266. public static function uri_replace($key, $newkey, $url=null) {
  267. $url = (isset($url)) ? $url : self::get_url();
  268. $seg_array = self::uri($url, true);
  269. $key_position = array_search($key,$seg_array);
  270. if ($key_position!==false) {
  271. array_splice($seg_array, $key_position,1, array($newkey));
  272. }
  273. return self::url(implode('/',$seg_array));
  274. }
  275. // --------------------------------------------------------------------
  276. public static function uri_value($key, $default=FALSE, $params=1) {
  277. $uri = self::get_uri();
  278. $seg_array = explode("/",trim($uri,'/'));
  279. if (strpos($key,'|')) {
  280. $keys = explode('|',$key);
  281. foreach ($keys as $k) {
  282. $v = self::uri_value($k, $default);
  283. if ($v != $default) return $v;
  284. }
  285. return $default;
  286. }
  287. //non mi ricordo l'utilit? .. forse nelle chiavi multiple (es. tabelle con pk a due campi)?
  288. if (strpos($key,'.')) {
  289. //...
  290. }
  291. else {
  292. $key_position = array_search($key,$seg_array);
  293. if ($key_position!==false) {
  294. if (isset($seg_array[$key_position+1])) {
  295. //..
  296. $skey = preg_replace("@([a-z]+)\d@", "\\1", $key);
  297. if (isset(self::$semantic[$skey])) {
  298. if (self::$semantic[$skey] == 0)
  299. return true;
  300. elseif(self::$semantic[$skey] < 2)
  301. return $seg_array[$key_position+1];
  302. else
  303. return array_slice($seg_array, $key_position+1, self::$semantic[$skey]);
  304. } else {
  305. if ($params == 0)
  306. return true;
  307. elseif($params < 2)
  308. return $seg_array[$key_position+1];
  309. else
  310. return array_slice($seg_array, $key_position+1, $params);
  311. }
  312. } else {
  313. return true;
  314. }
  315. }
  316. }
  317. return $default;
  318. }
  319. public static function redirect($url, $method = 'location', $http_response_code = 302)
  320. {
  321. if ( ! preg_match('#^https?://#i', $url))
  322. {
  323. $url = self::url($url);
  324. }
  325. switch($method)
  326. {
  327. case 'refresh' : header("Refresh:0;url=".$url);
  328. break;
  329. default : header("Location: ".$url, TRUE, $http_response_code);
  330. break;
  331. }
  332. exit;
  333. }
  334. public static function current_page($page, $output=null)
  335. {
  336. $is_current_page = false;
  337. $pages = (array)$page;
  338. foreach ($pages as $page)
  339. {
  340. if ($page == '')
  341. {
  342. $is_current_page = (self::get_uri()=='') ? true : false;
  343. break;
  344. } elseif (preg_match('#'.$page.'#',self::get_uri()))
  345. {
  346. $is_current_page = true;
  347. break;
  348. }
  349. }
  350. return (isset($output) && $is_current_page) ? $output : $is_current_page;
  351. }
  352. public static function url_title($str)
  353. {
  354. $utf8_dict = array(
  355. "\xC3\x80" => "A", "\xC3\x81" => "A", "\xC3\x82" => "A", "\xC3\x83" => "A", "\xC3\x84" => "A",
  356. "\xC3\x85" => "A", "\xC3\x86" => "A", "\xC3\x9E" => "B", "\xC3\x87" => "C", "\xC4\x86" => "C",
  357. "\xC4\x8C" => "C", "\xC4\x90" => "Dj", "\xC3\x88" => "E", "\xC3\x89" => "E", "\xC3\x8A" => "E",
  358. "\xC3\x8B" => "E", "\xC4\x9E" => "G", "\xC3\x8C" => "I", "\xC3\x8D" => "I", "\xC3\x8E" => "I",
  359. "\xC3\x8F" => "I", "\xC4\xB0" => "I", "\xC3\x91" => "N", "\xC3\x92" => "O", "\xC3\x93" => "O",
  360. "\xC3\x94" => "O", "\xC3\x95" => "O", "\xC3\x96" => "O", "\xC3\x98" => "O", "\xC3\x9F" => "Ss",
  361. "\xC3\x99" => "U", "\xC3\x9A" => "U", "\xC3\x9B" => "U", "\xC3\x9C" => "U", "\xC3\x9D" => "Y",
  362. "\xC3\xA0" => "a", "\xC3\xA1" => "a", "\xC3\xA2" => "a", "\xC3\xA3" => "a", "\xC3\xA4" => "a",
  363. "\xC3\xA5" => "a", "\xC3\xA6" => "a", "\xC3\xBE" => "b", "\xC3\xA7" => "c", "\xC4\x87" => "c",
  364. "\xC4\x8D" => "c", "\xC4\x91" => "dj","\xC3\xA8" => "e", "\xC3\xA9" => "e", "\xC3\xAA" => "e",
  365. "\xC3\xAB" => "e", "\xC3\xAC" => "i", "\xC3\xAD" => "i", "\xC3\xAE" => "i", "\xC3\xAF" => "i",
  366. "\xC3\xB0" => "o", "\xC3\xB1" => "n", "\xC3\xB2" => "o", "\xC3\xB3" => "o", "\xC3\xB4" => "o",
  367. "\xC3\xB5" => "o", "\xC3\xB6" => "o", "\xC3\xB8" => "o", "\xC5\x94" => "R", "\xC5\x95" => "r",
  368. "\xC5\xA0" => "S", "\xC5\x9E" => "S", "\xC5\xA1" => "s", "\xC3\xB9" => "u", "\xC3\xBA" => "u",
  369. "\xC3\xBB" => "u", "\xC3\xBC" => "ue","\xC3\xBD" => "y", "\xC3\xBD" => "y", "\xC3\xBF" => "y",
  370. "\xC5\xBD" => "Z", "\xC5\xBE" => "z");
  371. $str = strtr($str, $utf8_dict);
  372. $str = strtolower(utf8_decode($str));
  373. return preg_replace(array('/[^a-z0-9\s]/', '/[\s]+/'), array('', '-'), $str);
  374. }
  375. public static function deurl_title($str)
  376. {
  377. $trans = array(
  378. '-' => ' ',
  379. '_' => ' ',
  380. );
  381. foreach ($trans as $key => $val)
  382. $str = preg_replace("#".$key."#i", $val, $str);
  383. $str = ucfirst($str);
  384. return $str;
  385. }
  386. }