Получить значения примененных фильтров Есть решение

Здравствуйте.

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

Всем спасибо за помощь.

5 ответов

  • 1
    Плебей 14 июня 2021 08:20 #

    Перечень фильтров, пусть немножко извращенным способом, но я получил. Этот перечень у меня есть в подобном виде: "327,658,2171,14" и пишется из js в атрибут data. Примерно так:

    <div data-testarray="327,658,2171,14"></div>

    Теперь стоит другой вопрос: как этот список представить в виде массива в смарти? Что-то вроде:

    {assign var=myarray value=[ ... ]}

  • 1
    Eugen Nichikov 14 июня 2021 09:32 # Решение

    Если коротко - никак.

    Smarty и JS работают на разных уровнях. Smarty отрабатывает на сервере формируя конечный HTML, который будет передан в браузер. А JS уже работает в браузере.

    Поэтому, чтобы получить значения характеристик по их ID надо либо запрашивать у сервера значения (делать AJAX-запрос к написанному плагину). Либо сделать так, чтобы значения уже были переданы в JS.

    Например (Smarty)

    <script>
    var allfilters = {json_encode($filters)};
    </script>

    Если вывести в консоль переменную, будет что-то типа такого:

    А потом уже в нужном месте JS зная ID характеристики (feature_id) и ID значения (feature_value_id)) можно получить само текстовое значение:

    console.log(allfilters[feature_id].values[feature_value_id]);


    P.S. при использовании Smart FIlters вместо ID характеристики в переменную будет выведен её код.

    • +1
      Плебей Плебей 14 июня 2021 09:42 #

      Спасибо, Евгений.

      Как я написал чуть выше, мне удалось получить список ID примененных фильтров. Понимая, что из JS я их в smarty напрямую не передам, я их пишу в data некоего div. Теперь задача стоит как получившийся список преобразовать в массив smarty уже в шаблоне.

      • +2
        Eugen Nichikov Eugen Nichikov 14 июня 2021 13:21 #

        Повторюсь: если коротко - никак. Это совсем разные вещи.

        Если вы получили список ID применённых фильтров при помощи JS, тот уже поздно что-то делать в Smarty.

        Но фильтры же применяются на стороне сервера в любом случае. Можно смотреть как это реализовано в теме Default только на Smarty

        В цикле (1) перебираем все выведенные в тему фильтры. В следующем цикле (2) перебираем значения.

        Если ID значения (3) находится в GET-параметре (4) с кодом этой характеристики (5) выводим это значение (6).

        Т.е. примерно так

        {$values_by_code = []}
        {foreach $filters as $fid => $filter}
        	{if $fid != 'price'}
        		{foreach $filter.values as $v_id => $v}
        			{if in_array($v_id, (array)$wa->get($filter.code, array()))}
        				{$values_by_code[$filter.code][] = $v}
        			{/if}
        		{/foreach}
        	{/if}
        {/foreach}
        
        {$code = 'brand'}
        
        {* вывод выбранных значений характеристики с кодом $code *}
        {$values_by_code[$code]|wa_dumpc}

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

        • +1
          Плебей Плебей 14 июня 2021 19:20 #

          Евгений, спасибо Вам огромное!

          Я не совсем о том спрашивал. НО! Вы правильно уловили что я хочу получить в итоге и направили меня абсолютно верно. Не обратил внимание, что в фильтрации присутствует

          {if in_array($v_id, (array)$wa->get($filter.code, array()))}

          и складывал все отмеченные фильтры в список скриптом. А ведь все уже придумано ))) Пойду ковырять дальше...

          P.S. Ваш Liqpay я немножко видоизменил и получил двухстадийную оплату. Правда, автоматизацию процесса (стадии списания) не делал и оставил все в полуручном режиме.

          P.P.S. По поводу Укрпочты мой запрос в силе. )))

Добавить ответ

Чтобы добавить комментарий, зарегистрируйтесь или войдите