PageRenderTime 54ms CodeModel.GetById 27ms RepoModel.GetById 1ms app.codeStats 0ms

/sample/core/classes/Link.php

https://github.com/caferrari/vortice_book
PHP | 232 lines | 144 code | 25 blank | 63 comment | 45 complexity | 3cde19e77efee4fee5d3d359bc70f4b0 MD5 | raw file
Possible License(s): BSD-3-Clause
  1. <?php
  2. /*
  3. * Copyright (c) 2008, Carlos André Ferrari <[carlos@]ferrari.eti.br>; Luan Almeida <[luan@]luan.eti.br>
  4. * All rights reserved.
  5. */
  6. /**
  7. * Link class, Work with uri encode and decode
  8. *
  9. * @version 1
  10. * @package Framework
  11. * @author Carlos André Ferrari <carlos@ferrari.eti.br>
  12. */
  13. class Link{
  14. /**
  15. * Temporary link encoded
  16. *
  17. * @var string
  18. * @access private
  19. */
  20. private $el = '';
  21. /**
  22. * Constructor, Create a URI
  23. *
  24. * @param string $page format: [model][+controller:[action]]
  25. * @param string $pars link params
  26. * @return void
  27. */
  28. function __construct($page='', $pars=''){
  29. $this->el = $this->createLink($page, $pars);
  30. }
  31. /**
  32. * Encode a link
  33. *
  34. * @param array $url array with url data
  35. * @return string
  36. * @static
  37. */
  38. static function default_encode($url){
  39. $url = unserialize($url);
  40. $page = $url['url'];
  41. $page = explode(':', $page);
  42. $pars = '';
  43. switch (count($page)){
  44. case 3:
  45. if ($page[1]==='') $page[1] = default_controller;
  46. break;
  47. case 2:
  48. if ($page[1]==='') $page[1] = '';
  49. break;
  50. }
  51. $page = implode($page, '/');
  52. if (isset($url->pars)){
  53. $pars = http_build_query($url['pars']);
  54. $pars = str_replace('=', ':', $pars);
  55. $pars = str_replace('&', '/', $pars);
  56. }
  57. $l = $page . '/' . $pars . '/';
  58. return preg_replace('@\/+@', '/', $l);
  59. }
  60. /**
  61. * Decode a link
  62. *
  63. * @param string $url encoded uri
  64. * @return string
  65. * @static
  66. */
  67. static function default_decode($url){
  68. $pars = array();
  69. $page = array();
  70. $partes = explode('/', $url);
  71. foreach ($partes as $p)
  72. if (preg_match('@.*:.*@', $p)){
  73. $p = explode(':', $p);
  74. $pars[$p[0]] = $p[1];
  75. }else
  76. $page[] = $p;
  77. $page = implode($page, ':');
  78. $json = serialize(array('url' => $page, 'pars' => $pars));
  79. return $json;
  80. }
  81. /**
  82. * Create a URI
  83. *
  84. * @param string $page [model][+controller+[action]]
  85. * @param string $pars link params
  86. * @return string
  87. * @static
  88. */
  89. static function createLink($page='', $pars=''){
  90. if (!preg_match('@^([a-z\-]+)(:[a-z\-]+)?$@', $page))
  91. return preg_replace('@\/+@', '/', virtualroot . ((request_lang !== default_lang) ? request_lang : '') . '/' . $page . '/');
  92. $page = explode(':', $page);
  93. if (count($page) === 2){
  94. if ($page[0] === default_controller && $page[1]===default_action) $page=array();
  95. else if ($page[1] === default_action) unset($page[1]);
  96. }else{
  97. if ($page[0] === default_controller) $page = array();
  98. }
  99. $page = array_values($page);
  100. parse_str(is_array($pars) ? http_build_query($pars) : $pars, $p);
  101. if (count($page) === 0 || $page[0] === '') $page='';
  102. else $page = implode(':', $page);
  103. $url = $pars ? serialize(array('url' => $page, 'pars' => $p)) : serialize(array('url' => $page));
  104. $link = (function_exists('link_encode')) ? link_encode($url) : Link::default_encode($url);
  105. if (request_lang != default_lang)
  106. return virtualroot . request_lang . '/' . $link;
  107. return virtualroot . $link;
  108. }
  109. /**
  110. * Translate the requested URI, check for internationalization request and create the uri constant
  111. *
  112. * @return void
  113. * @static
  114. */
  115. static function translateUri(){
  116. $q = $_SERVER['REQUEST_URI'];
  117. if (!ajax && !post && !preg_match('@\/$@', $q)){
  118. header ('HTTP/1.1 301 Moved Permanently');
  119. header ('Location: ' . $q . '/');
  120. exit();
  121. }
  122. if (virtualroot !== '/') $q = preg_replace('/^'.addcslashes(virtualroot, '/').'/', '', $q);
  123. $q = preg_replace('@^\/|\/$@', '', $q);
  124. $tmp = explode('/', $q);
  125. if ($tmp[0] !== ''){
  126. if (preg_match('@^([a-z]{2}|[a-z]{2}-[a-z]{2})$@', $tmp[0]) && !file_exists(root . 'app/controller/' . ucfirst($tmp[0]).'Controller.php') && !is_dir(root . 'app/modules/' . $tmp[0])){
  127. define('request_lang', $tmp[0]);
  128. unset($tmp[0]);
  129. $q = implode('/', $tmp);
  130. if (request_lang==default_lang){
  131. header('Location: ' . virtualroot . $q , true);
  132. exit();
  133. }
  134. }else $q = implode('/', $tmp);
  135. }
  136. define('uri', urldecode($q));
  137. if (!defined('request_lang')) define('request_lang', default_lang);
  138. }
  139. /**
  140. * Convert the requested uri to global constants (module, controller, action) and usefull parameters
  141. *
  142. * @return void
  143. * @static
  144. */
  145. static function parseQuery(){
  146. global $_PAR;
  147. $q = uri;
  148. $route = Route::exec();
  149. if ($route) $q = $route;
  150. else{
  151. if (function_exists('link_decode'))
  152. try {
  153. $q = unserialize(link_decode($q));
  154. }catch (Exception $e){
  155. throw new BaseException('Invalid URL', 'URL checksum failed!', '400');
  156. }
  157. else
  158. $q = unserialize(Link::default_decode($q));
  159. }
  160. $controller = $action = '';
  161. $q['url'] = isset($q['url']) ? $q['url'] : '';
  162. if (isset($q['pars'])) $_PAR = (array)$q['pars'];
  163. if ($q['url'] !== ''){
  164. $url = explode(':', $q['url']);
  165. if (count($url)==2){
  166. $controller = $url[0];
  167. $action = $url[1];
  168. }else
  169. if ($url[0]{0} === '.') $action = $url[0];
  170. else $controller = $url[0];
  171. }
  172. $tmp = explode('.', $action);
  173. if (count($tmp) > 1){
  174. $action = ($tmp[0] === '') ? '' : $tmp[0];
  175. Vortice::setRenderMode($tmp[1]);
  176. }else{
  177. $action = $tmp[0];
  178. $tmp = explode('.', $controller);
  179. if (count($tmp) > 1){
  180. $controller = ($tmp[0] === '') ? '' : $tmp[0];
  181. Vortice::setRenderMode($tmp[1]);
  182. }else $controller = $tmp[0];
  183. }
  184. if (!routed && Vortice::$rendermode==='html'){
  185. if ($controller===default_controller && ($action===default_action || $action==='')){
  186. header('Location: ' . new Link(default_controller . ':' . default_action, $_PAR), true, 301);
  187. exit();
  188. }
  189. if ($controller!==default_controller && $action===default_action){
  190. header('Location: ' . new Link($controller . ':' . default_action, $_PAR), true, 301);
  191. exit();
  192. }
  193. }
  194. if ($action==='') $action = default_action;
  195. if ($controller==='') $controller = default_controller;
  196. define ('controller', $controller);
  197. define ('action', $action);
  198. }
  199. /**
  200. * Return the encoded uri.
  201. *
  202. * @return string
  203. */
  204. public function __toString(){
  205. return $this->el;
  206. }
  207. }