kolejna partia drobniejszych zmian (wciąż możliwe, że zacommitowany watermelon nie...
[watermeloncms.git] / wtrmln / libs / url.php
blob08b825a63fb9055e22bb01609f85c03b2e7e524b
1 <?php
2 /********************************************************************
4 Watermelon CMS
6 Copyright 2008 Radosław Pietruszewski
8 This program is free software; you can redistribute it and/or
9 modify it under the terms of the GNU General Public License
10 version 2 as published by the Free Software Foundation.
12 This program is distributed in the hope that it will be useful,
13 but WITHOUT ANY WARRANTY; without even the implied warranty of
14 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 GNU General Public License for more details.
17 You should have received a copy of the GNU General Public License
18 along with this program; if not, write to the Free Software
19 Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
21 ********************************************************************/
24 * Lib URL
25 * wersja 1.8.1
27 * Parsowanie URL-i etc.
31 class URL
34 * public static string[] $segments
36 * segmenty URL-a (np. foo/bar == array('foo', 'bar'))
38 * $segments = array($segment[, $segment[, ... ]])
39 * $segment - pojedynczy segment
41 public static $segments = array();
44 * public static string $class
46 * nazwa kontrolera do wykonania
49 static public $class = '';
52 * public static string $method
54 * nazwa funkcji składowej (metody) kontrolera do wykonania
57 public static $method = '';
60 * private static bool $inited
62 * true, jeśli biblioteka została już zainicjalizowana
63 * false, jeśli nie
66 private static $inited = false;
69 * public static bool $onesegment = false
71 * true, jeśli w URL-u jest tylko jeden segment
72 * false, jeśli w URL-u jest więcej niż jeden segment
75 public static $onesegment = false;
78 * public void URL(string $default)
80 * Konstruktor. Inicjalizuje bibliotekę uzupełniając pole 'segments'
81 * Zwraca false jeśli już była wcześniej zainicjalizowana
82 * Wywala błąd krytyczny, jeśli nie podano argumentu $default
83 * i nie była jeszcze zainicjalizowana.
85 * string $default - nazwa domyślnego kontrolera
89 public function URL($default = null)
91 // jeśli klasa została już zainicjalizowana, nie kontynuujemy działania
92 // tej funkcji składowej
94 if(self::$inited === true)
96 return false;
99 // żeby klasa mogła funkcjonować poprawnie, nie można pozwolić na
100 // nie podanie domyślnego kontrolera. Tutaj musi być to zrobione "ręcznie"
101 // dlatego, że funkcja jest (jako konstruktor) wykonywana wielokrotnie w
102 // kodzie, już po inicjalizacji biblioteki.
104 if($default === null)
106 panic('Lib URL: 0');
109 // pobieramy dane o URL-u
111 $URL = (isset($_SERVER['PATH_INFO']) ? $_SERVER['PATH_INFO'] : @getenv('PATH_INFO'));
112 $URL2 = array();
114 // parsujemy segmenty URL-a (ze względów bezpieczeństwa pozwalam
115 // tylko na znaki 0-9A-Za-z+-._)
117 foreach(explode('/', $URL) as $segment)
119 $segment2 = '';
120 foreach(str_split($segment) as $char)
122 $char = ord($char); // char -> int
124 // pozwalam tylko na znaki takie jak:
126 // cyfry
128 if($char >= 48 && $char <= 57)
130 $segment2 .= chr($char);
133 // duże litery
135 if($char >= 65 && $char <= 90)
137 $segment2 .= chr($char);
140 // małe litery
142 if($char >= 97 && $char <= 122)
144 $segment2 .= chr($char);
147 // plus (+)
149 if($char == 43)
151 $segment2 .= chr($char);
154 // minus (-)
156 if($char == 45)
158 $segment2 .= chr($char);
161 // kropka (.)
163 if($char == 46)
165 $segment2 .= chr($char);
168 // podkreślenie (_)
170 if($char == 95)
172 $segment2 .= chr($char);
176 // jeśli ktoś zrobił wielokrotne slashe, wywalamy pusty segment
177 if(!empty($segment2))
179 $URL2[] = $segment2;
184 // czyszczenie nazwy kontrolera
185 // (jeśli brak nazwy kontrolera, ustaw na domyślną)
188 if(isset($URL2[0]))
190 // czyszczenie segmentu z potencjalnie niebezpiecznego syfu
191 // (nawet nie chodzi o bezpieczeństwo, ale wiadomo, że
192 // kontroler o nazwie Foo.bar nie ma prawa istnieć
193 // ze względu na ograniczenia nazewnictwa w PHP)
195 $seg = strtolower($URL2[0]);
196 $seg = str_split($seg);
197 $seg_n = '';
199 // parsujemy nazwę kontrolera (ze względów bezpieczeństwa pozwalam
200 // tylko na znaki 0-9A-Za-z_)
202 foreach($seg as $char)
204 $char = ord($char); //char -> int
206 // pozwalam tylko na znaki takie jak:
208 // litery
210 if($char >= 97 && $char <= 122)
212 $seg_n .= chr($char);
215 // cyfry
217 if($char >= 48 && $char <= 57)
219 $seg_n .= chr($char);
222 // podkreślenie (_)
224 if($char == 95)
226 $seg_n .= chr($char);
229 // myślnik (-)
231 if($char == 45)
233 $seg_n .= chr($char);
237 $t[0] = $seg_n;
239 else
241 // jeśli nie podano nazwy kontrolera, ustaw na domyślną
243 $t[0] = $default;
246 // czyszczenie nazwy funkcji składowej/metody kontrolera
247 // (jeśli brak, ustaw na index)
249 if(isset($URL2[1]))
251 $seg = strtolower($URL2[1]);
252 $seg = str_split($seg);
253 $seg_n = '';
255 // parsujemy nazwę kontrolera (ze względów bezpieczeństwa pozwalam
256 // tylko na znaki 0-9A-Za-z_)
258 foreach($seg as $char)
260 $char = ord($char); //char -> int
262 // pozwalam tylko na znaki takie jak:
264 // litery
266 if($char >= 97 && $char <= 122)
268 $seg_n .= chr($char);
271 // cyfry
273 if($char >= 48 && $char <= 57)
275 $seg_n .= chr($char);
278 // podkreślenie (_)
280 if($char == 95)
282 $seg_n .= chr($char);
286 // niestety nie da się stworzyć metody o nazwie new :/
288 if($seg_n == 'new')
290 $seg_n = '_new';
293 $t[1] = $seg_n;
295 else
297 // jeśli nie podano nazwy funkcji składowej/metody kontrolera
298 // ustaw na index (domyślna funkcja składowa)
300 $t[1] = 'index';
302 self::$onesegment = true;
305 // usuń dwa pierwsze segmenty (kontroler i jego funkcja składowa)
306 // jeśli są tylko dwa segmenty lub mniej, oczyść tablicę
307 // (wychodzi na to samo, ale PHP nie wywala błędu)
309 if(count($URL2) > 2)
311 $URL2 = array_splice($URL2, -(count($URL2) - 2));
313 else
315 $URL2 = array();
318 // złączenie tablic - tej z oczyszczonymi lub domyślnymi nazwami kontrolera
319 // i funkcji składowej/metody kontrolera z tą tablicą, która ma pozostałe
320 // segmenty (lub nie ma, jeśli nie podano)
322 $URL2 = array_merge($t, $URL2);
324 // nadanie odpowiednich wartości
326 self::$segments = $URL2;
327 self::$class = self::$segments[0];
328 self::$method = self::$segments[1];
329 self::$inited = true;
333 * public string segment(int $ID)
335 * Zwraca treść danego [$ID] segmentu.
336 * Segmenty są liczone od jeden
337 * (a nie od zera, jak to jest w PHP-owskich tablicach)
339 * Zwraca false w przypadku niepowodzenia
340 * (tj. jeśli żądany segment nie istnieje)
344 public function segment($ID)
346 if(isset(self::$segments[$ID - 1]))
348 return self::$segments[$ID - 1];
350 else
352 return false;
357 * public int segments()
359 * Zwraca ilość segmentów
363 public function segments()
365 return count(self::$segments);