2 /********************************************************************
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 ********************************************************************/
27 * Parsowanie URL-i etc.
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
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)
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)
109 // pobieramy dane o URL-u
111 $URL = (isset($_SERVER['PATH_INFO']) ?
$_SERVER['PATH_INFO'] : @getenv
('PATH_INFO'));
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)
120 foreach(str_split($segment) as $char)
122 $char = ord($char); // char -> int
124 // pozwalam tylko na znaki takie jak:
128 if($char >= 48 && $char <= 57)
130 $segment2 .= chr($char);
135 if($char >= 65 && $char <= 90)
137 $segment2 .= chr($char);
142 if($char >= 97 && $char <= 122)
144 $segment2 .= chr($char);
151 $segment2 .= chr($char);
158 $segment2 .= chr($char);
165 $segment2 .= chr($char);
172 $segment2 .= chr($char);
176 // jeśli ktoś zrobił wielokrotne slashe, wywalamy pusty segment
177 if(!empty($segment2))
184 // czyszczenie nazwy kontrolera
185 // (jeśli brak nazwy kontrolera, ustaw na domyślną)
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);
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:
210 if($char >= 97 && $char <= 122)
212 $seg_n .= chr($char);
217 if($char >= 48 && $char <= 57)
219 $seg_n .= chr($char);
226 $seg_n .= chr($char);
233 $seg_n .= chr($char);
241 // jeśli nie podano nazwy kontrolera, ustaw na domyślną
246 // czyszczenie nazwy funkcji składowej/metody kontrolera
247 // (jeśli brak, ustaw na index)
251 $seg = strtolower($URL2[1]);
252 $seg = str_split($seg);
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:
266 if($char >= 97 && $char <= 122)
268 $seg_n .= chr($char);
273 if($char >= 48 && $char <= 57)
275 $seg_n .= chr($char);
282 $seg_n .= chr($char);
286 // niestety nie da się stworzyć metody o nazwie new :/
297 // jeśli nie podano nazwy funkcji składowej/metody kontrolera
298 // ustaw na index (domyślna funkcja składowa)
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)
311 $URL2 = array_splice($URL2, -(count($URL2) - 2));
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];
357 * public int segments()
359 * Zwraca ilość segmentów
363 public function segments()
365 return count(self
::$segments);