obsługa wiadomości w class URL
[watermeloncms.git] / wtrmln / libs / url.php
blobb683e9112c4b4e89a09eb291b18a3ce184bea93d
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.5
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 * 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
71 * false, jeśli nie
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)
104 return false;
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)
114 panic('Lib URL: 0');
117 // pobieramy dane o URL-u
119 $URL = (isset($_SERVER['PATH_INFO']) ? $_SERVER['PATH_INFO'] : @getenv('PATH_INFO'));
120 $URL2 = array();
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)
127 $segment2 = '';
128 foreach(str_split($segment) as $char)
130 $char = ord($char); // char -> int
132 // pozwalam tylko na znaki takie jak:
134 // cyfry
136 if($char >= 48 && $char <= 57)
138 $segment2 .= chr($char);
141 // duże litery
143 if($char >= 65 && $char <= 90)
145 $segment2 .= chr($char);
148 // małe litery
150 if($char >= 97 && $char <= 122)
152 $segment2 .= chr($char);
155 // plus (+)
157 if($char == 43)
159 $segment2 .= chr($char);
162 // minus (-)
164 if($char == 45)
166 $segment2 .= chr($char);
169 // kropka (.)
171 if($char == 46)
173 $segment2 .= chr($char);
176 // dwukropek (:)
178 if($char == 58)
180 $segment2 .= chr($char);
183 // podkreślenie (_)
185 if($char == 95)
187 $segment2 .= chr($char);
191 // jeśli ktoś zrobił wielokrotne slashe, wywalamy pusty segment
192 if(!empty($segment2))
194 $URL2[] = $segment2;
198 // sprawdzamy czy jest ustawiona wiadomość
200 if(isset($URL2[0]))
202 if(substr($URL2[0], 0, 4) == 'msg:')
204 $message = substr($URL2[0], 4);
205 array_shift($URL2);
207 $seg = strtolower($message);
208 $seg = str_split($seg);
209 $seg_n = '';
211 // filtruję nazwę (zostawiam tylko litery i znaki podkreślenia
213 foreach($seg as $char)
215 $char = ord($char);
217 if($char >= 97 && $char <= 122)
219 $seg_n .= chr($char);
222 if($char == 95)
224 $seg_n .= chr($char);
228 self::$message = $seg_n;
232 // czyszczenie nazwy kontrolera
233 // (jeśli brak nazwy kontrolera, ustaw na domyślną)
236 if(isset($URL2[0]))
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);
245 $seg_n = '';
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:
256 // litery
258 if($char >= 97 && $char <= 122)
260 $seg_n .= chr($char);
263 // cyfry
265 if($char >= 48 && $char <= 57)
267 $seg_n .= chr($char);
270 // podkreślenie (_)
272 if($char == 95)
274 $seg_n .= chr($char);
277 // myślnik (-)
279 if($char == 45)
281 $seg_n .= chr($char);
285 $t[0] = $seg_n;
287 else
289 // jeśli nie podano nazwy kontrolera, ustaw na domyślną
291 $t[0] = $default;
294 // czyszczenie nazwy funkcji składowej/metody kontrolera
295 // (jeśli brak, ustaw na index)
297 if(isset($URL2[1]))
299 $seg = strtolower($URL2[1]);
300 $seg = str_split($seg);
301 $seg_n = '';
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:
312 // litery
314 if($char >= 97 && $char <= 122)
316 $seg_n .= chr($char);
319 // cyfry
321 if($char >= 48 && $char <= 57)
323 $seg_n .= chr($char);
326 // podkreślenie (_)
328 if($char == 95)
330 $seg_n .= chr($char);
334 // niestety nie da się stworzyć metody o nazwie new :/
336 if($seg_n == 'new')
338 $seg_n = '_new';
341 $t[1] = $seg_n;
343 else
345 // jeśli nie podano nazwy funkcji składowej/metody kontrolera
346 // ustaw na index (domyślna funkcja składowa)
348 $t[1] = 'index';
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)
357 if(count($URL2) > 2)
359 $URL2 = array_splice($URL2, -(count($URL2) - 2));
361 else
363 $URL2 = array();
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];
398 else
400 return false;
405 * public int segments()
407 * Zwraca ilość segmentów
411 public function segments()
413 return count(self::$segments);