Re: Убрать /brand/ из URL производителя

Владимир 1916 пишет:

Закусило Александр, а по моему вопросу подскажите, пожалуйста.

Только опять косяк вылез - теперь если выбираем несколько производителей, то показывает только товары последнего выбранного производителя. Видимо, где-то еще нужно вместо [] вставить [0]. Только не пойму где.

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

27 Отредактировано Владимир 1916 (10.10.2016 19:21:24)

Re: Убрать /brand/ из URL производителя

В фильтре товаров по производителю, когда в чекбоксе выбираем производителей формируется URL
https:/site.ru/catalog/categoria1/?bfilter[brand][]=17&bfilter[brand][]=13&bfilter[brand][]=25

но этот URL неверный, т.к. пагинация формирует другой:
https:/site.ru/catalog/categoria1/?bfilter[brand][0]=17&bfilter[brand][1]=13&bfilter[brand][2]=25

как видоизменить код в шаблоне

 <ul class="propsContent">
                
                    {foreach $brands as $brand}
                
                                        <li>
                        <input type="checkbox" {if is_array($basefilters.brand) && in_array($brand.id, basefilters.brand)}checked{/if} name="bfilter[brand][]" value="{$brand.id}" class="cb" id="cb_{$brand.id}_{$smarty.foreach.i.iteration}">
                        <label for="cb_{$brand.id}_{$smarty.foreach.i.iteration}">{$brand.title}</label>
                    </li>
            
                    {/foreach}
                </ul>

чтобы в фильтре формировался URL
https:/site.ru/catalog/categoria1/?bfilter[brand][0]=17&bfilter[brand][1]=13&bfilter[brand][2]=25

?

Повысить оценку Понизить оценку

Re: Убрать /brand/ из URL производителя

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

Повысить оценку Понизить оценку

Re: Убрать /brand/ из URL производителя

Я понял. Это надо Вам в поддержку. Либо поменять jquery.filters.js в модуле каталог. Но лучше поддержка.

Re: Убрать /brand/ из URL производителя

Обращение в поддержку написал.

Повысить оценку Понизить оценку

Re: Убрать /brand/ из URL производителя

Закусило Александр пишет:

Я понял. Это надо Вам в поддержку. Либо поменять jquery.filters.js в модуле каталог. Но лучше поддержка.

А можете подсказать, что в jquery.filters.js поменять нужно, чтобы получался URL типа:
https:/site.ru/catalog/categoria1/?bfilter[brand][0]=17&bfilter[brand][1]=13&bfilter[brand][2]=25
?

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

Повысить оценку Понизить оценку

Re: Убрать /brand/ из URL производителя

Вам надо смотреть метод buildFilterUrl, там строка:

queryStr += valuesArray[nval]['name']+"="+encodeURIComponent(valuesArray[nval]['value']);

Именно она формирует итоговый адрес. Соответственно нужно его как-то менять. Я пока не придумал как.
Посмотреть что внутри можно при помощи console.log.

Re: Убрать /brand/ из URL производителя

Это кусок кода из jquery.filters.js
 

var buildFilterUrl = function(valuesArray){
                //Разберём для построения
                queryStr = "";                 //Строка запроса
                valcnt   = valuesArray.length; //Количество фильтров    
                
                for(nval in valuesArray){      //Составим запрос
                    queryStr += valuesArray[nval]['name']+"="+encodeURIComponent(valuesArray[nval]['value']);
                    if (nval<valcnt-1){
                       queryStr += "&"; 
                    }
                }
                url = "//"+document.location.hostname+document.location.pathname;  //url для подстановки в браузер
                if (valcnt>0){
                   url +="?"+queryStr; 
                }
                
                return url;
            };         

Можно как-то значение nval отсюда вытаcкивать и передавать в шаблон filters.tpl
?



Тогда я смогу сделать, что если выбран только один параметр (т.е. nval == 0) то в шаблоне вставлять
name="bfilter[brand][0] вместо name="bfilter[brand][]

а если nval > 0 то оставляю name="bfilter[brand][]

Повысить оценку Понизить оценку

Re: Убрать /brand/ из URL производителя

Мне видится что нужно распарсить саму итоговую строку на предмет скобок [] и заменять их на [0], [1], [2]. Но это пока первое что пришло в голову. Решение не идеальное. Идеального пока не придумал.

Re: Убрать /brand/ из URL производителя

попробовал так

queryStr += valuesArray[nval]['name'].slice(0, -2)+"["+[nval]+"]"+"="+encodeURIComponent(valuesArray[nval]['value']);

т.е. [] обрезаем, а добавляем [0], [1] и т.п.

на локалке прокатило, а на хостинге вызвало зависание сайта.
Так наверное, нельзя делать?
Может в какой-то другой массив передать, а оттуда уже в строку подставлять?

Повысить оценку Понизить оценку

36 Отредактировано Закусило Александр (19.10.2016 11:59:39)

Re: Убрать /brand/ из URL производителя

на локалке прокатило, а на хостинге вызвало зависание сайта.
Так наверное, нельзя делать?

Врядли это как-то влияет. Скорее всего у Вас на хостинге вы включили сжатие. А в JS где-то не закрыли ;.

Я вчера поразмыслил и пришёл к выводу, что лучше это в JS не делать, т.к. на разных страницах порядок при добавлении в фильтр разный, и это приведет к путанице и лишним страницам.
Поэтому мой план поменялся. JS мы оставляем как есть. А пот менять будет то, что в пагинаторе
Чтобы было не [0], а []. Сделать это можно регуляркой.
Шаблон нам нужен paginator.tpl он в корне темы.
Заменить можно примерно так:

{$url=preg_replace('/\[\d+?\]/i', '[]', $url)}

По идее должно сработать.

Re: Убрать /brand/ из URL производителя

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

Если я правильно понял, решение принято и в дальнейшем обновлении будет везде []?

Повысить оценку Понизить оценку

Re: Убрать /brand/ из URL производителя

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

Если я правильно понял, решение принято и в дальнейшем обновлении будет везде []?

Я склоняюсь к этому варианту. Пока решение не принято. Но скорее всего будет так. Т.к. с порядком 0, 1, 2 будут проблемы.

Re: Убрать /brand/ из URL производителя

Закусило Александр пишет:

Шаблон нам нужен paginator.tpl он в корне темы.
Заменить можно примерно так:

{$url=preg_replace('/\[\d+?\]/i', '[]', $url)}

По идее должно сработать.

Что-то я не пойму, как это вставить в шаблоне.

{if $paginator->total_pages>1}
        <div class="paginator">
            {if $paginator->showFirst()}
            <a href="{$paginator->getPageHref(1)}" class="first" title="первая страница">&laquo;</a>
            {/if}
            {if $paginator->page>1}
            <a href="{$paginator->getPageHref($paginator->page-1)}" class="prev" title="предыдущая страница">&laquo;<span class="text"> назад</span></a>
            {/if}
            {foreach from=$paginator->getPageList() item=page}            
            <a href="{$page.href}" {if $page.act}class="act"{/if}>{if $page.class=='left'}&laquo;{$page.n}{elseif $page.class=='right'}{$page.n}&raquo;{else}{$page.n}{/if}</a>
            {/foreach}
            {if $paginator->page < $paginator->total_pages}
            <a href="{$paginator->getPageHref($paginator->page+1)}" class="next" title="следующая страница"><span class="text">вперед</span> &raquo;</a>
            {/if}
            {if $paginator->showLast()}
            <a href="{$paginator->getPageHref($paginator->total_pages)}" class="end" title="последняя страница">&raquo;</a>
            {/if}
        </div>
{/if}

Нужно вместо {$page.href} вставить {$page.href=preg_replace('/\[\d+?\]/i', '[]', $page.href)}     ?


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

Повысить оценку Понизить оценку

Re: Убрать /brand/ из URL производителя

Попробуйте так для страниц:

{foreach from=$paginator->getPageList() item=page}        
     {$page_href=preg_replace('/\[\d+?\]/i', '[]', $page.href}    
     <a href="{$page_href}" {if $page.act}class="act"{/if}>{if $page.class=='left'}&laquo;{$page.n}{elseif $page.class=='right'}{$page.n}&raquo;{else}{$page.n}{/if}</a>
{/foreach}

Смотрите кусок кода:
{foreach from=$paginator->getPageList() item=page}

41 Отредактировано Владимир 1916 (20.10.2016 20:20:38)

Re: Убрать /brand/ из URL производителя

Вставил {$page_href=preg_replace('/\[\d+?\]/i', '[]', $page.href)}  после {foreach from=$paginator->getPageList() item=page}

Никакого эффекта. [0], [1] как были так и остались для страниц 1,2,3:
/?bfilter[brand][0]=16&bfilter[brand][1]=13
/?bfilter[brand][0]=16&bfilter[brand][1]=13&p=2
/?bfilter[brand][0]=16&bfilter[brand][1]=13&p=3

кэш чистил, шаблон 100% тот, т.к. сперва ругалось на недостающую ) в {$page_href=preg_replace('/\[\d+?\]/i', '[]', $page.href}

Повысить оценку Понизить оценку

Re: Убрать /brand/ из URL производителя

Проверял этим сервисом https://ru.functions-online.com/preg_replace.html
- показывает [] как нужно.

А что на локальном сайте, что на хостинге остается [0]

Повысить оценку Понизить оценку

Re: Убрать /brand/ из URL производителя

Вчера советовался на другом форуме, диагноз такой, что preg_replace в Smarty работать не хочет.

http://searchengines.guru/showthread.php?t=947126

Повысить оценку Понизить оценку

44 Отредактировано Закусило Александр (21.10.2016 12:33:35)

Re: Убрать /brand/ из URL производителя

Вчера советовался на другом форуме, диагноз такой, что preg_replace в Smarty работать не хочет.

http://searchengines.guru/showthread.php?t=947126

Это полная чушь. У нас смарти последней версии и всё там прекрасно работает. Пусть читают документацию к Smarty 3.0.
http://www.smarty.net/docs/en/
И если они не знают, то через "." (точку), то это обращение к объекту как к массиву. А то что \Вам советовали {php} ..., то он в состоянии depricated. Т.е. скоро будет удалено.

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


Проверял этим сервисом https://ru.functions-online.com/preg_replace.html
- показывает [] как нужно.

А что на локальном сайте, что на хостинге остается [0]

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

/catalog/elektronika/?bfilter%5Bbrand%5D%5B0%5D=3&bfilter%5Bbrand%5D%5B1%5D=5&bfilter%5Bbrand%5D%5B2%5D=1&bfilter%5Bbrand%5D%5B3%5D=2&bfilter%5Bbrand%5D%5B4%5D=4&bfilter%5Bbrand%5D%5B5%5D=6&bfilter%5Bbrand%5D%5B6%5D=7&bfilter%5Bbrand%5D%5B7%5D=8&bfilter%5Bbrand%5D%5B8%5D=9&bfilter%5Bbrand%5D%5B9%5D=10&bfilter%5Bbrand%5D%5B10%5D=11&bfilter%5Bbrand%5D%5B11%5D=12&p=2

Т.е. [ это %5B ] это %5D, потому, что это правильная кодировка адресов через urlencode. Соответственно правильно будет так:

{$page_href=preg_replace('/\[\d+?\]/i', '[]', urldecode($page.href))}  

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

P.S. Мы всегда поддерживаем только одни из самых последних технологий.

Re: Убрать /brand/ из URL производителя

Закусило Александр пишет:
{$page_href=preg_replace('/\[\d+?\]/i', '[]', urldecode($page.href))}  

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

при возврате на первую стр. дает ссылку /?pf[][]=16
поменял регулярное выражение на {$page_href=preg_replace('#]\[\d+]#', '][]', urldecode($page.href))} 

остался вопрос с назад/вперед

<a href="{$paginator->getPageHref($paginator->page-1)}" class="prev" title="предыдущая страница">&laquo;<span class="text"> назад</span></a>

такую конструкцию {$paginator->getPageHref($paginator->page-1)} как заменить, например?

Повысить оценку Понизить оценку

Re: Убрать /brand/ из URL производителя

Также как и в пошлый раз.

{$page_prev=preg_replace('#]\[\d+]#', '][]', urldecode($paginator->getPageHref($paginator->page-1)))}  

Re: Убрать /brand/ из URL производителя

Спасибо!

Повысить оценку Понизить оценку

Re: Убрать /brand/ из URL производителя

Закусило Александр пишет:

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

Возвращаюсь к этому вопросу, т.к. мысль прописать ключевое слово в url не покидает меня. Ибо, 9 из 10, а то и 10 из 10 сайтов в ТОП-10 Яндекса имеют ключ либо в url, либо в доменном имени.

Техподдержка в свое время ответила, что
"Возможности использовать в фильтрах alias бренда - нет, так как это привело бы к увеличению нагрузки на БД."

Можно по-подробней как "подвесится на хук отработки блока с фильтрами, и подменять POST"?

Повысить оценку Понизить оценку

Re: Убрать /brand/ из URL производителя

Какой у Вас адрес получился в итоге?

Re: Убрать /brand/ из URL производителя

Закусило Александр пишет:

Какой у Вас адрес получился в итоге?

Пока что ничего не получилось.

Нужно чтобы вместо /catalog/category-name/?bfilter[brand][]=17
получилось /catalog/category-name/?bfilter[brand][]=brandname

Повысить оценку Понизить оценку