| 
									
										
										
										
											2008-12-05 13:32:38 +00:00
										 |  |  |  | <?php | 
					
						
							|  |  |  |  | /** | 
					
						
							| 
									
										
										
										
											2008-12-16 12:47:17 +00:00
										 |  |  |  |  * Класс для работы с роутерами | 
					
						
							| 
									
										
										
										
											2008-12-05 13:32:38 +00:00
										 |  |  |  |  * | 
					
						
							| 
									
										
										
										
											2008-12-16 12:47:17 +00:00
										 |  |  |  |  * @copyright | 
					
						
							|  |  |  |  |  * @link | 
					
						
							| 
									
										
										
										
											2008-12-05 13:32:38 +00:00
										 |  |  |  |  * @package Majestic | 
					
						
							|  |  |  |  |  * @subpackage Core | 
					
						
							| 
									
										
										
										
											2008-12-16 12:47:17 +00:00
										 |  |  |  |  * @since | 
					
						
							| 
									
										
										
										
											2008-12-05 13:32:38 +00:00
										 |  |  |  |  * @version SVN: $Id$ | 
					
						
							|  |  |  |  |  * @filesource $URL$ | 
					
						
							|  |  |  |  |  */ | 
					
						
							| 
									
										
										
										
											2008-12-02 09:03:33 +00:00
										 |  |  |  | 
 | 
					
						
							|  |  |  |  | final class Router | 
					
						
							|  |  |  |  | { | 
					
						
							| 
									
										
										
										
											2008-12-16 12:47:17 +00:00
										 |  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2008-12-02 09:03:33 +00:00
										 |  |  |  |     protected $routes = array(); | 
					
						
							| 
									
										
										
										
											2008-12-16 12:47:17 +00:00
										 |  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2008-12-08 11:00:15 +00:00
										 |  |  |  |     static protected $rewrite_base  = ''; | 
					
						
							|  |  |  |  |     static protected $decorator     = DEFAULT_DECORATOR; | 
					
						
							| 
									
										
										
										
											2008-12-17 09:04:40 +00:00
										 |  |  |  |     static protected $route_name    = ''; | 
					
						
							| 
									
										
										
										
											2008-12-16 12:47:17 +00:00
										 |  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2008-12-02 09:03:33 +00:00
										 |  |  |  | 
 | 
					
						
							|  |  |  |  |     /** | 
					
						
							|  |  |  |  |      * Добавить роутер | 
					
						
							|  |  |  |  |      * | 
					
						
							|  |  |  |  |      * @param string $name - имя роутера | 
					
						
							|  |  |  |  |      * @param string $path - путь | 
					
						
							|  |  |  |  |      * @param string $action - имя действия | 
					
						
							|  |  |  |  |      * @param array $params - массив параметров | 
					
						
							|  |  |  |  |      */ | 
					
						
							|  |  |  |  |     function add($name, $path, $action, $params = array()) | 
					
						
							|  |  |  |  |     { | 
					
						
							|  |  |  |  |         $this->routes[$name] = new Route($path, $action, $params); | 
					
						
							| 
									
										
										
										
											2008-12-08 11:00:15 +00:00
										 |  |  |  |         $this->routes[$name]->decorator = self::$decorator; | 
					
						
							| 
									
										
										
										
											2008-12-02 09:03:33 +00:00
										 |  |  |  |     } | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  |     /** | 
					
						
							|  |  |  |  |      * Установить декоратор для роута (действия), отличный от стандартного | 
					
						
							|  |  |  |  |      * | 
					
						
							|  |  |  |  |      * @param string $name - имя роута (действия) | 
					
						
							|  |  |  |  |      * @param string $decorator - имя декоратора | 
					
						
							|  |  |  |  |      */ | 
					
						
							|  |  |  |  |     function setDecorator($name, $decorator) | 
					
						
							|  |  |  |  |     { | 
					
						
							|  |  |  |  |         if (isset($this->routes[$name])) { | 
					
						
							|  |  |  |  |             $this->routes[$name]->decorator = $decorator.DECORATOR_POSTFIX; | 
					
						
							|  |  |  |  |         } | 
					
						
							|  |  |  |  |     } | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  |     /** | 
					
						
							|  |  |  |  |      * Найти роутер соответствующий заданному пути | 
					
						
							|  |  |  |  |      * | 
					
						
							|  |  |  |  |      * @param stirng $path - путь | 
					
						
							|  |  |  |  |      * @return Route - роутер | 
					
						
							|  |  |  |  |      */ | 
					
						
							|  |  |  |  |     function proccess($path) | 
					
						
							|  |  |  |  |     { | 
					
						
							| 
									
										
										
										
											2008-12-17 09:04:40 +00:00
										 |  |  |  |         if(self::getRewriteBase()){ | 
					
						
							|  |  |  |  |             $path = trim(ltrim($path, self::getRewriteBase()), '/'); | 
					
						
							| 
									
										
										
										
											2008-12-16 12:47:17 +00:00
										 |  |  |  |         } | 
					
						
							| 
									
										
										
										
											2008-12-17 09:04:40 +00:00
										 |  |  |  |          | 
					
						
							| 
									
										
										
										
											2008-12-16 12:47:17 +00:00
										 |  |  |  |         $path = explode('/', $path); | 
					
						
							|  |  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2008-12-08 11:00:15 +00:00
										 |  |  |  |         foreach($this->routes as $name => $route) { | 
					
						
							| 
									
										
										
										
											2008-12-02 09:03:33 +00:00
										 |  |  |  |             if ($route->match($path)) { | 
					
						
							|  |  |  |  |                 $route->action .= ACTION_POSTFIX; | 
					
						
							|  |  |  |  |                 Env::setParams($route->params); | 
					
						
							| 
									
										
										
										
											2008-12-17 09:04:40 +00:00
										 |  |  |  |                 self::$route_name = $name; | 
					
						
							| 
									
										
										
										
											2008-12-02 09:03:33 +00:00
										 |  |  |  |                 return $route; | 
					
						
							|  |  |  |  |             } | 
					
						
							|  |  |  |  |         } | 
					
						
							| 
									
										
										
										
											2008-12-19 10:57:47 +00:00
										 |  |  |  |         throw new StaticPageException(E_404); | 
					
						
							| 
									
										
										
										
											2008-12-02 09:03:33 +00:00
										 |  |  |  |     } | 
					
						
							| 
									
										
										
										
											2008-12-16 12:47:17 +00:00
										 |  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2008-12-08 11:00:15 +00:00
										 |  |  |  |     static public function setRewriteBase($value = '') | 
					
						
							|  |  |  |  |     { | 
					
						
							|  |  |  |  |         self::$rewrite_base = $value; | 
					
						
							|  |  |  |  |     } | 
					
						
							| 
									
										
										
										
											2008-12-16 12:47:17 +00:00
										 |  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2008-12-08 11:00:15 +00:00
										 |  |  |  |     static public function getRewriteBase() | 
					
						
							|  |  |  |  |     { | 
					
						
							|  |  |  |  |         return self::$rewrite_base; | 
					
						
							|  |  |  |  |     } | 
					
						
							| 
									
										
										
										
											2008-12-16 12:47:17 +00:00
										 |  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2008-12-08 11:00:15 +00:00
										 |  |  |  |     static public function setDefaultDecorator($decorator) | 
					
						
							|  |  |  |  |     { | 
					
						
							|  |  |  |  |         self::$decorator = $decorator.DECORATOR_POSTFIX; | 
					
						
							|  |  |  |  |     } | 
					
						
							| 
									
										
										
										
											2008-12-17 09:04:40 +00:00
										 |  |  |  |      | 
					
						
							|  |  |  |  |     static public function getRouteName() | 
					
						
							|  |  |  |  |     { | 
					
						
							|  |  |  |  |         return self::$route_name; | 
					
						
							|  |  |  |  |     } | 
					
						
							| 
									
										
										
										
											2008-12-02 09:03:33 +00:00
										 |  |  |  | } | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  | /** | 
					
						
							|  |  |  |  |  * Роутер | 
					
						
							|  |  |  |  |  * | 
					
						
							|  |  |  |  |  */ | 
					
						
							|  |  |  |  | final class Route | 
					
						
							|  |  |  |  | { | 
					
						
							|  |  |  |  |     const URL_VARIABLE = '&'; | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  |     protected $path; | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  |     public $decorator = DEFAULT_DECORATOR; | 
					
						
							|  |  |  |  |     public $action; | 
					
						
							|  |  |  |  |     public $params; | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  |     function __construct($path, $action, $params=array()) | 
					
						
							|  |  |  |  |     { | 
					
						
							|  |  |  |  |         $this->path     = $path; | 
					
						
							|  |  |  |  |         $this->action   = $action; | 
					
						
							|  |  |  |  |         $this->params   = $params; | 
					
						
							|  |  |  |  |     } | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  |     /** | 
					
						
							|  |  |  |  |      * Проверяет соответствие роутера и пути | 
					
						
							|  |  |  |  |      * | 
					
						
							|  |  |  |  |      * @param string $path - путь для сравнения | 
					
						
							|  |  |  |  |      * @return boolean - соответствует или нет | 
					
						
							|  |  |  |  |      */ | 
					
						
							|  |  |  |  |     function match($path_arr) | 
					
						
							|  |  |  |  |     { | 
					
						
							|  |  |  |  |         $parts = explode('/', $this->path); | 
					
						
							|  |  |  |  |         $cnt   = count($parts); | 
					
						
							|  |  |  |  |         if (end($parts) == self::URL_VARIABLE) { | 
					
						
							|  |  |  |  |             $cnt--; | 
					
						
							|  |  |  |  |         } elseif ($cnt != count($path_arr)) { | 
					
						
							|  |  |  |  |             return false; | 
					
						
							|  |  |  |  |         } | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  |         for ($i=0; $i<$cnt; $i++) { | 
					
						
							|  |  |  |  |             if (substr($parts[$i], 0, 1) == self::URL_VARIABLE) { | 
					
						
							|  |  |  |  |                 $this->params[substr($parts[$i], 1)] = $path_arr[$i]; | 
					
						
							|  |  |  |  |             } elseif ($parts[$i] != $path_arr[$i]) { | 
					
						
							|  |  |  |  |                 return false; | 
					
						
							|  |  |  |  |             } | 
					
						
							|  |  |  |  |         } | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  |         return true; | 
					
						
							|  |  |  |  |     } | 
					
						
							|  |  |  |  | } | 
					
						
							|  |  |  |  | ?>
 |