Для того, чтобы реализовать данный урок, вам необходимо приобрести компонент mSearch2 в магазине дополнений modstore.pro. Я это уже сделал:

В комплекте с компонентом mSearch2 идет три сниппета:
- mFilter2 – фильтрация карточек товара.
- mSearch2 – морфологический поиск.
- mSearchForm – форма поиска.
В данном уроке мы будем использовать только mFilter2. Фильтровать мы будем по следующим параметрам:
- Производитель – чекбоксы.
- Цена – у нас будет слайдер.
- Встроенная память – просто выбор чекбоксов – опция для телефонов и плееров.
- Количество ядер процессора – чекбоксы – опция для телефонов.
Этих параметров нам для обучения будет достаточно. Внимательные смогли отметить, что у нас нет последних двух параметров. Мы их сейчас реализуем. Переходим в “Приложения -> miniShop2 -> Настройки -> Опции”:

Как мы видим, в левой части экрана у нас расположены категории, по которым в дальнейшем будет возможна фильтрация опции, а в правой части экрана у нас будут перечислены опции.
Создаем первую опцию – “Встроенная память”:

Вам нужно сделать абсолютно также как на скриншоте. И создаем аналогично следующую опцию:

Также не забудьте создать производителей для новых карточек товара, которые мы добавляли в прошлом уроке. Теперь нам осталось заполнить данные параметры в наших карточках товара.

Когда мы заполнили карточки товара, мы можем непосредственно приступить к разработке нашего фильтра. Данная часть будет одной из самых масштабных в наших уроках.
Для начала нужно поработать над нашим шаблоном категории товаров. Я думаю, что дублирование меню нам здесь не нужно, поэтому я его уберу. А вот вывод последних товаров оставлю, только нам нужно создать чанк и сделать вывод. У меня чанк (featureProductTpl) получился вот такой:
<li class="sidebar-product-list-item">
<div class="row">
<div class="col-xs-4 col-sm-4 no-margin">
<a href="{$id | url}" class="thumb-holder">
{if $image?}
<img src="assets/images/blank.gif" data-echo="{$image}" alt="{$pagetitle}" title="{$pagetitle}"/>
{else}
<img src="{'assets_url' | option}components/minishop2/img/web/ms2_small.png"
srcset="{'assets_url' | option}components/minishop2/img/web/ms2_small@2x.png 2x"
alt="{$pagetitle}" title="{$pagetitle}"/>
{/if}
</a>
</div>
<div class="col-xs-8 col-sm-8 no-margin">
<a href="{$id | url}">{$pagetitle}</a>
<div class="price">
{if $old_price?}
<div class="price-prev">{$old_price} <i class="fa fa-ruble"></i></div>
{/if}
<div class="price-current">{$price} <i class="fa fa-ruble"></i></div>
</div>
</div>
</div>
</li>
А вызов msProducts вот такой:
<div class="widget"> <h2 class="border">Последнее поступление</h2> <ul class="product-list"> [[msProducts? &parents=`0` &tpl=`featureProductTpl` &limit=`5` &sortby=`publishedon` &sortdir=`DESC` ]] </ul> </div>
Теперь, когда мы убрали все лишнее, мы можем приступить к настройке фильтров. Процесс создания чанков будет аналогичен тому же процессу в miniShop2. Начнем мы создание наших чанков с чанка обертки (стандартный чанк “tpl.mFilter2.outer”). У меня он получился следующий:

У меня не проходит чанк через фильтры, поэтому смотрите на тестовом сайте. Про параметры я расскажу в видео и вы сможете прочитать про них в документации к компоненту.
Также я в чанке tpl.mFilter2.filter.checkbox добавил класс чекбоксам – le-checkbox.
Смотрите у нас заработал фильтр! Очень быстро не правда ли? Более того, это все быстро кастомизируется, что делает MODx одной из самых гибких CMS.
Теперь я приведу код css, который прописал как для корзины, так и для каталога и фильтра:
.product-grid-holder .product-item .image img,
.products-list .product-item .image img{
max-height: 200px;
}
.product-item-holder.hover .product-item .hover-area .add-cart-button:before {
z-index: -1;
}
.basket-item .thumb img,
.sidebar-product-list-item img {
max-height: 50px;
margin: 0 auto;
display: block;
}
.sidebar .widget .product-list li a.thumb-holder{
display: block;
max-width: 50px;
width: 100%;
margin: 0 auto;
}
#msCart img{
max-height: 95px;
}
header .top-cart-row .top-cart-holder .basket-item .close-btn,
#cart-page .items-holder .close-btn{
border: none;
padding: 0;
background: transparent;
}
.product-item .ribbons .ribbon:nth-child(2) {
margin-top: 30px;
}
.product-item .ribbons .ribbon:nth-child(3) {
margin-top: 60px;
}
.product-item .ribbons .ribbon:nth-child(4) {
margin-top: 90px;
}
.capital, .h1, h1, h2, .iconic-link, .btn-add-to-compare, .btn-add-to-wishlist, .availability, .availability .available, .availability .not-available, .section-title, .pagination a, .inline-input .placeholder, .simple-link, .top-bar ul > li a, header .top-cart-row .wishlist-compare-holder, header .top-cart-row .top-cart-holder .total-price-basket, .categories-filter, .breadcrumb-nav-holder .breadcrumb-item > a, .le-links li a, .accordion-widget .accordion .accordion-inner li a, .accordion-widget .accordion, .le-button, .le-dropdown .dropdown-toggle, .carousel-holder .title-nav h1, .carousel-holder .title-nav h2, .product-item-holder .body .title, #owl-main .caption .small, .banner .banner-text h1, .banner .banner-text .tagline, .nav-tabs li a, .nav-tabs li.active a, .btn-loadmore, .meta-row label, .meta-row span, .meta-row span a, #single-product-tab .new-review-form h2, .tabled-data li label, .tabled-data li .value, .field-row label, .comment-item .comment-body .author, #cart-page .widget .buttons-holder .simple-link, #checkout-page .billing-address .placeholder, #checkout-page #your-order .order-item .title, #payment-method-options .payment-method-option .radio-label, #payment-method-options .payment-method-option .value, .sidebar .price-range-holder .filter-button a, .sidebar .widget .product-list li a, .sidebar .widget .category-filter ul label, #footer h2, #footer h3, #footer .widget .body li a, #footer .link-list-row .contact-info, #footer .link-list-row .link-widget li a, #footer .copyright-bar{
text-transform: none;
}
.product-grid-holder .product-item-holder .prices{
overflow: hidden;
}
header .top-cart-row .top-cart-holder .dropdown-toggle .total-price {
font-size: 20px;
font-weight: bold;
}
#mse2_filters fieldset{
margin: 15px 0;
}
#mse2_filters h4{
margin-bottom: 15px;
font-weight: normal;
font-size: 18px;
}
.sidebar .widget .row{
margin-left: -15px;
margin-right: -15px;
}
.mse2_number_slider .ui-state-default,
.mse2_number_slider .ui-widget-content .ui-state-default,
.mse2_number_slider .ui-widget-header .ui-state-default,
.mse2_number_slider .ui-button,
html .mse2_number_slider .ui-button.ui-state-disabled:hover,
html .mse2_number_slider .ui-button.ui-state-disabled:active {
border: 1px solid #59B210!important;
background: #59B210!important;
font-weight: normal;
color: #59B210!important;
}
.ui-widget-header {
border: 1px solid #ddd;
background: #fff!important;
color: #333;
font-weight: bold;
}
.product-item-holder p{
font-size: 14px;
}
.grid-list-products .product-grid-holder .products-list .product-item-holder {
min-height: 0;
}
.products-list {
margin: 0;
}
.grid-list-products .grid-list-buttons ul li a.active i{
color: #59B210;
}
.grid-list-products .control-bar #popularity-sort{
width: auto;
display: inline-block;
vertical-align: sub;
}
Данный код я разместил в файле mytheme.css в папке assets/css/ и подключил после всех стилей в чанке meta.
<img src="/images/blank.gif" data-echo="{$image}" alt="{$pagetitle}" title="{$pagetitle}" width="200"/>замените на<img src="{$image}" alt="{$pagetitle}" title="{$pagetitle}" width="200"/>В своих проектах очень помогла!
[[!mFilter2? &class=`msProduct` &element=`msProducts` &parents=`[[*id]]` &tplOuter=`mFilter2OuterTpl` &tpls=`grid_product_tpl` &limit=`15` &aliases=` ms|size==size, msoption|knit==knit, ms|price==price ` &filters=` ms|size:default, msoption|knit:default, ms|price:number ` &tplFilter.outer.price=`tpl.mFilter2.filter.slider` &tplFilter.row.price=`tpl.mFilter2.filter.number` ]]скриншот:ibb.co/s9dzfdN[[!msProducts? &parents=`3` &tpl=`tvCategoryProductsTPL` &includeTVs=`menuactionimage,menuactionhref` ]]— тоже выводится, но именно картинки товаров, а нужно общую картинку категории. Думаю, было бы здорово вывести такую картинку к категориям на вашем тестовом сайте ecom2.dart.agency, по которому я и учусь, тем более, что и ТВ там готовы уже (для менюшки делали) и шаблон, осталось только вывести. И это было бы хорошим дополнением к статье :))![[pdoField? &id=`[[+parent]]` &field=`tv` ]]или же так:[[pdoMenu? &parents=`[[*id]]` &level=`1` &includeTVs=`menuactionimage,menuactionhref` &tplOuter=`@INLINE <section>[[+wrapper]]</section>` &tpl=`@INLINE <div class="dropdown-banner-holder"><a href="[[+menuactionhref]]"><img alt="" src="[[+menuactionimage]]" /></a></div>` ]]Хотя тоже заработало. А вот тогда ещё вопрос — почему не применяется фильтр обрезки к картинке, типа такого — Выводится всё-равно полноразмерным