Как Вывести Фильтр На Страницах Скидки И Новинки?

На страницах Новинки и Скидки собираются все группы товаров.

Вопрос: Как вывести фильтр, чтобы уже можно было в нем указать категорию товаров?

Сортировка выводиться, а вот как странице Скидки привязать фильтр пока не понятно.

Прошу помощи знающих.

https://sonkota.ru/newest/

https://sonkota.ru/sale/

На страницах Новинки и Скидки собираются все группы товаров.

Вопрос: Как вывести фильтр, чтобы уже можно было в нем указать категорию товаров?

Сортировка выводиться, а вот как странице Скидки привязать фильтр пока не понятно.

Прошу помощи знающих.

https://sonkota.ru/newest/

https://sonkota.ru/sale/

Без изменения ядра - никак, т.к. там все возможные контроллеры для фильтров жестко приписаны

        $valid_locations = array(
            'categories.view',
            'product_features.view',
            'companies.products',
            'products.search'
        );

да фильтрами просто делается, через характеристику. И привязаны названия контроллеров, но не сами контроллеры ))) get_route_runtime - легко сменить что угодно.

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

При чем тут индусы и возможность сменить екшен в необходимом месте без правки ядра?
Например нужна двухсторонняя синхронизация заказов с 1с, подмена экшена дает возможность не вмешиваться в модуль и реализовать свой функционал.
А по сабжу - наличие это характеристика, при любом изменении товара просто проверять значение и записывать необходимое.

Спорить не буду. У нас это называется “костыль”.

Костыль - это когда в ядро лезут, а тут стандартная возможность расширить поведение стандартных контролеров, в мире PHP применяется во всех фреймворках. Ну а так как подход в cs-cart не классический Model-View-Controller, то и расширение методов допускается не наследованием контроллера, а хуком в выборе контроллера, называть такой документированный подход костылем ну как то нельзя, в любых популярных нормальных движках таких возможностей (“костылей”) гораздо больше.

Решение есть или нет? Если есть, можете описать?

Вот такой быстрый вариант для страницы скидок
Добавить блок смарти на шаблон нужной страницы
557 - айдишник мейн контента(установить свой).
Немного коряво работает, т.к. категории загружаются только те, что на первом листе с контентом, но не требует ни единого вмешательства в ядро или написания модулей.
Если очень сильно нужно - позже выложу полностью рабочий вариант

{assign var=sizearr value=[]}
{foreach from=$products item=product}
{$sizearr[$product.category_ids.0]=1}
{/foreach}
{foreach from=$sizearr|array_keys item=category_id}
<div>
<a class="cm-ajax cm-ajax-full-render" data-ca-target-id="on_sale_search_557" href="{"products.on_sale?cid=`$category_id`"|fn_url}">{$category_id|fn_get_category_name}</a>
</div>
{/foreach}

P.S. Не критикуйте за корявость, намётано в спешке домой)

1 лайк

Полностью рабочий вариант тоже бы не помешал. Спасибо :slightly_smiling_face:

Та пожалуйста :grinning:
Только учтите, что код избыточный и использует много ресурсов там, где можно этого не делать)

{assign var=sizearr value=[]}
{$params=$smarty.request}
{$params['on_sale'] = true}
{assign var=_products value=$params|fn_get_products}
{foreach from=$_products.0 item=product}
{$sizearr[$product.category_ids.0]=1}
{/foreach}
{foreach from=$sizearr|array_keys item=category_id}
<div style="border:1px solid">
<a class="cm-ajax cm-ajax-full-render" data-ca-target-id="on_sale_search_557" href="{"products.on_sale?cid=`$category_id`"|fn_url}">{$category_id|fn_get_category_name}</a>
</div>
{/foreach}