Jump to content

Правильные ЧПУ без .htaccess (URL rewrite средствами PHP)


Recommended Posts

Подскажите пожалуйста, может кто уже реализовывал правильное отображение ссылок в ИМ на SIMPLA?

Под правильным я имею ввиду сохранение полной структуры путей, например:

http://test.ru/catalog/car/track/volvo/xc-90/

вместо того что по умолчанию используется в SIMPLA

http://test.ru/catalog/car/

http://test.ru/catalog/track/

http://test.ru/catalog/volvo/

http://test.ru/products/xc-90/

Может я зря всё это затеял и уже давным давно есть готовое решение, просто я его не нашёл?

 

p.s. конечно для апача всё же будет задействован файл .haccess, но всего с парой строк, где будет указан обработчик урлов.

Edited by a13x
Link to post
Share on other sites
  • Replies 51
  • Created
  • Last Reply

Top Posters In This Topic

Немного не то, надо переписывать сам движок и изменять получение параметров через $this->request->get

Сам сначала пошёл по этому пути но понял что это не по феншую, в итоге немного переписал класс REQUEST и добавил свой.

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

 

 

Тут надо просто разрешить спецсимволы в урле, что вобщем то тоже не то да и глупо это в плане SEO оптимизации.

 

 

 

Я недавно делал новый вариант роутинга.

Пишите в скайп kosjak1976 - покажу пример.

Спасибо, написал.

 

p.s. единственная засада только со smarty которая в шаблоне использует $smarty.get :(

Edited by a13x
Link to post
Share on other sites

Вобщем решил сам писать. Покупать у Kosjak76 желания нет. Поэтому если кому-то будет актуально - пишите.

скайп webtask.pro или на почту lelik.177@yandex.ru

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

Edited by a13x
Link to post
Share on other sites

Вобщем решил сам писать. Покупать у Kosjak76 желания нет. Поэтому если кому-то будет актуально - пишите.

скайп webtask.pro или на почту lelik.177@yandex.ru

Вопрос: зачем кому-то писать тебе? Лично у меня к Косте есть доверие в отличии от тебя и если бы пришлось выбирать я бы выбрал Костю, впрочем как и всегда :)
Link to post
Share on other sites

Вопрос: зачем кому-то писать тебе? Лично у меня к Косте есть доверие в отличии от тебя и если бы пришлось выбирать я бы выбрал Костю, впрочем как и всегда :)

Я не просил мне писать, я лишь хотел узнать может человек поделиться или нет. Из разговора я понял что он его продаёт отдельно. Вот и всё.

Link to post
Share on other sites

 

Я не просил мне писать, я лишь хотел узнать может человек поделиться или нет. Из разговора я понял что он его продаёт отдельно. Вот и всё.

А вы выходит не продаёте?

Link to post
Share on other sites

А вы выходит не продаёте?

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

Link to post
Share on other sites

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

 

А открыто на форуме не поделитесь? Как раз кому надо, те и будут использовать, чтоб каждый желающий индивидуально Вас не дергал. Заодно народ и потестирует...

Link to post
Share on other sites

А открыто на форуме не поделитесь? Как раз кому надо, те и будут использовать, чтоб каждый желающий индивидуально Вас не дергал. Заодно народ и потестирует...

Отличное предложение.

Link to post
Share on other sites

А открыто на форуме не поделитесь? Как раз кому надо, те и будут использовать, чтоб каждый желающий индивидуально Вас не дергал. Заодно народ и потестирует...

Да без проблем. Думаю через недельку выложу. Описание будет дано под последнюю версию симплы т.к. у меня шаблон сильно модифицирован поэтому сложно понять где оригинал, а где доработки, поэтому разверну оригинал и там всё сделаю.

Link to post
Share on other sites

Сделал основную часть.

Ссылка на я.диск https://yadi.sk/d/Me7I94uX3QLnXz

Тестовая версия http://simpla-url-rewrite.webtask.pro/

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

Итак, что осталось от .htaccess

 

AddDefaultCharset UTF-8
Options -Indexes
DirectoryIndex index.php
RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-l
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule (.*)$ /index.php?rewrite=$1 [L] 

Какие изменения затронуты:

Контролеры:

1. Добавить класс URewrite.php (файл в архиве, в папке api)

2. В api/Simpla.php в конец списка классов добавить 'rewrite' => 'URewrite'

3. Создать 2 страницы для каталога и брендов и прописать их ID в файд api/URewrite.php

4. Зайти по адресу сайта и в конце урла дописать "?add_active_features=1", система добавит в каталог активные фильтры.

 

Файл IndexView.php

Найти

        $module = $this->request->get('module', 'string');
        $module = preg_replace("/[^A-Za-z0-9]+/", "", $module);

и после дописать

        //передаем в шаблон объект со ссылками, нужная вещь!
        $this->design->assign('rewrite', $this->rewrite);

Далее надо изменить класс REQUEST (api/Request.php) найти строки:

    public function get($name, $type = null)
    {
        $val = null;

и после добавить:

        /* *************************************** */
        //query = "/catalog/cars/truck/"
        $query = $this->rewrite->query;
        //arg = "?minprice=12&maxprice=15&status=1"
        $arg = $this->rewrite->arguments;

        //ищем get параметр по query string
        $val = (isset($query[$name]) ? $query[$name] : "");
        //если не нашлось то..
        if(empty($val)){
            //ищем get параметр в массиве arg
            $val = (isset($arg[$name]) ? $arg[$name] : "");
            //если опять нет, то проверяем на модуль
            if(empty($val))
                if($name == "module")
                    $val = $this->rewrite->module;
        }
        /* *************************************** */

Файл index.php заменить

    $_GET['page_url'] = '404';
    $_GET['module'] = 'PageView';

на

    $view->rewrite->module = "PageView";
    $view->rewrite->arguments["page_url"] = "404";

 

 

Файл resize/resize.php заменить:

require_once('../api/Simpla.php');
$filename = $_GET['file'];
$token = $_GET['token'];

на

require_once('api/Simpla.php');
$filename = $this->arguments["file"];
$token = $this->arguments["token"];

 

 

Открыть файл view/ProductsView.php и перед

    function fetch(){

добавить

public $breadcrumbs = array();

Далее, добавить 2 новых метода, в конец файла перед последней "}"

    public function brand_check(){
        //запрос не в бренд
        if($this->rewrite->uri[0] != $this->rewrite->brands->url)
            return false;
        $brand_url = $this->rewrite->lasturi;
        $brand = $this->brands->get_brand((string)$brand_url);
        if(empty($brand)){
            if($brand_url == $this->rewrite->brands->url){
                $this->breadcrumbs[] = [$this->rewrite->brands->name, $this->rewrite->brands->url];
                $brand = $this->rewrite->brands;
                $brand->current_url = $this->rewrite->brands->url;
            }
            else
                return false;
        }
        else{
            $this->breadcrumbs[] = [$this->rewrite->brands->name, $this->rewrite->brands->url];
            $this->breadcrumbs[] = [$brand->name, $this->rewrite->brands->url."/".$brand->url];
            $brand->current_url = $this->rewrite->brands->url."/".$brand->url;
            $this->design->assign('category', $brand);
        }
        $this->design->assign('brand', $brand);
        return $brand;
    }

    public function category_check(){
        $category_url = $this->rewrite->uri;

        //берем последний аргумент из урла
        $lastcat = $this->rewrite->lasturi;

        //делаем запрос в базу
        $category = $this->categories->get_category((string) $lastcat);

        //запрос не в каталог
        if($this->rewrite->uri[0] != $this->rewrite->catalog->url)
            return false;

        //поставляем сразу хлебную крошку
        $this->breadcrumbs[] = [$this->rewrite->catalog->name, $this->rewrite->catalog->url];
        if(empty($category) || (!$category->visible && empty($_SESSION['admin']))){
            if($lastcat == $this->rewrite->catalog->url){
                $category = $this->rewrite->catalog;
                $category->current_url = $this->rewrite->catalog->url;
            }
            else
                return false;
        }
        else{
            //проверяем что все предыдущие категории существуют и принадлежат свои родителям
            unset($category_url[0]);    //т.к. не является категорий - catalog
            foreach($category_url AS $key => $query_url){
                $pathid = $key - 1;
                $url[] = $category->path[$pathid]->url;
                $this->breadcrumbs[] = [$category->path[$pathid]->name, $this->rewrite->catalog->url."/".implode("/", $url)];
                if($query_url != $category->path[$pathid]->url)
                    return false;
            }
            $category->current_url = $this->rewrite->catalog->url."/".implode("/", $url);
        }
        $this->design->assign('category', $category);
        return $category;
    }


Далее найти строки

        $filter = array();
        $filter['visible'] = 1;

и после добавить

        $category = $this->brand_check();
        if(empty($category)){
            //если его нет, то запрашиваем категории
            $category = $this->category_check();
            //если и их нет, то вовзращаем
            if(empty($category))
                return false;
            else
                if(isset($category->children))
                    $filter['category_id'] = $category->children;
        }
        else
            $filter['brand_id'][] = $category->id;


Проверки:

        if (!empty($brand_url))
        {
        ............
        }
        и
        if (!empty($category_url))
        {
        ............
        }

можно удалить.

В конце метода fetch(), перед

        $this->body = $this->design->fetch('products.tpl');

добавить:

        //вывод правильной ссылки на товар (правильного урла)
        //под вопросом !!!, возможно не нужна уже не помню.
        $this->design->assign('current_url', $category->current_url);
        //крошки
        $this->design->assign('breadcrumbs', $this->breadcrumbs);

Далее, в этом же методе fetch() найти переменную $category->children и поставить перед ней @ чтобы получилось @$category->children

Данная переменная встречается 2 раза, ну или можете сами дописать проверку на её существование.


 
Дальше наодим файл view/productView.php а там находим:
        if(empty($product) || (!$product->visible && empty($_SESSION['admin'])))
            return false;
и после добавляем
        /********** хлебные крошки и проверка на категории / бренд ***********/
        $uri = $this->rewrite->uri;
        //передаем в шаблон массив со ссылками (URL строкой разбитой по /) для активации выбранных меню
        $this->design->assign('rewrite', $this->rewrite);
        $num = count($uri) - 2;            //берем ПРЕДпоследний аргумент из урла - категорию или бренд
        $br_cat = $uri[$num];
        if($uri[0] == $this->rewrite->brands->url){    //для брендов
            $this->breadcrumbs[] = [$this->rewrite->brands->name, $this->rewrite->brands->url];
            $brand = $this->brands->get_brand((string) $br_cat);
            if(empty($brand))
                return false;
            $this->breadcrumbs[] = [$brand->name, $this->rewrite->brands->url."/".$brand->url];
        }
        else{    //для категорий
            $category = $this->categories->get_category((string) $br_cat);
            $this->breadcrumbs[] = [$this->rewrite->catalog->name, $this->rewrite->catalog->url];
            if(isset($category->path)){
                foreach($category->path AS $key => $cat){
                    $urikey = $key + 1;        //0 - /catalog/, поэтому +1
                    $url[] = $uri[$urikey];
                    $this->breadcrumbs[] = [$cat->name, $this->rewrite->catalog->url."/".implode("/", $url)];
                    if($cat->url != $uri[$urikey])        //проверка всех категорий урла на правильную вложенность
                        return false;
                }
            }
        }
        $this->breadcrumbs[] = [$product->name, ""];    //добавляем хлебную крошку к товару
        $this->design->assign('breadcrumbs', $this->breadcrumbs);
        /********** хлебные крошки и проверка на категории / бренд ***********/

 

и также перед функцией fetch() добавляем public $breadcrumbs = array();

На этом с контролером всё.

Далее шаблон.

файл design/html/products.tpl, этот код:

{* Канонический адрес страницы *}
{if $category && $brand}
{$canonical="/catalog/{$category->url}/{$brand->url}" scope=parent}
{elseif $category}
{$canonical="/catalog/{$category->url}" scope=parent}
{elseif $brand}
{$canonical="/brands/{$brand->url}" scope=parent}
{elseif $keyword}
{$canonical="/products?keyword={$keyword|escape}" scope=parent}
{else}
{$canonical="/products" scope=parent}
{/if}

меняем на:

{if $brand}
{$canonical="/{$rewrite->brands->url}/{$brand->url}" scope=parent}
{elseif $keyword}
{$canonical="/{$rewrite->catalog->url}?keyword={$keyword|escape}" scope=parent}
{else}
{$canonical="/{$rewrite->catalog->url}" scope=parent}
{/if}

Далее это:

{* Фильтр по брендам *}
{if $category->brands}
<div id="brands">
    <a href="catalog/{$category->url}" {if !$brand->id}class="selected"{/if}>Все бренды</a>
    {foreach $brand->brands as $b}
        <a data-brand="{$b->id}" href="{if $rewrite->uri[1]}{$rewrite->prevurl}{else}{$rewrite->url}{/if}/{$b->url}"><img src="{$config->brands_images_dir}{$b->image}" alt="{$b->name|escape}"></a>
    {/foreach}

    {foreach $category->brands as $b}
        {if $b->image}
        <a data-brand="{$b->id}" href="catalog/{$category->url}/{$b->url}"><img src="{$config->brands_images_dir}{$b->image}" alt="{$b->name|escape}"></a>
        {else}
        <a data-brand="{$b->id}" href="catalog/{$category->url}/{$b->url}" {if $b->id == $brand->id}class="selected"{/if}>{$b->name|escape}</a>
        {/if}
    {/foreach}
</div>
{/if}

меняем на

{* Фильтр по брендам *}
{if $category->brands}
<div id="brands">
    <a href="{$rewrite->catalog->url}" {if !$brand->id}class="selected"{/if}>Все бренды</a>
    {foreach $category->brands as $b}
        <a style="{if $b->url|in_array:$rewrite->uri}font-weight:bold;{/if}" data-brand="{$b->id}" href="{$rewrite->brands->url}/{$b->url}"><img src="{$config->brands_images_dir}{$b->image}" alt="{$b->name|escape}"></a>
    {/foreach}
</div>
{/if}

 

Ищем

<div id="path">
    <a href="/">Главная</a>
    {if $category}
    {foreach $category->path as $cat}
    → <a href="catalog/{$cat->url}">{$cat->name|escape}</a>
    {/foreach}
    {if $brand}
    → <a href="catalog/{$cat->url}/{$brand->url}">{$brand->name|escape}</a>
    {/if}
    {elseif $brand}
    → <a href="brands/{$brand->url}">{$brand->name|escape}</a>
    {elseif $keyword}
    → Поиск
    {/if}
</div>

и заменяем на

<div id="path">
    <a href="/">Главная</a>
    {if $breadcrumbs}
    {assign "numbrc" $breadcrumbs|count-1}
    {foreach from=$breadcrumbs key=i item=arr}
        {if $numbrc == $i} → {$arr[0]|escape}{else} → <a href="/{$arr[1]}">{$arr[0]|escape}</a>{/if}
    {/foreach}
    {/if}
</div>

Ищем

<!-- Название товара -->
<h3 class="{if $product->featured}featured{/if}"><a data-product="{$product->id}" href="products/{$product->url}">{$product->name|escape}</a></h3> 

и меняем на

 

<!-- Название товара -->
<h3 class="{if $product->featured}featured{/if}"><a data-product="{$product->id}" href="{$rewrite->url}/{$product->url}{$rewrite->prefix}{$product->id}">{$product->name|escape}</a></h3> 


Тоже самое и для картинки

 

<a href="products/{$product->url}"><img src="{$product->image->filename|resize:200:200}" alt="{$product->name|escape}"/></a> 

на

 

<a href="{$rewrite->url}/{$product->url}{$rewrite->prefix}{$product->id}"><img src="{$product->image->filename|resize:200:200}" alt="{$product->name|escape}"/></a>

Находим файл index.tpl а в нем

 

            <div id="catalog_menu">
            {* Рекурсивная функция вывода дерева категорий *}
            {function name=categories_tree}
            {if $categories}
            <ul>
            {foreach $categories as $c}
                {* Показываем только видимые категории *}
                {if $c->visible}
                    <li>
                        {if $c->image}<img src="{$config->categories_images_dir}{$c->image}" alt="{$c->name|escape}">{/if}
                        <a {if $category->id == $c->id}class="selected"{/if} href="catalog/{$c->url}" data-category="{$c->id}">{$c->name|escape}</a>
                        {categories_tree categories=$c->subcategories}
                    </li>
                {/if}
            {/foreach}
            </ul>
            {/if}
            {/function}
            {categories_tree categories=$categories}
            </div>

меняем на

            <div id="catalog_menu">
            {include file='categories.tpl' categories=$categories}
            </div>

 

Дальше создаём собственно этот файл categories.tpl, который мы инклудили

{if $categories}
{if !isset($url)}{assign url $rewrite->catalog->url}{/if}
{if isset($prevurl)}{assign var="url" value="$url/$prevurl"}{/if}
{if $categories[0]->level == 1}
<ul>{foreach item=c from=$categories}
    {if $c->visible}
        <li>
            <a class="{if $c->url|in_array:$rewrite->uri}selected{/if}" href="{$url}/{$c->url}">{$c->name}</a>
            {include file='categories.tpl' prevurl=$c->url categories=$c->subcategories}
        </li>
    {/if}
    {/foreach}</ul>
{else}
<ul>{foreach item=c from=$categories}
    {if $c->visible}
        <li>
              <a class="{if $c->url|in_array:$rewrite->uri}selected{/if}" href="{$url}/{$c->url}">{$c->name}</a>
            {include file='categories.tpl' prevurl=$c->url categories=$c->subcategories}
        </li>
    {/if}
    {/foreach}</ul>
{/if}
{/if}

 

И последнее, находим файл product.tpl и меняем

{$canonical="/products/{$product->url}" scope=parent}

на

 

{$canurl = "{$rewrite->catalog->url}/{$rewrite->lasturi}"}
{if $rewrite->url != $canurl}
    {$canonical="/{$canurl}" scope=parent}
{/if}

Далее заменяем хлебные крошки по примеру файла products.tpl

 

Вобщем на этом всё. Если будут вопросы - пишите.

Да, небольшая инструкция, везде в коде где вы будете получать переменные $_GET, надо будет перепрописать их, например:

$menu = $_GET["menu"];

по новому будет выглядеть

$menu = $this->rewrite->arguments["menu"];

Либо получать их через системный клас request->get

Link to post
Share on other sites

пока все не смотрел, но есть проблема. любой товар доступен по любой ссылке вида /catalog/что-то там/товар_какоетоади

 

например можно так

catalog/wegwegwg/pylesos-dyson-dc23-pink-id24

catalog/bytovaya-tehnika/pylesos-dyson-dc23-pink-id232322235

catalog/bytovaya-tehnika/pylesosy/pylesos-dyson-dc23-pink-id999999

catalog/herherher/pylesos-dyson-dc23-pink-id6666666

 

а можно еще куча вариантов. всеровно выдаст этот товар. айди в конце ничего не играет, как и часть между catalog/ и названием товара.

Edited by mishanya
Link to post
Share on other sites

В файле view/productView.php сделать так, помечено комментарием

        /********** хлебные крошки и проверка на категории / бренд ***********/
        $uri = $this->rewrite->uri;
        //передаем в шаблон массив со ссылками (URL строкой разбитой по /) для активации выбранных меню
        $this->design->assign('rewrite', $this->rewrite);
        $num = count($uri) - 2;            //берем ПРЕДпоследний аргумент из урла - категорию или бренд
        $br_cat = $uri[$num];
        if($uri[0] == $this->rewrite->brands->url){    //для брендов
            $this->breadcrumbs[] = [$this->rewrite->brands->name, $this->rewrite->brands->url];
            $brand = $this->brands->get_brand((string) $br_cat);
            if(empty($brand))
                return false;
            $this->breadcrumbs[] = [$brand->name, $this->rewrite->brands->url."/".$brand->url];
        }
        else{    //для категорий
            $category = $this->categories->get_category((string) $br_cat);
            /****************************/
            if(empty($category))
                return false;
            /****************************/
            $this->breadcrumbs[] = [$this->rewrite->catalog->name, $this->rewrite->catalog->url];
            if(isset($category->path)){
                foreach($category->path AS $key => $cat){
                    $urikey = $key + 1;        //0 - /catalog/, поэтому +1
                    $url[] = $uri[$urikey];
                    $this->breadcrumbs[] = [$cat->name, $this->rewrite->catalog->url."/".implode("/", $url)];
                    if($cat->url != $uri[$urikey]){        //проверка всех категорий урла на правильную вложенность
                        return false;
                    }
                }
            }
        }
        $this->breadcrumbs[] = [$product->name, ""];    //добавляем хлебную крошку к товару
        $this->design->assign('breadcrumbs', $this->breadcrumbs);
        /********** хлебные крошки и проверка на категории / бренд ***********/
Edited by a13x
Link to post
Share on other sites

пока все не смотрел, но есть проблема. любой товар доступен по любой ссылке вида /catalog/что-то там/товар_какоетоади

 

например можно так

catalog/wegwegwg/pylesos-dyson-dc23-pink-id24

catalog/bytovaya-tehnika/pylesos-dyson-dc23-pink-id232322235

catalog/bytovaya-tehnika/pylesosy/pylesos-dyson-dc23-pink-id999999

catalog/herherher/pylesos-dyson-dc23-pink-id6666666

 

а можно еще куча вариантов. всеровно выдаст этот товар. айди в конце ничего не играет, как и часть между catalog/ и названием товара.

Этот id идентификатор того что ты заходишь в товар, а не в категорию. Впринципе можно сделать чтобы товар искался по этому ID, а не по ссылке как сейчас. Я оставил именно ссылку т.к. она изначально была в системе.

Нет, можно конечно сделать и без ID, тогда надо на несуществующей категории проверять товар. Может в дальнейшем так и сделаю, а пока оставлю так

Edited by a13x
Link to post
Share on other sites

Зачем вот это все? не понимаю...

Наплодить кучу дублей, а потом бороться с ними через каноникал? Какой-то бред.

Не проще сразу при сохранении товара сформировать полный урл вида

http://routing.simpla.pp.ua/mobilnye-telefony/samsung-s5570-galaxy-mini-2

И потом прямо по нему проверять?

А генерить РАЗНЫЕ ссылки и крошки для ОДНОГО товара - это глупость и не имеет смысла.

Link to post
Share on other sites

Все эти дубли отдаются через rel canonical, а надо это для визуализации и наглядности.

Все дубли проверяются и в canonical отдаётся ссылка вида: /catalog/item-name-id5

 

Не проще сразу при сохранении товара сформировать полный урл вида

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

 

А генерить РАЗНЫЕ ссылки и крошки для ОДНОГО товара - это глупость и не имеет смысла.

:lol: видимо вы не очень хорошо знакомы с сео раскруткой

Edited by a13x
Link to post
Share on other sites

Этот id идентификатор того что ты заходишь в товар, а не в категорию. Впринципе можно сделать чтобы товар искался по этому ID, а не по ссылке как сейчас. Я оставил именно ссылку т.к. она изначально была в системе.

 

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

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

Edited by mishanya
Link to post
Share on other sites

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

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

Согласен, надо будет переписать эту часть и отказаться от ID вобще, либо проверять по этому ID :D

Edited by a13x
Link to post
Share on other sites

как то вроде многовато правок по движку...

 

А почему не сделать разбор реврайта прямо в классе request? Или же в его конструкторе вызвать иницализацию api rewrite с дальнейшей подменой глобальных _POST и _GET. Тогда, я думаю, не придется столько править файлов. 

 

что касается ссылки catalog.

Можно сделать ссылку вида /catalog/категория1/категория2/product_продукт3

далее при разборе если в последней части урл начинается с "product_" - значит это товар

 

и просто проверяем цепочку url категорий 

Link to post
Share on other sites

 

далее при разборе если в последней части урл начинается с "product_" - значит это товар

Всё правильно, я этот вариант тоже начал рассматривать, не знаю зачем я с ID заморочился.

 

 

А почему не сделать разбор реврайта прямо в классе request? Или же в его

конструкторе вызвать иницализацию api rewrite с дальнейшей подменой

глобальных _POST и _GET. Тогда, я думаю, не придется столько править

файлов.

Везде где есть запросы не через класс request - придётся править. Я пока нашёл это в двух местах - index.php и resize.php. Во всех остальных местах всё через класс request обрабатывается.

Слишком объёмный конструктор получится + много данных надо передавать в смарти, поэтому мне было проще сделать новый класс.

По поводу объёмных модификаций, то иначе не получается. Хотел как можно меньше затрагивать файлы, но это минимум который получился. На моём шаблоне правок гораздо больше.

Если получится оптимизировать - напишите своё решение, буду рад взглянуть.

Edited by a13x
Link to post
Share on other sites

ну делайте разбор в своем api. Что мешает ?

 

1) делаете в __construct класса Request первой строкой $this->rewrite->init();

 

2) в методе rewrite->init делаете весь разбор с записью данных в _GET.

К примеру товар, по результату, что бы массив получался вида:

$_GET['module'] = 'ProductView';

$_GET['product_url'] = 'url_product/';

 

и тд. 

Тогда в дальнейшем зачем вся эта куча правок? 

 
PS: только блок на админку нужно сделать
Edited by yr4ik
Link to post
Share on other sites

 

ну делайте разбор в своем api. Что мешает ?

 

1) делаете в __construct класса Request первой строкой $this->rewrite->init();

 

2) в методе rewrite->init делаете весь разбор с записью данных в _GET.

К примеру товар, по результату, что бы массив получался вида:

$_GET['module'] = 'ProductView';

$_GET['product_url'] = 'url_product/';

 

и тд. 

Тогда в дальнейшем зачем вся эта куча правок? 

 
PS: только блок на админку нужно сделать

Куча правок не относится к получению гет запросов, всё что связано с гет правится в классе request и в дальнейшем убираются из файлов переменные, которые определяются через этот GET (всего в 2-ух файлах). 50% остального кода это шаблонный вывод и ещё процентов 45 связан с проверками категорий, товаров и прочего.  Поэтому что-то ещё лучше оптимизировать врядли получится, но если вы сможете, то напишите ;)

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...