Url.php 3.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140
  1. <?php
  2. /**
  3. * The Minz_Url class handles URLs across the MINZ framework
  4. */
  5. class Minz_Url {
  6. /**
  7. * Display a formatted URL
  8. * @param string|array<string,string|array<string,mixed>> $url The URL to format, defined as an array:
  9. * $url['c'] = controller
  10. * $url['a'] = action
  11. * $url['params'] = array of additional parameters
  12. * or as a string
  13. * @param string $encoding how to encode & (& ou &amp; pour html)
  14. * @param bool|string $absolute
  15. * @return string Formatted URL
  16. */
  17. public static function display ($url = array (), $encoding = 'html', $absolute = false) {
  18. $isArray = is_array($url);
  19. if ($isArray) {
  20. $url = self::checkUrl($url);
  21. }
  22. $url_string = '';
  23. if ($absolute) {
  24. $url_string = Minz_Request::getBaseUrl();
  25. if (strlen($url_string) < strlen('http://a.bc')) {
  26. $url_string = Minz_Request::guessBaseUrl();
  27. if (PUBLIC_RELATIVE === '..') {
  28. //TODO: Implement proper resolver of relative parts such as /test/./../
  29. $url_string = dirname($url_string);
  30. }
  31. }
  32. if ($isArray) {
  33. $url_string .= PUBLIC_TO_INDEX_PATH;
  34. }
  35. if ($absolute === 'root') {
  36. $url_string = parse_url($url_string, PHP_URL_PATH);
  37. }
  38. } else {
  39. $url_string = $isArray ? '.' : PUBLIC_RELATIVE;
  40. }
  41. if ($isArray) {
  42. $url_string .= '/' . self::printUri($url, $encoding);
  43. } elseif ($encoding === 'html') {
  44. $url_string = Minz_Helper::htmlspecialchars_utf8($url_string . $url);
  45. } else {
  46. $url_string .= $url;
  47. }
  48. return $url_string;
  49. }
  50. /**
  51. * Construit l'URI d'une URL
  52. * @param array<string,mixed> $url l'url sous forme de tableau
  53. * @param string $encodage pour indiquer comment encoder les & (& ou &amp; pour html)
  54. * @return string uri sous la forme ?key=value&key2=value2
  55. */
  56. private static function printUri($url, $encodage) {
  57. $uri = '';
  58. $separator = '?';
  59. if ($encodage === 'html') {
  60. $and = '&amp;';
  61. } else {
  62. $and = '&';
  63. }
  64. if (isset($url['c'])
  65. && $url['c'] != Minz_Request::defaultControllerName()) {
  66. $uri .= $separator . 'c=' . $url['c'];
  67. $separator = $and;
  68. }
  69. if (isset($url['a'])
  70. && $url['a'] != Minz_Request::defaultActionName()) {
  71. $uri .= $separator . 'a=' . $url['a'];
  72. $separator = $and;
  73. }
  74. if (isset($url['params'])) {
  75. unset($url['params']['c']);
  76. unset($url['params']['a']);
  77. foreach ($url['params'] as $key => $param) {
  78. $uri .= $separator . urlencode($key) . '=' . urlencode($param);
  79. $separator = $and;
  80. }
  81. }
  82. return $uri;
  83. }
  84. /**
  85. * Vérifie que les éléments du tableau représentant une url soit ok
  86. * @param array<string,array<string,string>> $url sous forme de tableau
  87. * @return array<string,array<string,string>> url vérifié
  88. */
  89. public static function checkUrl ($url) {
  90. $url_checked = $url;
  91. if (is_array ($url)) {
  92. if (!isset ($url['c'])) {
  93. $url_checked['c'] = Minz_Request::defaultControllerName ();
  94. }
  95. if (!isset ($url['a'])) {
  96. $url_checked['a'] = Minz_Request::defaultActionName ();
  97. }
  98. if (!isset ($url['params'])) {
  99. $url_checked['params'] = array ();
  100. }
  101. }
  102. return $url_checked;
  103. }
  104. }
  105. /**
  106. * @param string $controller
  107. * @param string $action
  108. * @param string ...$args
  109. */
  110. function _url ($controller, $action, ...$args) {
  111. $nb_args = count($args);
  112. if ($nb_args % 2 !== 0) {
  113. return false;
  114. }
  115. $params = array ();
  116. for ($i = 0; $i < $nb_args; $i += 2) {
  117. $arg = $args[$i];
  118. $params[$arg] = $args[$i + 1];
  119. }
  120. return Minz_Url::display (array ('c' => $controller, 'a' => $action, 'params' => $params));
  121. }