Вход Регистрация
Файл: oc-includes/osclass/classes/Rewrite.php
Строк: 154
<?php if ( ! defined('ABS_PATH')) exit('ABS_PATH is not loaded. Direct access is not allowed.');

/*
 * Copyright 2014 Osclass
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *     http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

    
class Rewrite
    
{
        private static 
$instance;
        private 
$rules;
        private 
$routes;
        private 
$request_uri;
        private 
$raw_request_uri;
        private 
$uri;
        private 
$location;
        private 
$section;
        private 
$title;
        private 
$http_referer;

        public function 
__construct()
        {
            
$this->request_uri '';
            
$this->raw_request_uri '';
            
$this->uri '';
            
$this->location '';
            
$this->section '';
            
$this->title '';
            
$this->http_referer '';
            
$this->routes = array();
            
$this->rules $this->getRules();
        }

        public static function 
newInstance()
        {
            if(!
self::$instance instanceof self) {
                
self::$instance = new self;
            }
            return 
self::$instance;
        }

        public function 
getTableName() {}

        public function 
getRules()
        {
            return 
osc_unserialize(osc_rewrite_rules());
        }

        public function 
setRules()
        {
            
osc_set_preference('rewrite_rules'osc_serialize($this->rules));
        }

        public function 
listRules()
        {
            return 
$this->rules;
        }

        public function 
addRules($rules)
        {
            if(
is_array($rules)) {
                foreach(
$rules as $rule) {
                    if(
is_array($rule) && count($rule)>1) {
                        
$this->addRule($rule[0], $rule[1]);
                    }
                }
            }
        }

        public function 
addRule($regexp$uri)
        {
            
$regexp trim($regexp);
            
$uri trim($uri);
            if(
$regexp!='' && $uri!='') {
                if(!
in_array($regexp$this->rules)) {
                    
$this->rules[$regexp] = $uri;
                }
            }
        }

        public function 
addRoute($id$regexp$url$file$user_menu false$location "custom"$section "custom"$title "Custom")
        {
            
$regexp trim($regexp);
            
$file trim($file);
            if(
$regexp!='' && $file!='') {
                
$this->routes[$id] = array('regexp' => $regexp'url' => $url'file' => $file'user_menu' => $user_menu'location' => $location'section' => $section'title' => $title);
            }
        }

        public function 
getRoutes()
        {
            return 
$this->routes;
        }

        public function 
init()
        {
            if(
Params::existServerParam('REQUEST_URI')) {
                if(
preg_match('|[?&]{1}http_referer=(.*)$|'urldecode(Params::getServerParam('REQUEST_URI'falsefalse)), $ref_match)) {
                    
$this->http_referer $ref_match[1];
                    
$_SERVER['REQUEST_URI'] = preg_replace('|[?&]{1}http_referer=(.*)$|'""urldecode(Params::getServerParam('REQUEST_URI'falsefalse)));
                }
                
$request_uri preg_replace('@^' REL_WEB_URL '@'""urldecode(Params::getServerParam('REQUEST_URI'falsefalse)));
                
$this->raw_request_uri $request_uri;
                
$route_used false;
                foreach(
$this->routes as $id => $route) {
                    
// UNCOMMENT TO DEBUG
                    //echo 'Request URI: '.$request_uri." # Match : ".$route['regexp']." # URI to go : ".$route['url']." <br />";
                    
if(preg_match('#^'.$route['regexp'].'#'$request_uri$m)) {
                        if(!
preg_match_all('#{([^}]+)}#'$route['url'], $args)) {
                            
$args[1] = array();
                        }
                        
$l count($m);
                        for(
$p=1;$p<$l;$p++) {
                            if(isset(
$args[1][$p-1])) {
                                
Params::setParam($args[1][$p-1], $m[$p]);
                            } else {
                                
Params::setParam('route_param_'.$p$m[$p]);
                            }
                        }

                        
Params::setParam('page''custom');
                        
Params::setParam('route'$id);
                        
$route_used true;
                        
$this->location $route['location'];
                        
$this->section $route['section'];
                        
$this->title $route['title'];
                        break;
                    }
                }
                if(!
$route_used) {
                    if(
osc_rewrite_enabled()) {
                        
$tmp_ar explode("?"$request_uri);
                        
$request_uri $tmp_ar[0];

                        
// if try to access directly to a php file
                        
if(preg_match('#^(.+?).php(.*)$#'$request_uri)) {
                            
$file explode("?"$request_uri);
                            if(!
file_exists(ABS_PATH $file[0])) {
                                
Rewrite::newInstance()->set_location('error');
                                
header('HTTP/1.1 404 Not Found');
                                
osc_current_web_theme_path('404.php');
                                exit;
                            }
                        }

                        foreach(
$this->rules as $match => $uri) {
                            
// UNCOMMENT TO DEBUG
                            // echo 'Request URI: '.$request_uri." # Match : ".$match." # URI to go : ".$uri." <br />";
                            
if(preg_match('#^'.$match.'#'$request_uri$m)) {
                                
$request_uri preg_replace('#'.$match.'#'$uri$request_uri);
                                break;
                            }
                        }
                    }
                    
$this->extractParams($request_uri);
                    
$this->request_uri $request_uri;

                    if(
Params::getParam('page')!='') { $this->location Params::getParam('page'); };
                    if(
Params::getParam('action')!='') { $this->section Params::getParam('action'); };
                }
            }
        }

        public function 
extractURL($uri '')
        {
            
$uri_array explode('?'str_replace('index.php'''$uri));
            if(
substr($uri_array[0], 01)=="/") {
                return 
substr($uri_array[0], 1);
            } else {
                return 
$uri_array[0];
            }
        }

        public function 
extractParams($uri '')
        {
            
$uri_array explode('?'$uri);
            
$length_i count($uri_array);
            for(
$var_i 1;$var_i<$length_i;$var_i++) {
                if(
preg_match_all('|&([^=]+)=([^&]*)|''&'.$uri_array[$var_i].'&'$matches)) {
                    
$length count($matches[1]);
                    for(
$var_k 0;$var_k<$length;$var_k++) {
                        
Params::setParam($matches[1][$var_k], $matches[2][$var_k]);
                    }
                }
            }
        }

        public function 
removeRule($regexp)
        {
            unset(
$this->rules[$regexp]);
        }

        public function 
clearRules()
        {
            unset(
$this->rules);
            
$this->rules = array();
        }

        public function 
get_request_uri()
        {
            return 
$this->request_uri;
        }

        public function 
get_raw_request_uri()
        {
            return 
$this->raw_request_uri;
        }

        public function 
set_location($location)
        {
            
$this->location $location;
        }

        public function 
get_location()
        {
            return 
$this->location;
        }

        public function 
get_section()
        {
            return 
$this->section;
        }

        public function 
get_title()
        {
            return 
$this->title;
        }

        public function 
get_http_referer()
        {
            return 
$this->http_referer;
        }

    }

?>
Онлайн: 1
Реклама