Jump to content

Роутинг на симпле


Recommended Posts

Сам роутинг 

<?php
    $this->routes = array(
        # Каталог товаров
        array(
            'pattern' => '~^/catalog/([^/]+)/?$~',
            'class' => 'ProductsView',
            'aliases' => array('category'),
        ),
        array(
            'pattern' => '~^/catalog/([^/]+)/([^/]+)/?$~',
            'class' => 'ProductsView',
            'aliases' => array('category', 'brand'),
        ),
        array(
            'pattern' => '~^/products/([^/]+)/?$~',
            'class' => 'ProductView',
            'aliases' => array('product_url'),
        ),
        array(
            'pattern' => '~^/products/?$~',
            'class' => 'ProductsView',
        ),
        array(
            'pattern' => '~^/brands/([^/]+)/?$~',
            'class' => 'ProductsView',
            'aliases' => array('brand'),
        ),
        array(
            'pattern' => '~^/brands/([^/]+)/page_([^/]+)/?$~',
            'class' => 'ProductsView',
            'aliases' => array('brand', 'page'),
        ),
        # Поиск товаров
        array(
            'pattern' => '~^/search/([^/]+)/?$~',
            'class' => 'ProductsView',
            'aliases' => array('keyword'),
        ),
        array(
            'pattern' => '~^/search/?$~',
            'class' => 'ProductsView',
        ),
        # Блог
        array(
            'pattern' => '~^/blog/([^/]+)/?$~',
            'class' => 'BlogView',
            'aliases' => array('url'),
        ),
        array(
            'pattern' => '~^/blog/?$~',
            'class' => 'BlogView',
        ),
        # Корзина и заказы
        array(
            'pattern' => '~^/cart/?$~',
            'class' => 'CartView',
            'method' => 'cart',
        ),
        array(
            'pattern' => '~^/cart/([^/]+)/?$~',
            'class' => 'CartView',
            'aliases' => array('add_variant'),
        ),
        array(
            'pattern' => '~^/cart/remove/([^/]+)/?$~',
            'class' => 'CartView',
            'aliases' => array('delete_variant'),
        ),
        array(
            'pattern' => '~^/order/([^/]+)/?$~',
            'class' => 'OrderView',
        ),
        array(
            'pattern' => '~^/order/?$~',
            'class' => 'OrderView',
        ),    
        # Для пользователей
        array(
            'pattern' => '~^/user/login/?$~',
            'class' => 'LoginView',
        ),
        array(
            'pattern' => '~^/user/register/?$~',
            'class' => 'RegisterView',
        ),
        array(
            'pattern' => '~^/user/logout/?$~',
            'class' => 'LoginView',
            'aliases' => array('action'),
        ),
        array(
            'pattern' => '~^/user/password_remind/?$~',
            'class' => 'LoginView',
            'aliases' => array('action'),
        ),
        array(
            'pattern' => '~^/user/password_remind/([0-9a-z]+)/?$~',
            'class' => 'LoginView',
            'aliases' => array('action', 'code'),
        ),
        array(
            'pattern' => '~^/user/?$~',
            'class' => 'UserView',
        ),
        # Feedback
        array(
            'pattern' => '~^/contact/?$~',
            'class' => 'FeedbackView',
        ),
        # Download
        array(
            'pattern' => '~^/order/([^/]+)/([^/]+)/?$~',
            'class' => 'OrderView',
            'aliases' => array('url', 'file'),
        ),
        array(
            'pattern' => '~^/?$~',
        ),
        array(
            'pattern' => '~^/([^/]*)/?$~',
            'class' => 'PageView',
            'aliases' => array('page_url'),
        ),
    );
?>
 

Сам роутинг сохраним в корне site.ru/router.php

Заменяем в файле indexView

// Текущий модуль (для отображения центрального блока)
$module = $this->request->get('module', 'string');
$module = preg_replace("/[^A-Za-z0-9]+/", "", $module);

// Если не задан - берем из настроек
if(empty($module))
	return false;
	//$module = $this->settings->main_module;

на

$params = array();
$module = '';
		
require_once($_SERVER["DOCUMENT_ROOT"]. '/router.php');
		
foreach($this->routes as $map){
	$url_path = parse_url($_SERVER['REQUEST_URI'], PHP_URL_PATH);
	if(preg_match($map['pattern'], $url_path, $matches)){
		array_shift($matches);
		foreach ($matches as $index => $value){
			$params[$map['aliases'][$index]] = $value;
		}
		$module = $map['class'];
		break;
	}
}
$this->params = $params;

Теперь добавим переменные в файл View.php

 

public $params; 

и

$this->params       = &self::$view_instance->params;

И нужно будет заменить все GET-Параметры в файлах view/

Пример замены:

// GET-Параметры
$category_url = $this->request->get('category', 'string');
$brand_url    = $this->request->get('brand', 'string');

на 

// GET-Параметры
$category_url = isset($this->params['category']) ? $this->params['category'] : '';
$brand_url    = isset($this->params['brand']) ? $this->params['brand'] : '';
 

и останутся у нас такие записи в .htaccess

AddDefaultCharset UTF-8
ErrorDocument 404 /404
ErrorDocument 401 /password.php

RewriteEngine on

# Админка теперь по адресу /simpla
RewriteRule	^admin/?$  simpla [L]

# Google sitemap
RewriteRule ^sitemap.xml?$	sitemap.php  [L,QSA]

# XML
RewriteRule ^yandex.xml?$	yandex.php  [L,QSA]

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . index.php

# Ресайз картинок на лету
RewriteRule ^files/products/(.+) resize/resize.php?file=$1&token=%{QUERY_STRING}
#RewriteCond %{THE_REQUEST} ^GET\ (.*)files/products/(.*)\?([A-z0-9]*) 
#RewriteRule ^files/products/(.+) resize/resize.php?file=%2&token=%3 [L,NE]

Проверял все работает.

Link to post
Share on other sites

 

Объясните, пожалуйста, в чем смысл этого и чем это лучше того, что есть сейчас в стандарте? 

 

Ну вообще если итак все ссылается на index, после уже подключает необходимый модуль, роутинг уже должен был быть.

А вообще поднимал сайт на джинсе, чтоб не переводить все, написал роутер ;)

Link to post
Share on other sites

 

Или это предназначено для тех систем, где не работает .htaccess? 

Да все верно, но это должно быть еще внедрено автором магазина.

Просто получается логику приложения на администрирование взваливать.

Сейчас вроде все пользуются роутингом, тем более скрипт коммерческий, роутинг должен быть.

Link to post
Share on other sites

Зачем? Обьясните смысл?

Если на хосте не работает .htaccess - ваше решение не работает.

Если на хосте работает .htaccess - ваше решение не имеет смысла.

Link to post
Share on other sites

 

Если на хосте не работает .htaccess - ваше решение не работает.

Уверены?)

location / {
    if (!-e $request_filename){
        rewrite ^(.*)$ /index.php;
    }
}

P.S я же писал что джинса разрабатывал 

Link to post
Share on other sites

 

А ресайз и все остальное?

А его там вообще не должно быть, первый раз вижу что ресайз в htaccess

Если кому то нравится - можете дальше выносить логику приложения в настройки веб сервера.

Link to post
Share on other sites

Не, столько работать нельзя...(

 

Должно быть, не должно быть - это философия

Если то что предлагается востребовано, тогда да, но внятного ответа зачем это нет)

Link to post
Share on other sites

При том что для кого-то должно, а для кого-то нет, а кто-то скажет Наверное должно, но небуду, а другой Это не надо, но поставлю и т.д.

 

необходимости НЕТ!

 

Роутинг на симпле абсолютно бесполезен.

 

Вы его сделали - отлично, но на прямой вопрос: в чем смысл этого и чем это лучше того, что есть сейчас в стандарте?

Ответ: роутинг уже должен был быть.

 

Должен был, не должен был, или должен был, а может не болжен был....

 

Обоснованного ответа в его необходимости нет.

Link to post
Share on other sites
  • 5 months later...

Ну если будет тишина.. ни страшно.. так сказать не своевременно..

 

Прямое обращение к автору:

 

Иными словами ваше решение не столько оптимизирует или глобально улучшает, а более придает движек к гибкости и манипуляцией над глобальными переходами.. 

 

Аля битрикс создает неограченное кол-во каталогов - так и здесь, если развить маршрутизация предложенную вами.

 

Все верно? или я так понял ваше предложение в этих изменениях 

Link to post
Share on other sites

Иными словами ваше решение не столько оптимизирует или глобально улучшает, а более придает движек к гибкости и манипуляцией над глобальными переходами..

В том и дело, что просто наводит некоторую красоту и единообразие, но практически не улучшает и не придает гибкости.

 

Вот, например, часто SEO-спецы говорят - не нравится в адресах /products/ или /catalog/. Если бы разработка позволяла управлять этим и ОДНИМ изменением в настройках, заменять, скажем /products/ на /goods/, это была бы и гибкость, и польза немалая. Или вообще адреса формировало бы по шаблонам типа /product/%id%/%url%/ ...

Link to post
Share on other sites
  • 4 years later...

Желательно

Ну и какой толк от того демо если будет работать в точности как стандартная симпла?

Вы вообще понимаете о чём здесь идёт речь, что такое роутер?

Link to post
Share on other sites

Желательно

 

На днях в okay опубликован план развития на год, там, в частности, стоит "9. Гибкий роутинг, возможность пользователю самому решать, как будут строится URL для категорий и для товаров". Надо полагать, со временем будет...

Link to post
Share on other sites

Ну и какой толк от того демо если будет работать в точности как стандартная симпла?

Вы вообще понимаете о чём здесь идёт речь, что такое роутер?

Когда писал первое сообщение, думал, автор все пути и всю логику поменял. Сейчас глянул код, понял, что шило на мыло.

Link to post
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

Loading...
×
×
  • Create New...