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 * public static string $message
62 * nazwa wiadomości do wykonania (gdy pusta: null)
65 public static $message = null;
68 * private static bool $inited
70 * true, jeśli biblioteka została już zainicjalizowana
74 private static $inited = false;
77 * public static bool $onesegment = false
79 * true, jeśli w URL-u jest tylko jeden segment
80 * false, jeśli w URL-u jest więcej niż jeden segment
83 public static $onesegment = false;
86 * public void URL(string $default)
88 * Konstruktor. Inicjalizuje bibliotekę uzupełniając pole 'segments'
89 * Zwraca false jeśli już była wcześniej zainicjalizowana
90 * Wywala błąd krytyczny, jeśli nie podano argumentu $default
91 * i nie była jeszcze zainicjalizowana.
93 * string $default - nazwa domyślnego kontrolera
97 public function URL($default = null)
99 // jeśli klasa została już zainicjalizowana, nie kontynuujemy działania
100 // tej funkcji składowej
102 if(self
::$inited === true)
107 // żeby klasa mogła funkcjonować poprawnie, nie można pozwolić na
108 // nie podanie domyślnego kontrolera. Tutaj musi być to zrobione "ręcznie"
109 // dlatego, że funkcja jest (jako konstruktor) wykonywana wielokrotnie w
110 // kodzie, już po inicjalizacji biblioteki.
112 if($default === null)
117 // pobieramy dane o URL-u
119 $URL = (isset($_SERVER['PATH_INFO']) ?
$_SERVER['PATH_INFO'] : @getenv
('PATH_INFO'));
122 // parsujemy segmenty URL-a (ze względów bezpieczeństwa pozwalam
123 // tylko na znaki 0-9A-Za-z+-._)
125 foreach(explode('/', $URL) as $segment)
128 foreach(str_split($segment) as $char)
130 $char = ord($char); // char -> int
132 // pozwalam tylko na znaki takie jak:
136 if($char >= 48 && $char <= 57)
138 $segment2 .= chr($char);
143 if($char >= 65 && $char <= 90)
145 $segment2 .= chr($char);
150 if($char >= 97 && $char <= 122)
152 $segment2 .= chr($char);
159 $segment2 .= chr($char);
166 $segment2 .= chr($char);
173 $segment2 .= chr($char);
180 $segment2 .= chr($char);
187 $segment2 .= chr($char);
191 // jeśli ktoś zrobił wielokrotne slashe, wywalamy pusty segment
192 if(!empty($segment2))
198 // sprawdzamy czy jest ustawiona wiadomość
202 if(substr($URL2[0], 0, 4) == 'msg:')
204 $message = substr($URL2[0], 4);
207 $seg = strtolower($message);
208 $seg = str_split($seg);
211 // filtruję nazwę (zostawiam tylko litery i znaki podkreślenia
213 foreach($seg as $char)
217 if($char >= 97 && $char <= 122)
219 $seg_n .= chr($char);
224 $seg_n .= chr($char);
228 self
::$message = $seg_n;
232 // czyszczenie nazwy kontrolera
233 // (jeśli brak nazwy kontrolera, ustaw na domyślną)
238 // czyszczenie segmentu z potencjalnie niebezpiecznego syfu
239 // (nawet nie chodzi o bezpieczeństwo, ale wiadomo, że
240 // kontroler o nazwie Foo.bar nie ma prawa istnieć
241 // ze względu na ograniczenia nazewnictwa w PHP)
243 $seg = strtolower($URL2[0]);
244 $seg = str_split($seg);
247 // parsujemy nazwę kontrolera (ze względów bezpieczeństwa pozwalam
248 // tylko na znaki 0-9A-Za-z_)
250 foreach($seg as $char)
252 $char = ord($char); //char -> int
254 // pozwalam tylko na znaki takie jak:
258 if($char >= 97 && $char <= 122)
260 $seg_n .= chr($char);
265 if($char >= 48 && $char <= 57)
267 $seg_n .= chr($char);
274 $seg_n .= chr($char);
281 $seg_n .= chr($char);
289 // jeśli nie podano nazwy kontrolera, ustaw na domyślną
294 // czyszczenie nazwy funkcji składowej/metody kontrolera
295 // (jeśli brak, ustaw na index)
299 $seg = strtolower($URL2[1]);
300 $seg = str_split($seg);
303 // parsujemy nazwę kontrolera (ze względów bezpieczeństwa pozwalam
304 // tylko na znaki 0-9A-Za-z_)
306 foreach($seg as $char)
308 $char = ord($char); //char -> int
310 // pozwalam tylko na znaki takie jak:
314 if($char >= 97 && $char <= 122)
316 $seg_n .= chr($char);
321 if($char >= 48 && $char <= 57)
323 $seg_n .= chr($char);
330 $seg_n .= chr($char);
334 // niestety nie da się stworzyć metody o nazwie new :/
345 // jeśli nie podano nazwy funkcji składowej/metody kontrolera
346 // ustaw na index (domyślna funkcja składowa)
350 self
::$onesegment = true;
353 // usuń dwa pierwsze segmenty (kontroler i jego funkcja składowa)
354 // jeśli są tylko dwa segmenty lub mniej, oczyść tablicę
355 // (wychodzi na to samo, ale PHP nie wywala błędu)
359 $URL2 = array_splice($URL2, -(count($URL2) - 2));
366 // złączenie tablic - tej z oczyszczonymi lub domyślnymi nazwami kontrolera
367 // i funkcji składowej/metody kontrolera z tą tablicą, która ma pozostałe
368 // segmenty (lub nie ma, jeśli nie podano)
370 $URL2 = array_merge($t, $URL2);
372 // nadanie odpowiednich wartości
374 self
::$segments = $URL2;
375 self
::$class = self
::$segments[0];
376 self
::$method = self
::$segments[1];
377 self
::$inited = true;
381 * public string segment(int $ID)
383 * Zwraca treść danego [$ID] segmentu.
384 * Segmenty są liczone od jeden
385 * (a nie od zera, jak to jest w PHP-owskich tablicach)
387 * Zwraca false w przypadku niepowodzenia
388 * (tj. jeśli żądany segment nie istnieje)
392 public function segment($ID)
394 if(isset(self
::$segments[$ID - 1]))
396 return self
::$segments[$ID - 1];
405 * public int segments()
407 * Zwraca ilość segmentów
411 public function segments()
413 return count(self
::$segments);