Pull to refresh

ЧПУ на PHP

Здесь я представлю свой файлик который позволит вам использовать ЧПУ на PHP, без перекладывания ответственности на БД.

Файл позволяет:

  1. Работать со ссылками прямо из него, всё просто и понятно, результатом работы является массив.
  2. Контроль уровня доступа к некоторым URI.
  3. Быстрое изменение самого URI для перехода.

Кратко выражаясь, это очень похоже на файл urls.py из Django, только на PHP.

А вот и сам код:

 class urls
    {
        /* Описание переменых:
            address Адрес по которому пользователь оброщается
                * начало строки
                & конец строки

            aces_level Уровень доступа, к даному url

            file Файл котырый необходимо предоставить

            a_id_html элемент  id в вёрстки html куда будет выведена сыллка

            ({?vars?}) - возврощаемое значения без пробелов
         */

        private $urls = array(
            array("address"=>"*&", "aces_level"=>"1", "file"=>"pages/main.php", "a_id_html"=>"main"), //Главна страница
            array("address"=>"*login&", "aces_level"=>"0", "file"=>"pages/login.php", "a_id_html"=>"main"), //Логин
            array("address"=>"*logout&", "aces_level"=>"2", "file"=>"all/logout.php", "a_id_html"=>"main"), //Деавторизация
            array("address"=>"*signup&", "aces_level"=>"0", "file"=>"pages/checkIn.php", "a_id_html"=>"main"), //Регистрация
            array("address"=>"*admin&", "aces_level"=>"5", "file"=>"admin_panel/main.php", "a_id_html"=>"main"), //Панель админитратора
            );

        private $aces_level = 0; //Уровень доступа
        private $auth = 0; //Показывает авторизован, ли пользователь

        private $dont_autherezet_user = 1; //Уровень доступа для не авторизованых пользователей

        //Элементы для авторизации
        private $user_auth_session = ''; //Названия элемента в массиве _SESSION
        private $user_auth_cookie = ''; //Название элемента в массиве _COOKIE

        private $user_url_decomposition; //URL пользователяв необходимом виде

        private $page_404_error = "pages/error_page.php";

        private function decomposition_url($url_for_decomposition){ //первращение url в массив с данными
            $request = str_split($url_for_decomposition); $cell_number = -1;
            $words = array();
            for ($char = 0; $char < count($request); $char++) {
                // оброботка спец символов
                if ($char == 0 and $request[$char] == '*'){
                    continue;
                }
                if ($request[$char] == '&'){
                    break;
                }

                if ($request[$char] == '/') {
                    $cell_number += 1;
                    continue;
                }

                if ($cell_number < 0) {
                    //При возникновении ошибки, если не выполнился, ни один блок выше
                    $cell_number += 1;
                }
                $words[$cell_number] = $request[$char]; //сложение строк
            }
            return $words;
        }

        //проверка на наличие переменых во внутренних URL ($urls), где $url это строка из $urls
        private function checking_for_variables_in_internal_URLs($url){
            $url = $this->decomposition_url($url); //Получаем, массив из $url

            //Производим, поиск номера элемента массива с переменой.
            $array_with_numbers = array();
            for ($char_number=0; $char_number<count($url); $char_number++){
                $str_array = str_split($url[$char_number]);
                for ($char_number_in_for=0; $char_number_in_for<count($str_array); $char_number_in_for++){
                    //начинаем проверку строки
                    if ($str_array[$char_number_in_for] == '('){
                        $num = $char_number_in_for+1;
                        if ($str_array[$num] == '{'){
                            $num = $char_number_in_for+2;
                            if ($str_array[$num] == '?'){
                                // Переменая найдена сохраняем номер элемента
                                $array_with_numbers[] = $char_number;
                                break; //При нахождении выходим в основной цикл
                            }
                        }
                    }
                    //Иначе проходим цикл без вопросов
                }
            }
            //Производим поиск переменой в пользовательском REQUEST_URI

            if (!isset($array_with_numbers[0])){
                return;
            }

            $variables_array = array();

            for ($char_numbers=0; $char_numbers<count($array_with_numbers); $char_numbers++){
                $all = $this->user_url_decomposition[$variables_array[$char_numbers]];
            }
            return $variables_array; //Возврощаем, массив вида "название переменой"=>"значение"
        }

        function __construct($aces_level_front, $auth=0)
        {
            if ($auth != 0 ){
                $this->auth = $auth;
            }
            $this->user_url_decomposition = $this->decomposition_url($_SERVER['REQUEST_URI']);
            $this->aces_level = $aces_level_front; //Присваем уровень доступа для даного пользователя
        }

        public function url()
        {
            /* Возврощает массив с данными, подходящими по запросу, иначе ничего не возврощает. */

            //Цикл возврощает максимально подходящий элемент массива $urls
            for ($element_number=0; $element_number<count($this->urls); $element_number++) { //Обробатываем все елементы массива urls
                //Начинаем обробатывать остальные элементы массив
                //Производим проверку уровня досутпа
                if ($this->aces_level >= $this->urls[$element_number]['aces_level']) { //Если пользователь имеет права доступа
                    if ($this->urls[$element_number]['aces_level'] == 0 and $this->aces_level != 0) { // Проверяем что пользователь не авторизован
                        continue; //Если авторизован, переходим к следущему URL
                    }
                } elseif ($this->urls[$element_number]['aces_level'] != $this->dont_autherezet_user and $this->aces_level != 0) { //Если URL доступен для не авторизованых пользователей, то пропускаем пользователя
                    continue;                                                //Иначе переходим к следущему URL
                }                                                          //Также пользователь будет выходить отсюда, если не имет прав доступа

                if ($this->urls[$element_number]['aces_level'] > $this->dont_autherezet_user and $this->aces_level == 0){
                    //Если уровень доступа к URI больше чем уровень доступа не авторизованого пользователя то
                    continue;
                }

                //Начинаем сравнивать url
                $url = $this->decomposition_url($this->urls[$element_number]['address']); //Создаём массив из address

                //Првоеряем все совпадение URL до возможных

                $changing_similarities = 0; //Переменая сходства
                for ($variable_recognize_elements_array=0; $variable_recognize_elements_array<count($this->user_url_decomposition); $variable_recognize_elements_array++) { //сравниваемэлементы массивов
                    if ($this->user_url_decomposition[$variable_recognize_elements_array] == $url[$variable_recognize_elements_array]){
                        $changing_similarities++; //Если URL соподает, то продолжаем поиск
                    } else { // Иначе, проверяем не является ли даный элемент переменной
                        $str_array = str_split($url[$variable_recognize_elements_array]);

                        for ($char_number_in_for=0; $char_number_in_for<count($str_array); $char_number_in_for++){
                            //начинаем проверку строки
                            if ($str_array[$char_number_in_for] == '('){
                                $num = $char_number_in_for+1;
                                if ($str_array[$num] == '{'){
                                    $num = $char_number_in_for+2;
                                    if ($str_array[$num] == '?'){
                                        // Переменая найдена сохраняем номер элемента
                                        $changing_similarities++;
                                        break; //При нахождении выходим в основной цикл
                                    }
                                }
                            }
                            //Иначе проходим цикл без вопросов
                        }
                        if ($variable_recognize_elements_array+1 != $changing_similarities){ //Если не совпадений, то выходим из цикла
                            break;
                        }
                    }
                }

                if(count($this->user_url_decomposition) == $changing_similarities){ // Проверяем совподают ли url, это больше предостережение
                    //Возврощаем необходимый файл
                    $variables_array = $this->checking_for_variables_in_internal_URLs(($this->urls[$element_number]['address']));
                    return array('file'=>$this->urls[$element_number]['file'], 'vars'=>$variables_array);
                }
            }
            return array('file'=>$this->page_404_error); //Если не было найдено url, выводим ошибку
        }

        public function ajax_href(){
            /* Возврощает ссылки с id блоков a, на страницу в формате JSON*/
            
        }

        function __destruct()
        {
            $this->aces_level = 0; //Устанавливаем в изначальное положение
        }
    }

Надеюсь я удалил всё ненужное, но если найдёте что-нибудь, то обязательно сообщите.
Tags:
Hubs:
You can’t comment this publication because its author is not yet a full member of the community. You will be able to contact the author only after he or she has been invited by someone in the community. Until then, author’s username will be hidden by an alias.