Jump to content

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


Recommended Posts

Fixed.

http://simpla-url-rewrite.webtask.pro/catalog/bytovaya-tehnika/pylesosy/pylesos-dyson-dc32-animalpro

 

Чтобы сделать урл без префикса, достаточно в файле Urewrite.php заменить метод на product_check() на этот

    public function product_check(){
        $prod_url = $this->lasturi;
        $product = $this->products->get_product((string)$prod_url);
        if(isset($product)){
            $this->module = "ProductView";
            $this->arguments["product_url"] = $prod_url;
        }
    }

и в файле-шаблоне design/html/products.tpl сделать ссылку на товар вида:

<a data-product="{$product->id}" href="{$rewrite->url}/{$product->url}">{$product->name|escape}</a>

везде где это необходимо.

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

В файле view/ProductView.php найти условие

if(empty($category))

и зменить на:

if(empty($category) && $br_cat != $this->rewrite->catalog->url)
Edited by a13x
Link to post
Share on other sites
  • Replies 51
  • Created
  • Last Reply

Top Posters In This Topic

Вообщем вы не поняли к чему я вел... 

 

Ладно. Уберите хотя бы фатал ерор с ресайза. Там явно нет переменной $this 

Убрал.

 

1. В файле URewrite.php найти case "files": и внизу убрать слово exit();

2. В файле resize/resize.php сделать так

$filename = $simpla->rewrite->arguments["file"];
$token = $simpla->rewrite->arguments["token"];
Edited by a13x
Link to post
Share on other sites

 

Имеем дубли типа

http://simpla-url-rewrite.webtask.pro/catalog/bytovaya-tehnika/pylesosy/pylesos-dyson-dc32-animalpro

http://simpla-url-rewrite.webtask.pro/catalog/bytovaya-tehnika/pylesosy/pylesosy/pylesos-dyson-dc32-animalpro

http://simpla-url-rewrite.webtask.pro/catalog/bytovaya-tehnika/pylesosy/pylesosy/pylesosy/pylesos-dyson-dc32-animalpro

 

А все же, поясните глупому, зачем вся эта возня? Если хочется .htaccess  совсем не использовать, это еще понятно. Но пока вижу, что  .htaccess  сократили на 20-30 строк, но вместо этого написали горы нового кода, в котором еще ошибки править и править? Если это для адресов типа site.ru/catalog/cat_name1/cat_name2/prod_name, то это куда проще можно было бы сделать...

 

А в демо можете дать доступ к админке, чтоб проверить возможности некоторых ошибок?

Link to post
Share on other sites

Почитайте про тег LINK атрибут REL=CANONICAL и вы поймёте что это не дубли.

 

А все же, поясните глупому, зачем вся эта возня?

Я уже писал выше. Во первых, это делается для удобства пользователей сайта, во вторых это правильнее в плане сео раскрутки, в третьих избавление от кучи ненужных строк в htaccess и простой установкой на nginx.

 

 

Если хочется .htaccess  совсем не использовать, это еще понятно. Но

пока вижу, что  .htaccess  сократили на 20-30 строк

Совсем не использовать нельзя, 1 строка будет полюбому, где вы будете указывать обработчик урлов, поэтому я сократил не НА столько, а ДО стольких то. Если его почистить то можно оставить всего 4 строки, при условии что у вас правильно настроен апач.

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-l
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule (.*)$ /index.php?rewrite=$1 [L]

 

 

 

но вместо этого написали горы нового кода, в котором еще ошибки править и править?

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

Если это для адресов типа site.ru/catalog/cat_name1/cat_name2/prod_name, то это куда проще можно было бы сделать..

Например? Через htaccess? Спасибо, я уже видел этот кривой подход некоторых умельцев где идут строки длинной во весь экран с перечислением $1, $2, $3, $4 и так далее для разных урлов. Проблему можно решить по разному, кто-то решает так, флаг в руки.

 
А в демо можете дать доступ к админке, чтоб проверить возможности некоторых ошибок?

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

 

Link to post
Share on other sites

Ну нечего делать человеку - пусть фигней страдает... Не мешайте))

Вбил себе в голову, что так будет лучше - это проблемы его и его врача.



catalog/bytovaya-tehnika/pylesosy/pylesosy/pylesosy/pylesos-dyson-dc32-animalpro

Офигительная ссылка! Я просто ору...

Очень удобно для пользователей сайта.

Link to post
Share on other sites

Ну нечего делать человеку - пусть фигней страдает... Не мешайте))

Вбил себе в голову, что так будет лучше - это проблемы его и его врача.

Дружище, если я тебя чем то обидел, то извини, не хотел. Если я забрал часть твоего дохода от продаж твоего модуля, то я тоже не хотел, будь проще.

 

p.s. Только ты почему то сам сделал этот же модуль и продаёшь его, а мне вдруг врач нужен :lol: Попахивает двойными стандартами

Edited by a13x
Link to post
Share on other sites

Да мне пофиг))

И если ты ВНИМАТЕЛЬНО прочитаешь первое сообщение той темы - ты поймешь, почему твое решение НЕ ПОДОЙДЕТ.

Я аргументировал все свои ответы, а если вы чего-то не знаете, то это уже ваши проблемы. В СИМПЛА изначально идёт проверка на дубли, я лишь её переделал поскольку бренды и категории теперь не смешаны как это было раньше. А теперь вопрос, ПОЧЕМУ МОЁ РЕШЕНИЕ НЕ ПОДОЙДЁТ? получится аргументированно ответить или нет?

Систему битрикс по вашему наверно тоже дураки разрабатывали :lol:

Link to post
Share on other sites

 

P.S: до сих пор использую древнюю версию 1.4, так как в своё время кучу всего переписал в движке, а в новых версиях этих вещей до сих пор нет, и мне лень заново писать. Поэтому прошу не предлагать переходить на новую версию.

Достаточно аргументировано?

Link to post
Share on other sites
http://simpla-url-rewrite.webtask.pro/catalog/bytovaya-tehnika/pylesosy/bytovaya-tehnika/pylesosy/bytovaya-tehnika/pylesos-dyson-dc23-pink

И даже такая ссылка - это нормально?

Если разделены Бренды и Категории - сделай в Категории поле full_url, например.

И пиши в него полный урл категории вида bytovaya-tehnika/pylesosy

А по нему уже и проверяй.

http://prntscr.com/hk83t4

Я так делал в одном проекте. Это намного удобнее и не будет такого.

Link to post
Share on other sites

Или даже без поля в базе.

Собирать этот урл у категории в том месте, где собирается path

Но мне с хранением в базе было удобнее.

Просто попробуй - и удивишься, насколько все станет проще и удобней. и уйдет половина дублей.

Link to post
Share on other sites

Я уже писал выше. Во первых, это делается для удобства пользователей сайта, во вторых это правильнее в плане сео раскрутки, в третьих избавление от кучи ненужных строк в htaccess и простой установкой на nginx.

 

1. для удобства пользователей сайта,

2. правильнее в плане сео раскрутки,

3. избавление от кучи ненужных строк в htaccess,

4. простой установкой на nginx.

 

1. А в чем состоит удобство для пользователей? По-моему, они в большинстве случаев на URL внимания не обращают вообще.

 

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

2.1 site.ru/products/product_url

2.2 site.ru/catalog/cat1/cat2/product_url

2.2 site.ru/product_url - вообще без меток для разбора

2.4 site.ru/goods/product_url - со своей метки

А у Вас получается специфичная адресация. А надо бы более гибко.

 

3. И чем Вам эти строки помешали?

 

4. Тут еще есть некоторый смысл. Но и при существующей системе давно известно решение на порядок проще:

http://forum.simplacms.ru/topic/3243-simpla-cms-i-nginx/

 

 

А в демо можете дать доступ к админке, чтоб проверить возможности некоторых ошибок?
Я к админке не прикасался, она не тронута ни на грамм и должна работать как обычно. Насколько знаю там index.php файл всё обрабатывает и обработчик урлов не работает.

 

Даже если она работает как обычно, то результат зависит от данных, которые в ней введены.

Было интересно, в частности, создать товар с URL pylesosy и посмотреть, как будет при Вашей разработке определяться адрес bytovaya-tehnika/pylesosy - он подходит как для товара, так и для категории.

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

Link to post
Share on other sites

Помоему никто не будет создавать товар с таким же названием как у категории. Вы слишком категоричны + всегда для этого можно будет ввести префикс идентификации товара.

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

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

3. тем что при переносе на nginx их надо переписывать

4. решение есть и будет всегда, мой метод лишь объединяет всё это в одном, и конфиг нгинкса что вы скинули у меня выглядит так:

    location ~ (api|config|design/html|payment|smarty|view) {
        deny all;
    }

    location / {
         try_files $uri @urewrite;
    }
    location @urewrite {
        index index.php;
        rewrite ^/(.+)$ /index.php?rewrite=$1 last;
    }

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

Edited by a13x
Link to post
Share on other sites

 

http://simpla-url-rewrite.webtask.pro/catalog/bytovaya-tehnika/pylesosy/bytovaya-tehnika/pylesosy/bytovaya-tehnika/pylesos-dyson-dc23-pink

И даже такая ссылка - это нормально?

Если разделены Бренды и Категории - сделай в Категории поле full_url, например.

И пиши в него полный урл категории вида bytovaya-tehnika/pylesosy

А по нему уже и проверяй.

http://prntscr.com/hk83t4

Я так делал в одном проекте. Это намного удобнее и не будет такого.

По ссылке согласен, где то упустил проверку....допилил.

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

 

Чтобы исправить множественное вложение категорий, которое кроме как руками не вызвать, достаточно прописать в файле view/ProductView.php доп.проверку:

Найти код:

 

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;
} 

и зменить на:

 

foreach($category->path AS $key => $cat){
    $urikey = $key + 1;        //0 - /catalog/, поэтому +1
    $url[] = $uri[$urikey];
    $full_url = $this->rewrite->catalog->url."/".implode("/", $url);
    $this->breadcrumbs[] = [$cat->name, $full_url];
    if($cat->url != $uri[$urikey])
        return false;
}
$url_to_prod = $full_url."/".$this->rewrite->lasturi;
if($this->rewrite->url != $url_to_prod){
    header("Location: /".$url_to_prod, true, 301);
    exit();
} 
Edited by a13x
Link to post
Share on other sites

1. В симпле же если я зайду в товар, то по крошкам я увижу каталог и бренд, но не полную иерархию категорий товара

 

Как это? Вот, например, в товаре http://demo.simplacms.ru/products/pylesos-dyson-dc23-pink видна полная иерархия и еще бренд. Если вдруг последний не нравится, легко убрать пару строк в шаблоне.

Давным-давно сделано и чудесно работает...

 

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

 

Хорошо, сколько Вам времени надо, чтоб дописать в стиле

2.2 site.ru/product_url - вообще без меток для разбора

для товаров, категорий, блога и страниц?

Если можно, допишите на демо.

Идеально, если будет переключатель для разных стилей URL - обычный Ваш и стиль 2.2.

Подозреваю, что быстро без ошибок не сделаете.

 

3. тем что при переносе на nginx их надо переписывать

4. мой метод лишь объединяет всё это в одном

 

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

Помоему никто не будет создавать товар с таким же названием как у категории. Вы слишком категоричны + всегда для этого можно будет ввести префикс идентификации товара.

 

Программист не должен заниматься такими глупостями, как фантазировать, кто и как будет называть. Он должен стремиться к тому, чтоб его продукт работал корректно ВО ВСЕХ случаях, или хотя бы в большинстве.

 

5. А сейчас, как я понимаю, имеем очевидный недостаток: этот азбучный момент - защита от одинаковых URL - у Вас вообще не планировался...

Edited by Пастухов
Link to post
Share on other sites

 

5. А сейчас, как я понимаю, имеем очевидный недостаток: этот азбучный момент - защита от одинаковых URL - у Вас вообще не планировался...

О чём сейчас речь? Какие одинаковые урлы?

 

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

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

работал корректно ВО ВСЕХ случаях, или хотя бы в большинстве.

Я не хочу спорить, я лишь основываюсь на более чем 10-ти летнем опыте работы в этой сфере. Мне в принципе всё равно кто что должен и нет, я привык делать так, как будет удобно в дальнейшем мне и заказчику, так и делаю. По работе мне приходится продумывать ВСЕ мелочи, включая и такие, и в 99% случаев ни один нормальный человек не будет называть товар ПЫЛЕСОСЫ.

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

 

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

Пусть будет так, но я придумал решение которое не зависит от вебсервера (апач или нгинкс), решение которое ПРАВИЛЬНО отображает иерархию категорий. Да, может оно местами где-то сложно написано, но уж как есть.

 

 

Хорошо, сколько Вам времени надо, чтоб дописать в стиле

2.2 site.ru/product_url - вообще без меток для разбора

для товаров, категорий, блога и страниц?

Если можно, допишите на демо.

Идеально, если будет переключатель для разных стилей URL - обычный Ваш и стиль 2.2.

Подозреваю, что быстро без ошибок не сделаете.

Вся суть заключается лишь в проверке нет ли такой страницы, если нет то проверка по товару, если нет то проверка по блогу и так далее, но этот подход УЖЕ неправильный. У каждой страницы, у которой есть вложения должен быть свой адрес /catalog/, /blog/, /page/ и тп. Если для page сделали дефолтно (без префикса), то зачем это менять и что-то добавлять?

Суть этого модуля совсем не в этом.

 

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

Всё что мне надо это ссылка такого вида: http://demo.simplacms.ru/catalog/pylesosy/pylesos-dyson-dc23-pink со всеми вложениями, а этого по умолчанию нет

Edited by a13x
Link to post
Share on other sites

О чём сейчас речь? Какие одинаковые урлы?

Я не хочу спорить, я лишь основываюсь на более чем 10-ти летнем опыте работы в этой сфере. Мне в принципе всё равно кто что должен и нет, я привык делать так, как будет удобно в дальнейшем мне и заказчику, так и делаю. По работе мне приходится продумывать ВСЕ мелочи, включая и такие, и в 99% случаев ни один нормальный человек не будет называть товар ПЫЛЕСОСЫ.

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

 

"объясню ему как правильно называть товары" - Вот это и есть халтура программистская. А то он и так не знает, как называть - несколько символов на клавиатуре набрать.

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

Ему эти тысячи помнить надо? Или на бумаге список написать и сверять каждый раз, потому что программист не может простенький функционал по проверке написать?

 

 

1. Так что в итоге? Вам не нравится в хлебных крошках бренд. Вы не догадались, что это убирается элементарно в шаблоне, в вместо простенького действия проводите сложную доработку, которая для хлебных крошек ничего нового не добавляет - там и раньше был путь. Выходит, никакого добавочного удобства для посетителя доработка не несет.

 

 

 

 

Link to post
Share on other sites

Я уже писал что делает этот модуль и для чего он. Не вижу смысла повторяться. Если вас всё устраивает, значит он вам не нужен.

 

p.s. файл categories.tpl конечно же должен быть без одинакового вывода при проверке род. категории, а именно:

{if $categories}
{if !isset($url)}{assign url $rewrite->catalog->url}{/if}
{if isset($prevurl)}{assign var="url" value="$url/$prevurl"}{/if}
<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}
 

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

Edited by a13x
Link to post
Share on other sites

 

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

Это не про товар, а про категорию.

У категории же путь всегда одинаковый, правильно?

Link to post
Share on other sites

Это не про товар, а про категорию.

У категории же путь всегда одинаковый, правильно?

Да, правильно, можно и так реализовать, но тогда надо будет писать костыли для смарти на проверку активных категорий (когда добавляется класс active). В моём случае я проверяю по функции in_array(категория, массив категорий урла)

class="{if $c->url|in_array:$rewrite->uri}selected{/if}"

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

Link to post
Share on other sites
  • 3 months later...
  • 2 years later...

Отличное решение

нужно еще сделать в фильтрации и сортировке с:

http://simpla-url-rewrite.webtask.pro/catalog/mobilnye-telefony?4=Android+2.3

на:

http://simpla-url-rewrite.webtask.pro/catalog/mobilnye-telefony/Android_2.3

Могу предложить платное решение потому как тут простой маленькой инструкцией не обойтись, нужно вносить огромное количество изменений в движке и БД.
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...