A super easy PHP Framework for web development!
				https://github.com/exacti/phacil-framework
			
			
		
			You can not select more than 25 topics
			Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
		
		
		
		
		
			
		
			
				
					
					
						
							227 lines
						
					
					
						
							6.9 KiB
						
					
					
				
			
		
		
	
	
							227 lines
						
					
					
						
							6.9 KiB
						
					
					
				<?php
 | 
						|
/*
 | 
						|
 * Copyright © 2021 ExacTI Technology Solutions. All rights reserved.
 | 
						|
 * GPLv3 General License.
 | 
						|
 * https://exacti.com.br
 | 
						|
 */
 | 
						|
 | 
						|
 //namespace Phacil\Framework;
 | 
						|
 | 
						|
use Phacil\Framework\Action;
 | 
						|
use Phacil\Framework\Controller as ControllerController;
 | 
						|
use Phacil\Framework\Registry;
 | 
						|
use Phacil\Framework\Config;
 | 
						|
use Phacil\Framework\Request;
 | 
						|
 | 
						|
class SystemUrlSeoUrl extends ControllerController {
 | 
						|
 | 
						|
    /**
 | 
						|
     * 
 | 
						|
     * @var string
 | 
						|
     */
 | 
						|
    private $notfound = 'error/not_found';
 | 
						|
 | 
						|
    /**
 | 
						|
     * 
 | 
						|
     * @var string[]
 | 
						|
     */
 | 
						|
    private $regType = array(
 | 
						|
        "%d" => '(\\d{1,})',
 | 
						|
        "%w" => '(\\w{1,})',
 | 
						|
        "%a" => '([[:ascii:]]{1,})',
 | 
						|
        "%" => '(.*)');
 | 
						|
 | 
						|
    /**
 | 
						|
     * @param Registry $registry 
 | 
						|
     * @return void 
 | 
						|
     */
 | 
						|
    public function __construct(\Phacil\Framework\Registry $registry)
 | 
						|
    {
 | 
						|
        parent::__construct($registry);
 | 
						|
 | 
						|
        $this->notfound = Config::NOT_FOUND() ?: $this->notfound;
 | 
						|
        
 | 
						|
    }
 | 
						|
 | 
						|
    /** 
 | 
						|
     * @return Action|void 
 | 
						|
     * @todo
 | 
						|
     */
 | 
						|
    public function index() {
 | 
						|
        // Add rewrite to url class
 | 
						|
        if ($this->config->get('config_seo_url')) {
 | 
						|
            $this->url->addRewrite($this);
 | 
						|
        }
 | 
						|
 | 
						|
        $match = array();
 | 
						|
 | 
						|
        // Decode URL
 | 
						|
        if (Request::GET('_route_')) {
 | 
						|
            $parts_count = explode('/', Request::GET('_route_'));
 | 
						|
            $parts = array(Request::GET('_route_'));
 | 
						|
 | 
						|
            foreach ($parts as $part) {
 | 
						|
                if(Config::USE_DB_CONFIG()){
 | 
						|
                    $query = $this->db->query()->select()->setTable("url_alias");
 | 
						|
                    $query->where()->eq('keyword', $part);
 | 
						|
                    $query = $query->load();
 | 
						|
 | 
						|
                    if (isset($query) && $query != false && $query->getNumRows() === 1) {
 | 
						|
                        $row = $query->getRow();
 | 
						|
 | 
						|
                        if(!empty($row->getValue('get'))) {
 | 
						|
                            $a = explode(',', $row->getValue('get'));
 | 
						|
 | 
						|
                            foreach($a as $value) {
 | 
						|
                                $b = explode('=', $value);
 | 
						|
                                $_GET[$b[0]] = $b[1];
 | 
						|
                                Request::GET($b[0], $b[1]);
 | 
						|
                            }
 | 
						|
                        }
 | 
						|
 | 
						|
                        Request::GET('route', $row->getValue('query'));
 | 
						|
                    }
 | 
						|
                } elseif (Config::ROUTES() && is_array(Config::ROUTES())) {
 | 
						|
                    $rotas = Config::ROUTES();
 | 
						|
 | 
						|
                    if(isset($rotas[$part])){
 | 
						|
                        Request::GET('route', $rotas[$part]);
 | 
						|
                    } else {
 | 
						|
 | 
						|
                        foreach($rotas as $key => $page) {
 | 
						|
 | 
						|
                            if(isRegularExpression($key)) {
 | 
						|
 | 
						|
                                $preg = preg_quote($key, "/");
 | 
						|
 | 
						|
                                $preg = str_replace(array_keys($this->regType), array_values($this->regType), $preg);
 | 
						|
 | 
						|
                                if((@preg_match("/". $preg . "/", $parts[0], $match))) {
 | 
						|
 | 
						|
                                    $countTree = explode("/", $match[0]);
 | 
						|
 | 
						|
                                    if(count($countTree) == count($parts_count)){
 | 
						|
 | 
						|
                                        unset($match[0]);
 | 
						|
 | 
						|
                                        $match = $this->request->clean($match);
 | 
						|
 | 
						|
                                        $pagina = $page;
 | 
						|
 | 
						|
                                        break;
 | 
						|
                                    }
 | 
						|
 | 
						|
                                }
 | 
						|
                            }
 | 
						|
                        }
 | 
						|
 | 
						|
                        if(isset($pagina)) {
 | 
						|
                            Request::GET('route', $pagina);
 | 
						|
                        } else {
 | 
						|
                            Request::GET('route', $this->notfound);
 | 
						|
                        }
 | 
						|
                    }
 | 
						|
 | 
						|
                } else {
 | 
						|
                    Request::GET('route', $this->notfound);
 | 
						|
                }
 | 
						|
            }
 | 
						|
 | 
						|
 | 
						|
            if (Request::GET('route')) {
 | 
						|
                return $this->forward(Request::GET('route'), $match);
 | 
						|
            }
 | 
						|
        }
 | 
						|
    }
 | 
						|
 | 
						|
    /**
 | 
						|
     * @param string $link 
 | 
						|
     * @return string 
 | 
						|
     * @todo
 | 
						|
     */
 | 
						|
    public function rewrite($link) {
 | 
						|
        if ($this->config->get('config_seo_url')) {
 | 
						|
            $url_data = parse_url(str_replace('&', '&', $link));
 | 
						|
 | 
						|
            $url = '';
 | 
						|
 | 
						|
            $data = array();
 | 
						|
 | 
						|
            parse_str($url_data['query'], $data);
 | 
						|
 | 
						|
            $joinRegex = implode("|", array_keys($this->regType));
 | 
						|
 | 
						|
            foreach ($data as $key => $value) {
 | 
						|
 | 
						|
                if (isset($data['route'])) {
 | 
						|
                    if(Config::USE_DB_CONFIG())
 | 
						|
                        $query = $this->db->query("SELECT * FROM url_alias WHERE `query` = '" . $this->db->escape($value) . "'");
 | 
						|
                    if (isset($query) && $query->num_rows && $query->num_rows != NULL) {
 | 
						|
                        $url .= '/' . $query->row['keyword'];
 | 
						|
                    } elseif (Config::ROUTES() && is_array(Config::ROUTES())) {
 | 
						|
                        //$arV = array_search($value, ROUTES);
 | 
						|
                        foreach(Config::ROUTES() as $query => $page) {
 | 
						|
                            if($page == $value){
 | 
						|
                                if(isRegularExpression($query)){
 | 
						|
                                    unset($data['route']);
 | 
						|
                                    $qnt = substr_count($query, '%');
 | 
						|
                                    if(count($data) == $qnt) {
 | 
						|
                                        $str = $query;
 | 
						|
 | 
						|
                                        foreach($data as $replace){
 | 
						|
                                            $str = preg_replace('/('.$joinRegex.')/', $replace, $str, 1);
 | 
						|
                                        }
 | 
						|
 | 
						|
                                        $url .= '/' .($str);
 | 
						|
 | 
						|
                                        $data = false;
 | 
						|
 | 
						|
                                        break;
 | 
						|
                                    }
 | 
						|
                                } else {
 | 
						|
                                    $url .= '/' . (array_search($value, Config::ROUTES()));
 | 
						|
                                }
 | 
						|
 | 
						|
                            }
 | 
						|
 | 
						|
                        }
 | 
						|
 | 
						|
                    }
 | 
						|
                    unset($data[$key]);
 | 
						|
                }
 | 
						|
 | 
						|
            }
 | 
						|
 | 
						|
            if ($url) {
 | 
						|
                unset($data['route']);
 | 
						|
 | 
						|
                $query = '';
 | 
						|
 | 
						|
                if ($data) {
 | 
						|
                    foreach ($data as $key => $value) {
 | 
						|
                        $query .= '&' . $key . '=' . $value;
 | 
						|
                    }
 | 
						|
 | 
						|
                    if ($query) {
 | 
						|
                        $query = '?' . trim($query, '&');
 | 
						|
                    }
 | 
						|
                }
 | 
						|
 | 
						|
                return $url_data['scheme'] . '://' . $url_data['host'] . (isset($url_data['port']) ? ':' . $url_data['port'] : '') . str_replace('/index.php', '', $url_data['path']) . $url . $query;
 | 
						|
            } else {
 | 
						|
                return $link;
 | 
						|
            }
 | 
						|
        } else {
 | 
						|
            return $link;
 | 
						|
        }
 | 
						|
    }
 | 
						|
}
 | 
						|
 | 
						|
/**
 | 
						|
 * @param string $string 
 | 
						|
 * @return bool 
 | 
						|
 */
 | 
						|
function isRegularExpression($string) {
 | 
						|
    return (strpos($string, '%') !== false);
 | 
						|
}
 | 
						|
 | 
						|
 |