Тема: Модуль позволяющий выбирать цвет на сайте и применять фильтр по цвету.
Добрый день.
Вообщем как-то при продаже маек потребовалось сделать модуль, который выводил бы для фильтров разные в графическом виде. Да так чтобы можно было мышкой ткнуть и выбрался цвет и соответственно применялся фильтр.
Вот решение.
1. Качаем модуль цветов здесь.
2. Закидываем содержимое в папку modules
3. Устанавливаем модуль в админке Веб-сайт -> Настройка модулей. (Ищем Справочник цветов). Ссылка не установлен будет красным цветом
4. После установки обновляем кэш.
5. В меню появится "Цвета" в меню "Магазин".
Алгоритм добавления такой:
1. Создаём характеристику цвет в "Товары"->"Характеристики"
2. Заполняем значения характеристики и сохраняем. Например Красный Синий и т.д.
3. Идём к редактированию товара и выставляем у него значение характеристики цвет.
4. После заполнения значениями характеристики цвет товаров, идём в "Магазин" -> "Цвета". Нажимаем добавить цвет.
5. Указываем название точно равное Варианту цвета. Например "Красный" и собсвенно указываем красный цвет ему. И т.д. Создав палитру.
Работа с шаблонами:
Теперь необходимо вывести наше решение в фильтрах.
Для этого копируем шаблон из
/modules/catalog/view/blocks/sidefilters/filters.tpl
в
/templates/Ваша тема/moduleview/catalog/blocks/sidefilters/
И меняем его примерно так:
{addjs file="history.min.js" basepath="common"}
{addjs file="{$mod_js}jquery.filter.js" basepath="root"}
{*Подгружаем цвета*}
{modulegetvars name="\Colors\Controller\BlockValues" var="colors"}
{*Подгружаем цвета*}
<form method="GET" class="filters" action="{urlmake f=null bfilter=null p=null}">
<div class="side-left">
<div class="overlay"></div>
<div class="properties" data-base-url="{urlmake f=null p=null}">
{foreach from=$prop_list item=item}
{foreach from=$item.properties item=prop}
{if $prop.title == 'Цвет'}
<div class="block block-colors" data-filter-id="{$prop.id}">
<div class="separator-text">ЦВЕТ</div>
<div class="separator"> </div>
<ul>
{foreach from=$prop->getAllowedValues() key=key item=value}
<li {if isset($filters[$prop.id]) && in_array($value, $filters[$prop.id])}class="checked"{/if} data-filter-value="{$value}">
<div class="selected"></div>
<a href="?f[{$prop.id}][]={$value}" class="filter color{if $value=='Разноцвет'} multicolor{/if}" style="background-color:{$colors.colors[$value].color}" title="{$value}"></a>
<input type="checkbox" {if is_array($filters[$prop.id]) && in_array($value, $filters[$prop.id])}checked{/if} name="f[{$prop.id}][]" value="{$value}" style="display:none;"/>
</li>
{/foreach}
</ul>
</div>
{else}
<div class="block block-select" data-filter-id="{$prop.id}">
<div class="separator-text">{$prop.title}</div>
<div class="separator"> </div>
<ul>
{assign var=prop_values value=$prop->getAllowedValues()}
{if $prop.title=='Скидка %' && $prop_values}
{php}unset($prop_values[0]);{/php}
{/if}
{foreach from=$prop_values key=key item=value name=i}
{if !($prop.title=='Скидка %' && $value==0)}
<li {if isset($filters[$prop.id]) && in_array($value, $filters[$prop.id])}class="checked"{/if} data-filter-value="{$value}">
<a class="filter checkbox" href="?f[{$prop.id}][]={$value}">{$value}</a>
<input type="checkbox" {if is_array($filters[$prop.id]) && in_array($value, $filters[$prop.id])}checked{/if} name="f[{$prop.id}][]" value="{$value}" style="display:none;"/>
</li>
{/if}
{/foreach}
</ul>
</div>
{/if}
{/foreach}
{/foreach}
<input type="submit" value="Применить" class="onemore submitFilter" style="display:none;">
</div>
</div>
</form>
<script>
$(function() {
$(function() {
$('.side-left').productFilter({
targetList : '.updatable' //Div в который будет обновлён
});
});
$(window).bind('new-content', function() {
$('.side-left .overlay').hide();
});
$('.filter').on('click',function() {
var wrap = $(this).closest('li');
$(wrap).toggleClass('checked');
if ($(wrap).hasClass('checked')){
$('input',wrap).prop('checked',true).change();
}else{
$('input',wrap).prop('checked',false).change();
}
return false;
});
});
</script>
Сохраняем.
Теперь поправим CSS добавив стили нашим цветам. Например добавив в style.css
.block-colors ul .selected {
border: 2px solid #dd0080;
bottom: -2px;
display: none;
left: -4px;
position: absolute;
right: -2px;
top: -4px;
}
.block-colors ul .checked .selected {
display: block;
}
.block-colors ul {
list-style: none outside none;
margin: 0 18px;
overflow: hidden;
padding: 0;
}
.block-colors ul li {
background: none repeat scroll 0 0 #ececec;
float: left;
height: 24px;
margin: 5px;
position: relative;
width: 24px;
}
.block-colors ul .selected {
border: 2px solid #dd0080;
bottom: -2px;
display: none;
left: -4px;
position: absolute;
right: -2px;
top: -4px;
}
.block-colors ul .checked .selected {
display: block;
}
.block-colors ul li a {
box-shadow: 0 0 3px silver;
left: -1px;
position: relative;
top: -1px;
}