25
Окт
2016

PHP Роутинг. Мультиязычность и определение модуля сайта (админ-панель/веб-сайт)

Доброй ночи. Ломаю голову и никак не могу понять как мне реализовать мультиязычность и переключение между админ-панелью и обычной версией сайта.
Начал писать свой роутер, ибо с фреймворками еще не очень умею находить общий язык, никак немогу разобраться.
Очень надеюсь что найдется человек, который поможет мне реализовать мой вариант роутинга. И так, опишу проблему и задачу:

Создаю сайт. Требуется сделать мультиязычность(3 языка) и админ-панель. Ссылки должны быть такого вида:
Обычная версия

  1. http://web-site.com/
    • http://web-site.com/catalog/auto/
    • http://web-site.com/catalog/auto/product/product-url/
    • http://web-site.com/
  2. http://web-site.com/ru/
    • http://web-site.com/ru/catalog/
    • http://web-site.com/ru/catalog/auto/
    • http://web-site.com/ru/catalog/auto/product/product-url/

Если же в адресной строке добавить /admin/, то должен сработать редирект и подключать директорию с файлами админ-панели.

  • http://web-site.com/admin/
  • http://web-site.com/admin/products/auto/

Файл .htaccess содержит следующее:

RewriteEngine on
RewriteBase /
RewriteCond %{REQUEST_FILENAME} !^favicon\.ico
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^(.*)$ index.php?$1 [L,QSA]

Я хочу, чтобы при открытии сайта был, допустим, русский язык по умолчанию, то есть ссылка вида http://web-site.com/ это русский язык, если пользователь выбирает другой язык, то все ссылки которые есть на сайте автоматически форматируются в указаную локаль, то есть :
http://web-site.com/catalog/ форматируется в http://web-site.com/en/catalog/. Я без понятия как можно посредством php переделать все ссылки под нужную локаль.

Дальше мой роутер:

class Router {    
    public $URI = [];
    public $TEMPLATE; 
    public $MODULE = []; 
    public $LOCALE;

    function __construct() {
        self::parseQueryString();
    }

    function parseQueryString() {
        /**
         * Метод который парсит строку запроса, и возвращает массив $URI
         **/
        $parsedString = parse_url($_SERVER['QUERY_STRING'], PHP_URL_PATH);

        $parsedString = explode('/', $parsedString);

        $this->URI = $parsedString;

        return $this->URI;
    }

    function setTemplate() {
        /**
         * Этот метод должен запустить проверку на существование шаблона
         * если таков есть, то возвращает название шаблона, если нет 
         * то название шаблона ошибки
         **/
        $template = $this->TEMPLATE;

        if (!$this->checkTemplate($template, $module)) $template = 'error';

        return $template;
    }

    function checkTemplate($template, $module) {
        /**
         * Этот метод проверяет наличие файла (шаблона)
         * Возвращает TRUE | FALSE
         **/
        $checkPath = $_SERVER['DOCUMENT_ROOT'] . '/application/views/' . $module . '/';
        $checked   = false;

        if (file_exists($checkPath . $template . '.php')) $checked = true;

        return $checked;
    }

    static function redirect($path = NULL) {
        /**
         * Статический метод обычной перезагрузки.
         * Использую после отправки формы методом пост,
         * либо когда это нужно
         **/
        if (!$path) {
            $redirect = isset($_SERVER['HTTP_REFERER']) ? $_SERVER['HTTP_REFERER'] : $_SERVER['REQUEST_URI'];
            header("Location: $redirect");
        } else
            header("Location: /$path");
        exit;
    }
}

Он еще не закончен, собственно по этому я пришел к вам. Надеюсь кто-то поможет дописать или объяснить как это сделать.

Первым делом роутер должен принимать и парсить адресную строку. Это я сделал.
Но теперь мне нужно определять и форматировать ссылки автоматически под нужную локаль. Например, пользователь приходит на сайт:
http://web-site.com/ попадает на главную страницу с русским языком. Потом переходить в каталог товаром http://web-site.com/catalog/ и переключает на английский язык, мне надо переадресовать пользователя на http://web-site.com/en/catalog/ и в роутере принять этот /en/ и передать его в переменную $LOCALE которую я потом смогу использовать для вывода нужной инфы в нужной локали.
Если же в адресной строке пользователь вводит http://web-site.com/admin/ то его должно перекинуть на страницу авторизации админ-панели. Но я не совсем понимаю как это сделать.
Структура папок у меня такая:

  • web-site
    • application
      • configs
        • config.php
      • controller
        • controller.php
      • core[dir]
        • Router.php
        • Database.php
      • models[dir]
        • CatalogModel.php
        • NewsModel.php
        • и тд...
      • views
        • web_site[виды страниц сайта для обычного пользователя]
        • control_panel[виды страниц админ-панели]
      • loader.php
    • css
    • img
    • js
    • uploads
    • index.php

Файл loader.php подключает все нужные файлы в самом начале.
Потом я в файле controller.php запускаю свой роутер.
К сожалению, дальше я не знаю куда двигаться и что делать. Если нужно больше инфы, я предоставлю всё необходимое.

Источник: https://ru.stackoverflow.com/questions/582575/php-%D0%A0%D0%BE%D1%83%D1%82%D0%B8%D0%BD%D0%B3-%D0%9C%D1%83%D0%BB%D1%8C%D1%82%D0%B8%D1%8F%D0%B7%D1%8B%D1%87%D0%BD%D0%BE%D1%81%D1%82%D1%8C-%D0%B8-%D0%BE%D0%BF%D1%80%D0%B5%D0%B4%D0%B5%D0%BB%D0%B5%D0%BD%D0%B8%D0%B5-%D0%BC%D0%BE%D0%B4%D1%83%D0%BB%D1%8F-%D1%81%D0%B0%D0%B9%D1%82%D0%B0-%D0%B0%D0%B4%D0%BC%D0%B8%D0%BD-%D0%BF%D0%B0%D0%BD%D0%B5%D0%BB%D1%8C-%D0%B2%D0%B5%D0%B1-%D1%81%D0%B0%D0%B9%D1%82

Share

Тебе может это понравится...