За последние 24 часа нас посетили 17409 программистов и 1725 роботов. Сейчас ищут 1624 программиста ...

Переключатель для сайта, логичный и понятный php

Тема в разделе "PHP для новичков", создана пользователем _ne_scaju_, 11 июл 2017.

  1. Fell-x27

    Fell-x27 Суперстар
    Команда форума Модератор

    С нами с:
    25 июл 2013
    Сообщения:
    12.156
    Симпатии:
    1.770
    Адрес:
    :сердА
    Нет, это вкусовщина. Кому-то по нраву парсить строку запроса руками, кому-то по нраву в GET заглянуть.
     
  2. igordata

    igordata Суперстар
    Команда форума Модератор

    С нами с:
    18 мар 2010
    Сообщения:
    32.408
    Симпатии:
    1.768
    ну туда-то она попадает сама волшебным образом

    а в гет её ещё надо запихать правильным конфигом, при этом возникает черезжопное засовывание гет-параметров куда-то, либо возможность конфликта имён гет-переменных, прилетающих в запросах, с техническими, используемыми в конфиге.

    По мне так это муть и лишние движения. А если лишние - отрезаем :D
     
  3. Fell-x27

    Fell-x27 Суперстар
    Команда форума Модератор

    С нами с:
    25 июл 2013
    Сообщения:
    12.156
    Симпатии:
    1.770
    Адрес:
    :сердА
    Чот ты описал проблемы, которые вот если самому себе не сделать - никогда и не возникнут, если честно.
     
  4. _ne_scaju_

    _ne_scaju_ Старожил

    С нами с:
    25 ноя 2016
    Сообщения:
    2.149
    Симпатии:
    118
    Всем пример покажу скрипт роутер который написал @MouseZver:
    PHP:
    1. <?php
    2. # Проверяем существование указанной именованной константы
    3. defined ('FLAG') or die ( 'произошла не известная ошибка!' );
    4.  
    5. # define — Определяем именованную константу для папки page
    6. define ( 'DIR_INCLUDE', dirname ( __FILE__ ) . DIRECTORY_SEPARATOR );
    7.  
    8. # выводим ошибки на экран
    9. error_reporting ( E_ALL );
    10.  
    11. # Запускаем сессию
    12.  
    13. # Подключаем базу
    14. require ( $_SERVER['DOCUMENT_ROOT'].'/system/data/mysql.php' );
    15.  
    16. # Класс роутер
    17. class Router
    18. {
    19.     const
    20.     PAGE_DEFAULT = 'start'; # скрипт по умолчанию который будет загружаться
    21.  
    22.     public static
    23.     $DEFAULT_TEMPLATE = 'default'; # Шаблон по умолчанию который будет загружаться
    24.  
    25. }
    26.  
    27.  
    28. # создаем сам роутер чпу переключатель
    29. $router = explode ( '/', mb_strtolower ( trim ( parse_url ( $_SERVER['REQUEST_URI'], PHP_URL_PATH ), ' /' ), 'UTF-8' ) ?: Router::PAGE_DEFAULT );
    30.  
    31. $DIR = implode ( DIRECTORY_SEPARATOR, [ DIR_INCLUDE, 'page', $router[0] ] ) . '.php';
    32.  
    33. # если стр такая сущестует грузим ее иначе на ошибку пускаем
    34. if ( file_exists ( $DIR ) )
    35. {
    36.     require $DIR;
    37. }
    38. else
    39. {
    40.     echo 'Запрошенная страница не найдена';
    41. }
    42.  
    43. $OB_CONTENTS = ob_get_contents ();
    44.  
    45. # Выводим веб страницу в контенте
    46. require ( dirname ( __FILE__, 2 ) . '/templates/view.php' );
    Но вот что мне не нравится, этот скрипт может работать только с htaccess с такими настройками
    PHP:
    1. RewriteEngine on
    2. RewriteCond %{REQUEST_FILENAME} !-d
    3. RewriteCond %{REQUEST_FILENAME} !-f
    4. RewriteRule ^(.*)$ index.php
    И только с такими, если эти настройки я хочу поменять на такие:
    PHP:
    1. RewriteEngine on
    2. RewriteCond %{REQUEST_FILENAME} !-d
    3. RewriteCond %{REQUEST_FILENAME}\.php -f
    4. RewriteRule ^(.*)$ $1.php
    То он вообще не фуричит не работает.

    Этот скрипт роутер должен подгружать все скрипты которые находятся в папке page если я вообще уберу настройки .htaccess то он не работает грузит по дефолту одну страницу start.php а все остальные игнорирует не смотря на какую страницу хочу перейти, типа там таких скриптов нет!
    Что нужно и где изменить чтобы корректно работал роутер?
     
  5. mkramer

    mkramer Суперстар
    Команда форума Модератор

    С нами с:
    20 июн 2012
    Сообщения:
    8.583
    Симпатии:
    1.761
    Ну вообще, первый htaccess - это традиционное решение, называется единая точка входа. Второй htaccess - непонятно, нафига тебе тогда роутер, если ты хочешь каждый запрос на свой файл слать? Ну и ставь тогда ссылки каждый раз прямо на php-файлы, в чём проблема? Смысл роутера в том, что сервер тебе прислал запрос на index.php, а там ты уже можешь любую логику распределения путей запрограммировать.
     
  6. _ne_scaju_

    _ne_scaju_ Старожил

    С нами с:
    25 ноя 2016
    Сообщения:
    2.149
    Симпатии:
    118
    @mkramer
    то-есть первый htaccess правильный второй нет, просто когда я пишу или разбираю код js то там нужно указывать названия файла, а если я в этот момент использую htaccess то полное названия файла я не могу указать, из-за htaccess я в нем режу .php расширения.
    Помоги пожалуйста как мне быть.
     
  7. mkramer

    mkramer Суперстар
    Команда форума Модератор

    С нами с:
    20 июн 2012
    Сообщения:
    8.583
    Симпатии:
    1.761
    В js тебе не обязательно писать имя php-файла, можно и маршрут указывать. Вот у меня в текущем проекте ajax-запросы идут на маршруты типа
    Код (Text):
    1. /admin/json/tasks/get/12
    а на стороне это всё разбирается, и возвращает то, что надо, в ожидаемом формате (json-е). Это раз. Два, в первом htaccess, как и полагается, указано, чтоб на index.php перенаправлялись только запросы на несуществующие файлы, если укажешь имя существующего php файла, то выполнится он сам. Всё потому, что ты вообще слабо себе представляешь как всё работает, и разбирать не хочешь... К тебе на сервер пришёл запрос, дальше ты и только ты решаешь, что ты на этот запрос выдашь клиенту. Хочешь - сформированный html, хочешь - json, хочешь - pdf, хочешь - картинку, хочешь mp3 и т.п. А чужим кодом, не разобравшись, пользоваться не нужно.
     
  8. _ne_scaju_

    _ne_scaju_ Старожил

    С нами с:
    25 ноя 2016
    Сообщения:
    2.149
    Симпатии:
    118
    @mkramer
    Люблю такую критику, аж дух поднимает :D пока хочу без htaccess поработать потом когда понадобится и с ним буду работать, ну вот проблема что без него работать не хочет.
     
  9. mkramer

    mkramer Суперстар
    Команда форума Модератор

    С нами с:
    20 июн 2012
    Сообщения:
    8.583
    Симпатии:
    1.761
    Чтоб без него роутер работал, надо роуты гет-параметрами кидать.
    --- Добавлено ---
    что-то вроде
    Код (Text):
    1. /index.php?r=task/get&id=12
     
  10. _ne_scaju_

    _ne_scaju_ Старожил

    С нами с:
    25 ноя 2016
    Сообщения:
    2.149
    Симпатии:
    118
    @mkramer
    Типа то что мы разбирали выше когда то?
    Если да придется огромный массив ссылок сделать иногда это аж не удобно.
    PHP:
    1. /index.php?r=task/get&id=12
    Куда обычно это прописывают?
     
  11. mkramer

    mkramer Суперстар
    Команда форума Модератор

    С нами с:
    20 июн 2012
    Сообщения:
    8.583
    Симпатии:
    1.761
    Дофига подходов. Я пользуюсь фреймворками. Я тебе давал и вариант с массивом, и без массива. С классами не давал - но ты и не поймёшь :) Я вообще самостоятельно роутеры не пишу - за меня уже умные люди написали, во фреймворки упаковали :). Но я читаю код, и понимаю, как это работает
     
  12. _ne_scaju_

    _ne_scaju_ Старожил

    С нами с:
    25 ноя 2016
    Сообщения:
    2.149
    Симпатии:
    118
    @mkramer
    Подкинь мне класс, только не у фраемворка кради) ибо не разберусь)
     
  13. mkramer

    mkramer Суперстар
    Команда форума Модератор

    С нами с:
    20 июн 2012
    Сообщения:
    8.583
    Симпатии:
    1.761
  14. _ne_scaju_

    _ne_scaju_ Старожил

    С нами с:
    25 ноя 2016
    Сообщения:
    2.149
    Симпатии:
    118
    Теорию почитаю, не обижай ка меня а то я тебе, а что я тебе :D надо быть оптимистом, и верить в меня и раньше времени не наказывать и не угадывать что знаю а что нет.
    Вот нашел роутинг нормальный ли?
    http://www.itlessons.info/php/routing-library/
    --- Добавлено ---
    От того что я прочитаю, не чего не изменится я все ровно понимать сразу не начну, мне туго доходит, ну очень туго) за ссылки спасибо, примерчики и учителя предоставьте за недельку учебы я выучу то что учится за год :D от зубов все что выучил будет отскакивать, буду покорять веб программирование) :)
    --- Добавлено ---
    Можешь писать что угодно но я не сдамся, я по чуть чуть развиваюсь, больно сильно упертый я и настойчивый.
     
  15. mkramer

    mkramer Суперстар
    Команда форума Модератор

    С нами с:
    20 июн 2012
    Сообщения:
    8.583
    Симпатии:
    1.761
    Упорство это хорошо, только смени вектор его, начни изучать язык, а не копипастить примерчики. Роутер, что привёл - ну вроде ничего, хотя можно и поинтереснее найти. Ведь если ты начнёшь работать, всё скопипастить не получится, надо будет писать самому. Вот возьми, разбери теорию внимательно. Выпиши вопросы, что не понятно, запости сюда, тебе ответят. Потом следующую страничку разбери.
     
  16. mkramer

    mkramer Суперстар
    Команда форума Модератор

    С нами с:
    20 июн 2012
    Сообщения:
    8.583
    Симпатии:
    1.761
    Одна теория без практики - путь в никуда, но и одна практика без теории ведёт ровно туда же
     
  17. _ne_scaju_

    _ne_scaju_ Старожил

    С нами с:
    25 ноя 2016
    Сообщения:
    2.149
    Симпатии:
    118
    @mkramer
    Могу с уверенностью сказать что основы языка я точно выучил, и условие могу написать не сложное, а вот основы методов интерфейсов и классов, точно не знаю, пошел читать. Что будет не понятно напишу.
     
  18. Sergey_Tsarev

    Sergey_Tsarev Активный пользователь

    С нами с:
    17 мар 2016
    Сообщения:
    502
    Симпатии:
    105
    У меня роутер работает так:
    1. парсим $_SERVER['REQUEST_URI'] и пишем в массив $url;
    2. если $url[1] нет, отдаем главную страницу;
    3. если $url[1] есть, ищем контроллер в папке контроллеров;
    4. контроллера нет, отдаем 404;
    5. контроллер есть, смотрим есть ли $url[2];
    6. если нет ищем в контроллере indexAction;
    7. если находим, отдаем содержимое, если нет отдаем 404;
    8. если есть $url[2], ищем $url[2]Action в контроллере;
    9. если есть отдаем содержимое, если нет то отдаем 404.

    Помимо этого есть еще список псевдонимов, переадрессаций и т.п.
     
  19. _ne_scaju_

    _ne_scaju_ Старожил

    С нами с:
    25 ноя 2016
    Сообщения:
    2.149
    Симпатии:
    118
    @Sergey_Tsarev
    Покажи свой роутер пожалуйста)
     
  20. Sergey_Tsarev

    Sergey_Tsarev Активный пользователь

    С нами с:
    17 мар 2016
    Сообщения:
    502
    Симпатии:
    105
    Вот, только не помню это конечный вариант или нет)

    PHP:
    1. <?php
    2.  
    3. /*
    4. * To change this license header, choose License Headers in Project Properties.
    5. * To change this template file, choose Tools | Templates
    6. * and open the template in the editor.
    7. */
    8.  
    9. namespace app;
    10.  
    11. class Route {
    12.    
    13.     public $redirectList = [];
    14.     //массив строк для переадрессации
    15.     //['/url' => '/redirectUrl']
    16.    
    17.     public $exceptionList = [];
    18.     //массив строк для адресов-исключений
    19.     //['/url' => '/controller/action']
    20.    
    21.     public $controllerPath;
    22.     //путь к папке с контроллерами
    23.  
    24.     //проверка на запрещенные символы
    25.     private function checkSymbol($url) {
    26.        
    27.         if(preg_match('/^[a-z0-9-\/]*$/i', $url)):
    28.             return TRUE;
    29.         else:
    30.             Logging::log()->create([__CLASS__,'Использованы запрещённые символы.']);
    31.             return FALSE;
    32.         endif;
    33.     }
    34.     //проверка на переадресацию
    35.     private function checkRedirect($url) {
    36.        
    37.         if(array_key_exists($url, $this->redirectList)):
    38.             return $this->redirectList[$url];
    39.         else:
    40.             return FALSE;
    41.         endif;
    42.     }
    43.     //проверка на адрес-исключение
    44.     private function checkException($url) {
    45.        
    46.         if(array_key_exists($url, $this->exceptionList)):
    47.             return $this->exceptionList[$url];
    48.         else:
    49.             return FALSE;
    50.         endif;
    51.     }
    52.     //парсинг url-строки
    53.     private function parseUrl() {
    54.        
    55.         $url = $_SERVER['REQUEST_URI'];
    56.         $result = [];
    57.        
    58.         if($this->checkSymbol($url) === TRUE):
    59.            
    60.             $checkRedirect = $this->checkRedirect($url);
    61.        
    62.             if($checkRedirect === FALSE):
    63.                
    64.                 $checkException = $this->checkException($url);
    65.                
    66.                 if($checkException === FALSE):
    67.                     $urlArr = explode('/', substr($url, 1));
    68.                 else:
    69.                     $urlArr = explode('/', substr($checkException, 1));
    70.                 endif;
    71.                
    72.                 for($i = 0; $i < sizeof($urlArr); $i++):
    73.  
    74.                     if($i === 0):
    75.                         $key = 'controller';
    76.                     elseif($i === 1):
    77.                         $key = 'action';
    78.                     elseif($i > 1):
    79.                         $key = 'link_'.($i - 1);
    80.                     endif;
    81.  
    82.                     $result[$key] = $urlArr[$i];
    83.                 endfor;
    84.             else:
    85.                 $result['redirect'] = $checkRedirect;
    86.             endif;
    87.         else:
    88.             $result['error'] = '404';
    89.         endif;
    90.        
    91.         return $result;
    92.     }
    93.    
    94.     //проверка контроллера на существование
    95.     public function checkController() {
    96.         $routeResult = $this->parseUrl();
    97.         if(!array_key_exists('redirect', $routeResult) &&
    98.            !array_key_exists('error', $routeResult)):
    99.             if(isset($routeResult['controller'])&&
    100.                isset($routeResult['action'])):
    101.                 if(!file_exists($this->controllerPath.$routeResult['controller'].'Controller.php')):
    102.                     Logging::log()->create([__CLASS__,'Файл контроллера не найден.']);
    103.                     $routeResult['error'] = '404';
    104.                 endif;
    105.             else:
    106.                 Logging::log()->create([__CLASS__,'Обращение к несуществующим контроллеру/экшену.']);
    107.                 $routeResult['error'] = '404';
    108.             endif;
    109.         endif;
    110.        
    111.         return $routeResult;
    112.     }
    113. }
     
    acso нравится это.
  21. _ne_scaju_

    _ne_scaju_ Старожил

    С нами с:
    25 ноя 2016
    Сообщения:
    2.149
    Симпатии:
    118
    @Sergey_Tsarev
    Сейчас попробую понять что ты делаешь в этом классе роутер.
     
  22. Sergey_Tsarev

    Sergey_Tsarev Активный пользователь

    С нами с:
    17 мар 2016
    Сообщения:
    502
    Симпатии:
    105
    Зачем тебе мой класс? Мой класс написан как элемент системы. Для его работы необходимо несколько других классов и файлов. Ты пиши свой роутер, иначе ты не научишься ничему :)
     
    Dimon2x нравится это.
  23. _ne_scaju_

    _ne_scaju_ Старожил

    С нами с:
    25 ноя 2016
    Сообщения:
    2.149
    Симпатии:
    118
    Понял, надо будет читать про классы и интерфейсы если я их пойму, то это будет классно