Форум пользователей Impera CMS
Impera CMS - отличный движок для лёгкого создания интернет магазина.
Обладает невероятным количеством функций, необходимых в онлайн торговле.

Следить
Главная
17:04
06 мая
#
?
написал:

Добрый день, подскажите пожалуйста как вывести фильтрацию по бренду внутри категории?
Спасибо :)

19:13
06 мая
#
написал:

Например так. Согласно ссылке Основные URL клиентской стороны сайта, есть такой формат адреса с элементами A (категория) и B (бренд):

http://ваш.сайт/catalog/A/filter_B  -  личная страница бренда B в пределах A

На всякий случай ещё укажу тот же адрес, когда категория имеет флажок Особый URL.

http://ваш.сайт/A/filter_B

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

  • $category - запись о текущей категории
  • $brand - запись о бренде, если выбран фильтром
  • $all_brands - массив записей о брендах

Кстати, для целей мультифильтра, следует помнить о переменных

  • $filter_params - QUERY-строка с прочими параметрами фильтра

То для этой категории мы можем перечислить все вариации фильтрующего адреса:

{$id = $brand->brand_id|default:0}

{$query = (!empty($filter_params)) ? "?$filter_params" : ''}

<div class="filter">
    Бренды:

    {foreach $all_brands as $item}
        {$class = ($id == $item->brand_id) ? 'class="active"' : ''}

        <a {$class} href="{url from=category}/filter_{$item->url|escape}{$query|escape}">
            {name}
        </a>
    {/foreach}
</div>
22:12
06 мая
#
?
написал:

воу воу воу, дружище, ты будто забыл о важном

  • сказать что этот код для products.tpl
  • что products.tpl используется для
    • 1) категории | http://сайт/catalog/Clocks
    • 2) бренда | http://сайт/brands/Orient
    • 3) категория + бренд | http://сайт/catalog/Clocks/filter_Orient
    • 4) весь каталог | http://сайт/products
  • твой код не учитывает случаи 2) 4)
00:17
07 мая
#
?
написал:

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

ЕСЛИ ЕСТЬ ХОТЬ ОДИН ТОВАР ИМЕЕТ БРЕНД {
    ПОКАЗЫВАЕМ ФИЛЬТР - Все Бренд1 Бренд2 ...
}

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

02:37
10 мая
#
?
написал:

Помогите пожалуйста разобраться :)

20:52
18 мая
#
?
написал:

Меня кто-нибудь слышит? :))

12:43
19 мая
#
?
написал:

змеля земля, слышу нормально))

или ты надурняса небельмеса, тогда разраб пусть за тебя думает

или не рубишь согласно ляпсусу

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

любая кмс селектит данные, шлёт вьюверу (шаблону), ничего она не считает

а выводится бренд или сначала катаегория, смотри логику своего products.tpl, наверно есть

{if $brand}
    боди бренда
{elseif $category}
    боди категории
{/if}
20:22
19 мая
#
?
написал:
Олег написал: кмс селектит данные, шлёт вьюверу (шаблону), ничего она не считает

Шаблон как часть сайта связан с cms, не так ли?

10:54
20 мая
#
написал:
Кирилл написал: Помогите пожалуйста разобраться

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

Модуль взят из шаблона Tools Viva Tools (вот живое демо фильтра, он спрятан под иконкой "воронка" справа над списком товаров). Спасибо ребятам из SAM за качественную сборку и оптимизацию.

Подсказка

  • Таким цветом помечены глобальные шаблонизационные функции, то есть те что закодированы в файле objects/.any-models/SmartyTags.php.
  • Таким цветом обозначены шаблонизационные функции, заданные хелпером шаблона, то есть находящиеся в файле design/Шаблон/html/helper.php.
    • Код этих функций приведу ещё ниже.
  • Таким цветом обозначены локальные функции, заданные прямо в теле модуля, то есть файле filter.htm.
    • Он располагается отдельным модулем среди файлов вашего шаблона и подключается в нужном месте макета обычной инструкцией {include 'путь-от-папки-html/filter.htm'}.
    • Смысл выделения таких участков кода в отдельные локальные функций состоит лишь в придании коду модуля удобочитаемого вида.
  • Таким цветом отмечены имена параметров, которые передаются в запросе фильтрующей страницы.
{* <!-- ===========================================================================
                                                                                  |
    Модуль: Фильтр товаров.                                                       |
    ----------------------------------------------------------------------------  |
                                                                                  |
    Входные переменные:                                                           |
        $brands = массив записей о брендах текущей категории                      |
        $properties = массив записей о свойствах текущей категории                |
        $variants = массив записей о названиях вариантов товаров в категории      |
        $cost_from = левая граница фильтра цены                                   |
        $cost_to = правая граница фильтра цены                                    |
        $filter_params = QUERY-строка текущих параметров фильтра                  |
            $smarty.request.filter_brand = массив отмеченных брендов              |
            $smarty.request.filter_property = массив отмеченных свойств           |
            $smarty.request.filter_variant = массив отмеченных имен вариантов     |
            $smarty.request.cost_from = отмеченная левая граница цены             |
            $smarty.request.cost_to = отмеченная правая граница цены              |
        $helper = объект системного хелпера шаблонов                              |
        $emulator = объект локального хелпера шаблона                             |
                                                                                  |
============================================================================ --> *}{strip}

    {* <!-- =======================================================================
    |                                                                             |
    |  Ссылка на страницу "все" (сбросить такой параметр фильтр):                 |
    |      $param = имя параметра                                                 |
    |                                                                             |
    ======================================================================== --> *}

    {function showAll}
        {requestUri except = "$param*"
                    nopages = TRUE}
    {/function}

    {* <!-- =======================================================================
    |                                                                             |
    |  Ссылка на страницу "фильтр по параметру":                                  |
    |      $param = имя параметра                                                 |
    |      $value = выбранное значение параметра                                  |
    |                                                                             |
    ======================================================================== --> *}

    {function showSuch}
        {requestUri except = "$param*"
                    nopages = TRUE
                    assign = uri}
        {$separator = (preg_match('/\?/u', $uri)) ? '&'
                                                  : '?'}
        {$uri}{$separator}{$param}[{$value|escape}]
    {/function}

    {* <!-- =======================================================================
    |                                                                             |
    |  Подсветка ссылки "все" (если выбрана):                                     |
    |      $filter = массив текущих параметров фильтра (индексирован по ИД)       |
    |      $id = ИД параметра                                                     |
    |                                                                             |
    ======================================================================== --> *}

    {function markAll}
        {if empty($id)}
            {if empty($filter)}
                class="active"
            {/if}
        {elseif empty($filter.$id)}
            class="active"
        {/if}
    {/function}

    {* <!-- =======================================================================
    |                                                                             |
    |  Подсветка ссылки "фильтр по параметру" (если выбрана):                     |
    |      $filter = массив текущих параметров фильтра (индексирован по ИД)       |
    |      $id = ИД параметра                                                     |
    |      $value = значение параметра                                            |
    |                                                                             |
    ======================================================================== --> *}

    {function markSuch}
        {if empty($id)}
            {if isset($filter.$value)}
                class="active"
            {/if}
        {elseif isset($filter.$id.$value)}
            class="active"
        {/if}
    {/function}

    {* <!-- =======================================================================
    |                                                                             |
    |  Подсветка пустой ссылки (если не имеет признак актуальности или товаров):  |
    |                                                                             |
    ======================================================================== --> *}

    {function markInactive}
        {if empty($item->actual) && empty($item->count)}
            data-empty
        {/if}
    {/function}

    {* <!-- =======================================================================
    |                                                                             |
    |  В хелпере шаблона могло быть отключено упреждающее чтение переменных       |
    |  фильтра, тогда читаем их сейчас.                                           |
    |                                                                             |
    ======================================================================== --> *}

    {if !isset($brands)}
        {$brands = $emulator->getFilterBrands()}
    {/if}
    {if !isset($variants)}
        {$variants = $emulator->getFilterVariants()}
    {/if}
    {if !isset($properties)}
        {$properties = $emulator->getFilterProperties()}
    {/if}

    {* <!-- =======================================================================
    |                                                                             |
    |  Фильтр по брендам.                                                         |
    |                                                                             |
    ======================================================================== --> *}

    {$param = ''}

    <table class="filter">
        {if !empty($brands)}
            {$id = 0}
            {$param = 'filter_brand'}
            {$filter = ($smarty.request.$param)|default:[]}
            <tr>
                <td>Бренд</td>
                <td>
                    <a href="{showAll}" {markAll}>Все</a>
                    {foreach $brands as $item}
                        {$value = $item->brand_id|default:0}
                        <a href="{showSuch}" {markSuch} {markInactive}>
                            {name}
                        </a>
                    {/foreach}
                </td>
            </tr>
        {/if}

        {* <!-- ===================================================================
        |                                                                         |
        |  Фильтр по вариантам.                                                   |
        |                                                                         |
        ==================================================================== --> *}

        {if !empty($variants)}
            {$id = 0}
            {$param = 'filter_variant'}
            {$filter = ($smarty.request.$param)|default:[]}
            <tr>
                <td>Вариант</td>
                <td>
                    <a href="{showAll}" {markAll}>Все</a>
                    {foreach $variants as $item}
                        {$value = $item->name|default:''}
                        <a href="{showSuch}" {markSuch} {markInactive}>
                            {$value}
                        </a>
                    {/foreach}
                </td>
            </tr>
        {/if}

        {* <!-- ===================================================================
        |                                                                         |
        |  Фильтр по свойствам.                                                   |
        |                                                                         |
        ==================================================================== --> *}

        {if !empty($properties)}
            {$param = 'filter_property'}
            {$filter = ($smarty.request.$param)|default:[]}
            {foreach $properties as $property}
                {if !empty($property->options)}
                    {$id = $property->property_id|default:0}
                    {$param = "filter_property[$id]"}
                    <tr>
                        <td>{name from = property}</td>
                        <td>
                            <a href="{showAll}" {markAll}>Все</a>
                            {foreach $property->options as $item}
                                {$value = $item->value|default:''}
                                <a href="{showSuch}" {markSuch} {markInactive}>
                                    {$value}
                                </a>
                            {/foreach}
                        </td>
                    </tr>
                {/if}
            {/foreach}
        {/if}

        {* <!-- ===================================================================
        |                                                                         |
        |  Если фильтр оказался пустым.                                           |
        |                                                                         |
        ==================================================================== --> *}

        {if empty($param)}
            <tr>
                <td>&nbsp;</td>
                <td>Нет данных для фильтра!</td>
            </tr>
        {/if}
    </table>

    {* <!-- =======================================================================
    |                                                                             |
    |  Напоминание + сброс фильтра.                                               |
    |                                                                             |
    ======================================================================== --> *}

    {if !empty($smarty.request.filter_brand)
    || !empty($smarty.request.filter_property)
    || !empty($smarty.request.filter_variant)
    || !empty($smarty.request.cost_from)
    || !empty($smarty.request.cost_to)}
        <div class="msg info">
            <form class="pull-right" action="{requestUri except='*' nopages=TRUE}" method="post">
                <input name="cost_from" type="hidden" value="" />
                <input name="cost_to" type="hidden" value="" />
                <input class="btn btn-small btn-primary" type="submit" value="Сбросить фильтр" />
            </form>
            Вы смотрите результаты с учётом фильтра.
            <div class="clearfix"></div>
        </div>
    {/if}

{/strip}

Теперь привожу код функций из хелпера шаблона.

  • Таким цветом обозначено то же, о чём говорилось выше.
  • Таким цветом обозначены вспомогательные методы хелпера, которые следует скопировать в хелпер своего шаблона, если таких методов там нет.
<?php /* ==========================================================================
                                                                                  |
    Скрипт: Хелпер шаблона.                                                       |
                                                                                  |
================================================================================ */

    class TemplateEmulator {
        ...

        /* ========================================================================
        |                                                                         |
        |    Регистрация наших шаблонизационных функций.                          |
        |                                                                         |
        ======================================================================== */

        ...

        /* ========================================================================
        |                                                                         |
        |    Обработчики наших функций.                                           |
        |                                                                         |
        ======================================================================== */

        ...

        /* ========================================================================
        |                                                                         |
        |    Функции объекта $emulator.                                           |
        |                                                                         |
        ======================================================================== */

        ...

        public function getFilterBrands ( $short = TRUE ) {
            $items = array();
            $category = isset($this->cms->category) ? $this->cms->category : null;
            if (empty($category->subcats_ids)) $category = $this->getVar('category');
            if (empty($category->subcats_ids)) return $items;
            $authorized = $this->existsUser();
            $ids = join($category->subcats_ids, ',');
            $query = 'SELECT ' . ($short ? '`brands`.`brand_id`, '
                                         . '`brands`.`name`, '
                                         : '`brands`.*, ')
                          . 'COUNT(DISTINCT `products`.`product_id`) AS `count` '
                   . 'FROM `brands` '
                   . 'LEFT JOIN `products` ON `products`.`brand_id` = `brands`.`brand_id` AND '
                                           . ($authorized ? '' : '`products`.`hidden` = 0 AND ')
                                           . '`products`.`enabled` = 1 '
                   . 'LEFT JOIN `products_categories` ON `products_categories`.`product_id` = `products`.`product_id` AND '
                                                      . '`products_categories`.`category_id` IN (' . $ids . ') '
                   . 'WHERE `brands`.`enabled` = 1 AND '
                         . ($authorized ? '' : '`brands`.`hidden` = 0 AND ')
                         . '(`products_categories`.`category_id` IS NULL AND '
                          . '`products`.`category_id` IN (' . $ids . ') OR '
                         . '`products_categories`.`category_id` IS NOT NULL AND '
                         . '`products`.`category_id` != `products_categories`.`category_id`) '
                   . 'GROUP BY `brands`.`brand_id` '
                   . 'ORDER BY `brands`.`name` ASC;';
            $result = $this->cms->db->query($query);
            if ($result !== FALSE) {
                while ($item = $this->cms->db->fetch_object($result)) {
                    if (empty($short)) $this->cms->db->fix_brands_record($item);
                    $item->actual = !empty($item->count);
                    array_push($items, $item);
                }
                $this->cms->db->free_result($result);
            }
            return $items;
        }

        public function getFilterVariants ( $short = TRUE ) {
            $items = array();
            ...
            return $items;
        }

        public function getFilterProperties ( $short = TRUE ) {
            $items = array();
            ...
            return $items;
        }

        public function existsUser ( $login = '' ) {
            if ($this->getUserId() == 0) return FALSE;
            return empty($login)
                   || isset($this->cms->user->email) && $this->cms->user->email == $login
                   || isset($this->cms->user->email2) && $this->cms->user->email2 == $login;
        }

        /* ========================================================================
        |                                                                         |
        |    Системные методы.                                                    |
        |                                                                         |
        ======================================================================== */

        ...

        private function getVar ( $name, & $smarty = null, $def = null ) {
            if (!is_null($smarty)) {
                $value = $smarty->getTemplateVars($name);
                if (!is_null($value)) return $value;
            }
            $value = $this->cms->smarty->getTemplateVars($name);
            if (!is_null($value)) return $value;
            return $def;
        }

        private function getUserId ( $item = null ) {
            if (is_object($item)) return isset($item->user_id) ? intval($item->user_id) : 0;
            return isset($this->cms->user->user_id) ? intval($this->cms->user->user_id) : 0;
        }
    }
?>
22:42
20 мая
#
?
написал:
Артём написал: Шаблон как часть сайта связан с cms, не так ли?

так да не так

связан с переменными, кмс просто подготовила их

мавр справился, дальше вьювер

вот пример одного шаблона в разных кмс и вьюверах

Написание ответа

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


Обратите внимание! Для противодействия спаму новые посты форума проявляются с задержкой от нескольких минут, пока не пройдут модерацию.