Добрый день, подскажите пожалуйста как вывести фильтрацию по бренду внутри категории?
Спасибо :)
Добрый день, подскажите пожалуйста как вывести фильтрацию по бренду внутри категории?
Спасибо :)
Например так. Согласно ссылке Основные URL клиентской стороны сайта, есть такой формат адреса с элементами A (категория) и B (бренд):
http://ваш.сайт/catalog/A/filter_B - личная страница бренда B в пределах A
На всякий случай ещё укажу тот же адрес, когда категория имеет флажок Особый URL.
http://ваш.сайт/A/filter_B
В подобной записи адреса бренд является фильтром к странице категории. Так как на странице категории, в числе прочих, доступны следующие переменные
Кстати, для целей мультифильтра, следует помнить о переменных
То для этой категории мы можем перечислить все вариации фильтрующего адреса:
{$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>
воу воу воу, дружище, ты будто забыл о важном
При выполнении этой конструкции, я получил в каждой категории выбор всех брендов, а не только тех, товар которых присутствует в категории. Мне, можно сказать, нужно сделать фильтрацию по бренду, как была в обычной симпле.
ЕСЛИ ЕСТЬ ХОТЬ ОДИН ТОВАР ИМЕЕТ БРЕНД { ПОКАЗЫВАЕМ ФИЛЬТР - Все Бренд1 Бренд2 ... }
Еще один момент, при такой фильтрации выводится над товаром не описание категории а описание бренда, видимо потому, что система считает что мы уже находимся в бренде а не в категории. Как с этим быть?
змеля земля, слышу нормально))
или ты надурняса небельмеса, тогда разраб пусть за тебя думает
или не рубишь согласно ляпсусу
Кирилл написал: выводится над товаром не описание категории а описание бренда, видимо потому, что система считает что мы уже находимся в бренде
любая кмс селектит данные, шлёт вьюверу (шаблону), ничего она не считает
а выводится бренд или сначала катаегория, смотри логику своего products.tpl, наверно есть
{if $brand} боди бренда {elseif $category} боди категории {/if}
Олег написал: кмс селектит данные, шлёт вьюверу (шаблону), ничего она не считает
Шаблон как часть сайта связан с cms, не так ли?
Кирилл написал: Помогите пожалуйста разобраться
Приведу код классно написанного модуля фильтра. Он учитывает почти все тонкости и закоден как будто специально под низкую квалификацию фриланса, то есть оптимизирован до удобочитаемости с любым числом извилин.
Модуль взят из шаблона Tools Viva Tools (вот живое демо фильтра, он спрятан под иконкой "воронка" справа над списком товаров). Спасибо ребятам из SAM за качественную сборку и оптимизацию.
Подсказка
{* <!-- =========================================================================== | Модуль: Фильтр товаров. | ---------------------------------------------------------------------------- | | Входные переменные: | $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> </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; } } ?>
Артём написал: Шаблон как часть сайта связан с cms, не так ли?
так да не так
связан с переменными, кмс просто подготовила их
мавр справился, дальше вьювер
вот пример одного шаблона в разных кмс и вьюверах