View file lib/route.php

File size: 6.6Kb
<?

class Route {
        
        public $action = NULL;
        public $module_name = NULL;
        public $module_path = NULL;
        public $controller_exists = TRUE;
        public $module_method;
        
        /**
	* Сегменты
	*/
	public $segment1;
	public $segment2;
	public $segment3;

        public function __construct() {
                $this->parse_query();
                $this->route();
        }
        
        public function parse_query(){
                $request_string = $_SERVER['REQUEST_URI'] . $_SERVER['QUERY_STRING'];
                
                if (preg_match('#\/[a-z0-9\.\/?\&\=]{1,25}#i', $request_string)) {
                        $ex_string = explode('/', $request_string);
                }

                $query = str_replace(URL, '', 'http://' . $_SERVER['HTTP_HOST'] . $_SERVER['REQUEST_URI']);
                $ex = explode('?', $query);
                $query = $ex[0];
                $query = str_replace(FILE_EX, '', $query);

                # Правила роутинга для каждого модуля
                //$this->module_name = $ex_string[1];

                $rules = '';

                if (file_exists(DATADIR . 'route/' . $ex_string[1] . '.dat')) {
                        $rules .= implode('', file(DATADIR . 'route/' . $ex_string[1] . '.dat')) . PHP_EOL;
                }

                $rules .= '([a-z0-9_\-]*)([\.a-z0-9]*)#segment1=$1' . PHP_EOL;
                $rules .= '([a-z0-9_\-]*)/([a-z0-9_\-]*)([\.a-z0-9]*)#segment1=$1&segment2=$2' . PHP_EOL;
                $rules .= '([a-z0-9_\-]*)/([a-z0-9_\-]*)/([a-z0-9_\-]*)([\.a-z0-9]*)#segment1=$1&segment2=$2&segment3=$3' . PHP_EOL;

                $rules = explode("\n", $rules);

                foreach ($rules as $rule) {
                        $rule = trim($rule);
                        if (strpos($rule, '#') == 0 or $rule == '')
                                continue;
                        $ex = explode('#', $rule);
                        if (preg_match('~^' . $ex[0] . '$~', $query)) {
                                $result = preg_replace('~^' . $ex[0] . '$~', $ex[1], $query, 1);
                                $vars = explode('&', $result);
                                foreach ($vars as $var) {
                                        $_ex = explode('=', $var);
                                        $_GET[$_ex[0]] = $_ex[1];
                                }
                                break;
                        }
                }
                
                # Отдельное правило для просмотра файла по id
                if (preg_match('#/([0-9]{1,11})$#',  $request_string, $idfile)){
                        $_GET['segment1'] = 'index_page';
                        $_GET['segment2'] = 'view';
                        $_GET['idfile'] = $idfile[1];
                }
                
        }
        /**
	* Функция определяет контроллер и action
	*/
	public function route() {
		# Определение сегментов
		if($this->_check_segments()) {
			# Если нет сегментов, подключаем модуль по умолчанию
			if(empty($this->segment1)) {
				if(file_exists(ROOT .'modules/'. MODULE_DEFAULT .'/system/'. MODULE_DEFAULT .'.php')) {
					$this->module_path = 'modules/'. MODULE_DEFAULT .'/system/'. MODULE_DEFAULT .'.php';
					$this->module_method = MODULE_DEFAULT;
					$this->action = '';
					$this->module_name = MODULE_DEFAULT;
				}
				else $this->controller_exists = FALSE;
			}
			# Если указаны все 3 сегмента
			if(!empty($this->segment1) && !empty($this->segment2) && !empty($this->segment3)) {
				if(file_exists(ROOT .'modules/'. $this->segment1 .'/system/'. $this->segment1 .'_'. $this->segment2 .'.php')) {
					$this->module_path = 'modules/'. $this->segment1 .'/system/'. $this->segment1 .'_'. $this->segment2 .'.php';
					$this->module_method = $this->segment1 .'_'. $this->segment2;
					$this->action = $this->segment3;
					$this->module_name = $this->segment1;
				}
				else $this->controller_exists = FALSE;
			}
			# Если указаны 2 сегмента
			elseif(!empty($this->segment1) && !empty($this->segment2)) {
				if(file_exists(ROOT .'modules/'. $this->segment1 .'/system/'. $this->segment1 .'_'. $this->segment2 .'.php')) {
					$this->module_path = 'modules/'. $this->segment1 .'/system/'. $this->segment1 .'_'. $this->segment2 .'.php';
					$this->module_method = $this->segment1 .'_'. $this->segment2;
					$this->action = '';
					$this->module_name = $this->segment1;
				}
				elseif(file_exists(ROOT .'modules/'. $this->segment1 .'/system/'. $this->segment1 .'.php')) {
					$this->module_path = 'modules/'. $this->segment1 .'/system/'. $this->segment1 .'.php';
					$this->module_method = $this->segment1;
					$this->action = $this->segment2;
					$this->module_name = $this->segment1;
				}
				else $this->controller_exists = FALSE;
			}
			# Если указан только 1 сегмент
			elseif(!empty($this->segment1)) {
				if(file_exists(ROOT . 'modules/'. $this->segment1 .'/system/'. $this->segment1 .'.php')) {
					$this->module_path = 'modules/'. $this->segment1 .'/system/'. $this->segment1 .'.php';
					$this->module_method = $this->segment1;
					$this->action = '';
					$this->module_name = $this->segment1;
				}
				else $this->controller_exists = FALSE;
			}
                        
			if($this->controller_exists) {
				define('ROUTE_MODULE_PATH', $this->module_path);
				define('ROUTE_MODULE_NAME', $this->module_name);
				define('ROUTE_MODULE_ACTION', $this->action);
				define('ROUTE_MODULE_METHOD', $this->module_method);
			}
			else header('Location: '. p_url('main/page_not_found', '', true));
		}
	}
        
        /**
	* Проверка правильности сегментов
	*/
	protected function _check_segments() {
		$check_segments = true;
		if(!empty($_GET['segment1'])) {
			if(preg_match('~^[0-9a-z_-]*$~', $_GET['segment1'])) $this->segment1 = $_GET['segment1'];
			else $check_segments = false;
		}
		if(!empty($_GET['segment2'])) {
			if(preg_match('~^[0-9a-z_-]*$~', $_GET['segment2'])) $this->segment2 = $_GET['segment2'];
			else $check_segments = false;
		}
		if(!empty($_GET['segment3'])) {
			if(preg_match('~^[0-9a-z_-]*$~', $_GET['segment3'])) $this->segment3 = $_GET['segment3'];
			else $check_segments = false;
		}
		if(!$check_segments) display_error('Ошибка регистрации сегментов!');
		return true;
	}

}

?>