mSearch1 в нашем репозитории

Подготовил и выпустил версию mSearch 1.5.0, в которой фильтры работают с miniShop2. MS1 не поддерживается.

Конечно, кое-что еще поправлено в коде, но без фанатизма — только то, что PhpStorm подчеркивал красным.

Очень прошу не задавать вопросы по эксплуатации mFilter, изменений в принципах работы никаких нет. Всё также, как и было — только теперь для MS2. Используются его таблицы и сниппет msProducts.

Скорость, по сравнению с MS1 выросла драматически — можно оценить вот тут.
Загрузить новый mSearch можно в репозитории Simple Dream. Кто еще про него не в курсе — просвещайтесь.

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

Обновлено 25.05.13

Доработал компонент, выложил новую версию и разместил рабочий пример.

Что сделал:
— Исправил ошибку с сортировкой, котороя не давала нормально выводить позиции в версии 1.5.0
— Улучшил чанк mFilter, в нём теперь находится абсолютно всё нужное для нормальнй работы, кроме вызова jQuery (полагаю, он уже должен быть вызван раньше)
— Добавил параметр paginator. В него можно указать имя сниппета для вывода результатов постранично. По умолчанию там getPage, но можно указать и getPageExt, если вы его уже установили.
— Добавил обработку полей товара типа boolean. В них могут быть значения 0 или 1, что не очень красиво выглядит. Поэтому сделал так, чтобы они менялись на записи лексикона yes или no. В русском лексиконе это «Да» и «Нет».
— Добавил обработку полей опций товаров, которые json. То есть, свойства size и color выводятся без всяких плясок с бубном, автоматически.

В общем, потратил день, установил и заставил работать фильтр на minishop2.com.

Ну а теперь мини how to;
  • Качаем пакет из магазина Simple Dream, версия 1.5.1-beta
  • Индексируем ресурсы один раз:
    [[!mSearch?
    	&indexer=`1`
    	&limit=`0`
    ]]
  • Создаём новую страницу, вызываем на ней чанк [[$mFilter]]. Если вы обновляете пакет, нужно обновить и этот чанк вручную.
    Там указан вызов jQuery UI и сделана дефолтная разметка, в расчете на Bootstrap.
  • Где-то на сайте нужно разместить форму поиска:
    <form class="form-inline" action="[[~idстраницы_с_фильтром]]" method="get">
    	<input type="text" class="search-query" name="query" placeholder="поиск..." value="[[+mse.query]]" />
    	<button type="submit" class="btn"><i class="icon-search"></i></button>
    </form>
  • Ну а дальше остается только поискать в форме товар, что приведет вас на страницу с фильтром, и он покажет вам результаты своей работы.
  • Это если повезет. Если нет — смотрим в консоль браузера и разбираемся с ошибками.

Для изменения параметров фильтра смотрим в свойства сниппета — там много чего есть. Имена выводимых параметров завязаны на лексикон miniShop2, все парметры товаров выводятся как ms2_product_имяпараметра.

Сниппет старый, написан не очень дружелюбно и требует определенного уровня владения php и jquery. Год назад я просто не смог написать лучше — не хватало знаний и опыта.

Все ошиби и недостатки будут исправлены во второй версии, которая отличается от первой, как MS2 от MS1.

Обновлено 26.05.13

Инструкция, как фильтровать товары категории без поиска.

У сниппета есть параметр &resources=``, куда нужно передать id фильтруемых товаров. Позже я добавлю вывод id в msProducts, а пока можно использовать вот этот сниппет getCatIds:
<?php
if (!empty($_REQUEST['query'])) {
	$modx->setPlaceholder('parents', @$_REQUEST['parents']);
	return;
}

if (!isset($parents) || empty($parents)) {
	$parents = $modx->resource->id;
}
	
if (empty($depth)) {$depth = 1;}
$pids = array_map('trim', explode(',', $parents));
$parents = $pids;
foreach ($pids as $v) {
	if (!is_numeric($v)) {continue;}
	$parents = array_merge($parents, $modx->getChildIds($v, $depth));
}

$ids = array();
$q = $modx->newQuery('msProduct', array('parent:IN' => $parents, 'class_key' => 'msProduct', 'published' => 1, 'deleted' => 0));
$q->select('id');
if ($q->prepare() && $q->stmt->execute()) {
	$ids = $q->stmt->fetchAll(PDO::FETCH_COLUMN);
}

$q = $modx->newQuery('msCategoryMember', array('category_id:IN' => $parents));
$q->select('product_id');
if ($q->prepare() && $q->stmt->execute()) {
	$members = $q->stmt->fetchAll(PDO::FETCH_COLUMN);
}

if (!empty($members)) {$ids = array_merge($ids, $members);}
return implode(',', $ids);

Нужно указать параметр parents, с категориями через запятую, еще есть depth — глубина вложенности запроса.

Остаётся только вызвать сниппет в &resources=``:
[[!mFilter?
	&resources=`[[!getCatIds?parents=`idкатегории`]]`
	&includeMS=`1`
	&includeMSList=`price,new,favorite,popular,size,color`
	&sortFilters=`ms_new,ms_favorite,ms_popular,ms_size,ms_color,ms_price`
	&tpl=`tpl.msProducts.row`
]]

Посмотреть, как работает, можно вот тут.

Следующая заметка
[mSearch] Фильтрация товаров в MS2
Предыдущая заметка
[miniShop2] Версия 2.0.1-beta


Комментарии ()

  1. Wassi Wassinen 24 мая 2013, 15:08 # 0
    Свершилось! Вот спасибо :)
    1. Алексей Курохтин 24 мая 2013, 17:00 # 0
      Круто! А ты не будешь добавлять его на сайт minishop2.com? — потому что вопросы ты просил не задавать-но для особо непонятливых очень уж хочется посмотреть на код)
      1. Wassi Wassinen 24 мая 2013, 17:41 # 0
        Да, если кто-то сумеет запустить — покажите тестовый чанк и сниппет. Заранее благодарен.
        1. Василий Наумкин 25 мая 2013, 15:59 # 0
          Дополнил заметку, рабочий пример можно смотреть прямо в админке minishop2.com.
        2. Николай 25 мая 2013, 02:35 # 0
          Почему-то mSearch не выкачивается… У вас в в репозитории висит 1.4.2-pl
          1. Василий Наумкин 25 мая 2013, 06:23 # 0
            У нас в репозитории висит 1.5.0-pl.

            На данный момент, его скачали уже 19 раз.
          2. Pavel Kravchuk 26 мая 2013, 00:06 # 0
            Можно в mSearch 1.5 делать поиск по доп. полям например Артикул в Минишоп2?
            1. Василий Наумкин 26 мая 2013, 07:47 # 0
              Да, для этого нужно их проиндексировать.

              Поля товаров получаются как и остальные поля ресурса, поэтому достаточно указать в сниппет и плагине
              &indexFields=`pagetitle,longtitle,description,content,article`
            2. Сергей Шлоков 26 мая 2013, 10:49 # 0
              Василий, первое предложение поста звучит как-то не по-русски. :)
              Подготовил и выпустил версию mSearch 1.5.0, которая работает фильтров с miniShop2.
              1. Максим Степанов 27 мая 2013, 10:03 # 0
                подскажите а как вывести производителя? прописал так &includeMSList=`vender` а вместо производителя выводится id производителя
                1. Алексей Курохтин 27 мая 2013, 11:48 # 0
                  Прошу прощения за возможно глупый вопрос, а возможно ли в поиске использовать не чекбоксы а выпадающий список? -насколько я понял текстовые значения автоматически же преобразуются в чекбоксы.
                  1. Сергей Шлоков 30 мая 2013, 13:17 # 0
                  2. Сергей Шлоков 31 мая 2013, 14:17 # 0
                    Василий, вопрос по mFilter — делаю по примеру minishop2.com (но сам минишоп не установлен). Просто фильтр без поиска. Фильтрую по TV. Фильтры (чек-боксы) строятся, а сами товары (те что справа) не выводятся. Я так понимаю, должен отработать getResources (судя по 27 строчке сниппета), он он не работает.
                    В консоли FF ошибка:
                    Ошибка: TypeError: $(...).ajaxSubmit is not a function
                    Источник: http://сайт.ru/assets/components/msearch/js/mfilter.js
                    Строка: 83
                    По примеру Wassi хочу написать заметку по mFilter для новичков без опыта программирования (к коим и я принадлежу). Тем более, что запрос на данную тему есть. Само собой с твоего разрешения.
                    Видимо есть какая-то тонкость в работе mFilter без MS2. Но не могу ее уловить. Подскажи куда копать, возьму чайную ложку (до лопаты мне пока далеко, но лучше чем зубочистка) :)
                    1. Василий Наумкин 31 мая 2013, 14:42 # 0
                      Загуглить про ajaxSubmit не пробовал?

                      Нужен плагин jquery.form.
                      1. Сергей Шлоков 31 мая 2013, 16:44 # 0
                        Каюсь, нет. Я ж гутарю, не волшебник я, только учусь. :)
                        Щас загуглим.
                        1. Сергей Шлоков 31 мая 2013, 20:54 # 0
                          Вах, пачти работает. Осталось разобраться, почему плейсхолдеры не выводятся.
                          Из чанка tpl.mSearch.row
                          [[+num]]. <a href="[[~[[+id]]]]">[[+pagetitle]]</a>
                          <p>[[+intro]]</p>
                          
                          плейсхолдеры [[+num]] и [[+intro]] выводятся пустые. TV-шки тоже не хотят выводиться. Пробовал указывать параметр &tvPrefix=`` в mFilter. Результат одинаковый — пусто. Василий, опять нужен пинок для указания вектора поиска.
                          1. Василий Наумкин 31 мая 2013, 21:33 # 0
                            Они и не будут выводиться — это для сниппета mSearch, msProducts и getResources их не знают.

                            Нужно указать верный чанк для вывода ресурсов в параметре &tpl сниппета mFilter — и он будет передан выводящему сниппету.
                            1. Сергей Шлоков 31 мая 2013, 22:21 # 0
                              Так и для сниппета mFilter этот шаблон (tpl.mSearch.row) указан по умолчанию в параметре &tpl.
                              Я вызываю mFilter так
                              [[!mFilter? 
                                              &resources=`[[!getChildId?&parents=`7` &depth=`2`]]` 
                                              &includeTVs=`1` 
                                              &includeTVList=`bronzer,price,maker`
                                              &tvPrefix=``
                                              &limit=`10`
                                              &tpl=`product.tpl`
                                              &sortFilters=`tv_maker,tv_price,tv_bronzer`
                                              &sortby=`{"parent":"ASC","id":"ASC"}`
                                      ]]
                              Подключил свой шаблон product.tpl. Все работает замечательно, но TV-шки не выводятся. Осталось только это победить и можно радоваться.

                              1. Сергей Шлоков 31 мая 2013, 23:00 # 0
                                Почти победил. Но картинку не могу заставить показаться — srс у картинки пустой. Если через getResource выводить, все ОК. Если через mFilter — src пустой. Голова уже пухнет.
                                Василий, может хитрость какая есть с картинками?
                                1. Сергей Шлоков 01 июня 2013, 10:42 # 0
                                  Работает.
                                  Василий, ты не против заметки про mFilter?
                                  1. Василий Наумкин 01 июня 2013, 11:12 # 0
                                    Нет, конечно.

                                    Пиши, подвешу на главную.
                          2. Николай 02 июня 2013, 02:23 # 0
                            Отличная новость, а как со скоростью работы? У меня на MS1 с фильтрами беда, заполнил каталог, всего несколько категорий, но по 300-500 товаров в каждой и наступил ад… Фильтры загружают результаты по 40-60 секунд… Я там уже не представляю в какую сторону бежать…
                            1. Василий Наумкин 02 июня 2013, 09:54 # 0
                              В заметке вроде ясно написано:
                              Скорость, по сравнению с MS1 выросла драматически — можно оценить вот тут.

                              Тормозит в MS1 вывод через msGetResources, во второй части всё переделано как надо и тормозов нет. Если ты пользуешься первым MS1 то новый mSearch у тебя и вовсе работать не будет.
                            2. Иван Брежнев 06 июня 2013, 23:17 # 0
                              Что-то я не въеду в логику работы mSearch вот здесь mamaboutique.ru/search.html

                              Нажимаю в блоке «Раздел» сначала 48, 42 становиться не активным. Потом наоборот сначала 42, 48 активный. Если это не глюк расскажите секрет!
                              1. Андрей Ятин 09 июня 2013, 20:06 # 0
                                Здравствуйте, Василий. Подскажите, пожалуйста, в чем может быть проблема? Вызываю mFilter:
                                [[!mFilter?
                                	&resources=`[[!getCatIds?parents=`18`]]`
                                	&includeTVs=`0`
                                        &limit=`2`
                                	&includeMS=`1`
                                        &includeThumbs=`155x255`
                                	&includeMSList=`price,color,wine_type,sweetness,vendor`
                                	&sortFilters=`ms_color,ms_price,ms_wine_type,ms_sweetness,ms_vendor`
                                	&tpl=`productCHNK`
                                        &tplOuter=`mFilterOuter`
                                        &tplParamCheckbox=`mFilterParamCheckbox`
                                        &tplParamNumber=`mFilterParamNumber`
                                        &tplParamOuter=`mFilterParamOuter`
                                ]]
                                
                                Но фильтры выводятся только по color и price. Все дополнительные поля добавлены плагинами.
                                Не пойму где ошибка уже второй день. Заранее спасибо.
                                1. Василий Наумкин 09 июня 2013, 20:38 # 0
                                  В выбираемых 2х товарах везде разные значения в этих полях?

                                  Фильтр показывается только тогда, когда есть, что фильтровать.
                                  1. Андрей Ятин 09 июня 2013, 21:17 # 0
                                    Мдаа… Недосып сказывается)))) Спасибо большое за помощь. Об этом вообще не подумал.
                                Добавление новых комментариев отключено.