mSearch: поиск + фильтр для MODX



Хочу представить свой компонент, который недавно был практически полностью переписан и расширен.

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

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

mSearch

Это сниппет и плагин. Сниппет ищет, плагин индексирует документы при сохранении.

Установка, как обычно, из репозитория, в 4 клика. При этом, вам будет предложено скачать и установить словари phpMorphy для русского языка — не отказывайтесь.

Если вы устанавливаете расширение на рабочий сайт, нужно будет проиндексировать имеющиеся документы. Делается это просто:
[[!mSearch?
  &indexer=`1`
  &offset=`0`
  &limit=`200`
]]
Первый параметр показывает, что мы не ищем, а индексируем, а второй и третий — ограничение выборки, для больших сайтов. Если документов много, а сервер дохлый — придется работать в несколько запусков, меняя значение offset, в данном примере сначала 0, потом 200, потом 400 и т.д.

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

Все параметры mSearch вы можете увидеть в свойствах сниппета, а сюда я напишу только основные:
  • &indexer — включение индексации. Нужно только один раз, после установки.
  • &indexFields — какие поля ресурса индексировать?
  • &disablePhpMorphy — отключение phpMorphy. Поиск становится гораздо менее точным.
  • &includeMS — при выводе результатов включать свойста товаров из miniShop.
  • &includeTVs — при выводе товаров включать ТВ параметры.
  • &includeTVList — список имен ТВ параметров, через запятую, для вывода.
  • &parents — список родителей, в которых будет производиться поиск на глубину 10 вложений, через запятую.
  • &returnIds — вместо оформленных результатов возвращать id найденных страниц, через запятую.
  • &resources — список обязательных ресурсов, через запятую, в которых будет произведен поиск.
  • &templates — искать только среди ресурсов с этими номерами шаблонов, через запятую.
  • &tpl — шаблон оформления вывода.
  • &where — JSON выражения для тонкой настройки вывода найденных ресурсов.
Параметры indexFields, includeTVs, includeTVList, disablePhpMorphy есть и у плагина. Они отвечают за индексацию ресурса при обновлении.
Также эти параметры влияют и на первичную индексацию (&indexer=`1`).

Обращая ваше внимание, что множество параметров не случайно называются как у getResources. Это означает, что и работают они так же. Сниппет прекрасно поддерживает вывод с пагинацией через getPage и может, в некоторых случая, спокойно заменять getResources.

Поиск идет по таблице индекса, что дает неплохую скорость, даже при большом количестве документов, проверял на ~6000 шт.

Конечно, этот метод не идеален, с релевантностью не все гладко, но лучше решения для русского языка и MODX в любом случае нет. Главное, на мой взгляд то, что можно довольно хорошо уточнить где искать, с каким шаблоном, среди каких родителей и т.д. Ну а параметр &where позволяет и вовсе, как угодно настроить поиск.

Погонять поиск можно тут. Учтите, что морфология работает только для русского языка.
Здесь можно посмотреть как выглядит SQL запрос. Там же чуть более подробный пример вызова сниппета.

Логичным применением mSearch стал поиск по товарам магазина, и вывод найденных результатов, вместо getResources. А это в свою очередь развилось в написание сниппета mFilter, для гибкой фильтрации найденных товаров.

mFilter

Это второй сниппет в mSearch. Он самостоятельно генерирует фильтры для найденных (или заранее указанных) ресурсов, используя чанки для оформления. Цифровые значения по умолчанию выводятся как слайдер, текстовые — как чекбоксы.

Фильтры строятся по ТВ параметрам ресурсов, и\или свойств товаров miniShop.

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

Работает довольно шустро, но на действительно больших объемах пока не проверял.

Основные параметры mFilter:
  • &resources — список ресурсов для работы, через запятую. Если не указать, попытается поискать результаты через mSearch.
  • &includeTVs — включить ТВ для генерации фильтров
  • &includeTVList — использовать эти ТВ, через запятую
  • &excludeTVList — не использовать эти ТВ, через запятую
  • &includeMS — брать параметры miniShop для построения фильтра
  • &includeMSList — какие именно поля товаров miniShop использовать для фильтра
  • &sortFilters — порядок вывода фильтров, с префиксами, например: `tv_category,tv_subcategory,ms_add2,tv_color,tv_size,tv_action,ms_price`
  • + если будете искать ресурсы, то любые параметры mSearch
  • + любые параметры getPage и\или getResources\msGetResources
Для вывода результатов фильтра необходимы сниппеты getPage, getResources (если используете miniShop — msGetResources).

Также требуются jquery плагины:
jQuery 1.7+ — основной помошник
jQueryUI 1.8+ — нужен только виджет slider для цен и других числовых значений
jQuery Form 2.7+ — отправка формы и прием ответа

Для вывода товаров из определенной категории магазина miniShop можно использовать такой сниппет getCatIds:
if (!empty($_REQUEST['query'])) {return;}
$parent = $modx->resource->id;

$tmp = $modx->getChildIds($parent);
if (empty($tmp)) {return 0;}
$tpls = explode(',', $modx->getOption('minishop.goods_tpl'));
$q = $modx->newQuery('modResource', array('id:IN' => $tmp, 'template:IN' => $tpls, 'deleted:!=' => 1, 'published' => 1));
$q->select('id');
if ($q->prepare() && $q->stmt->execute()) {
    $ids = $q->stmt->fetchAll(PDO::FETCH_COLUMN, 0);
    return implode(',', $ids);
}
Пример вызова:
[[!mFilter?
&resources=`[[!getCatIds]]`
&includeTVs=`1`
&includeTVList=`category,color,size,action`
&includeMS=`1`
&includeMSList=`add2,price`
&tpl=`tpl.msGoods.row`
&templates=`5`
&sortFilters=`tv_category,tv_subcategory,ms_add2,tv_color,tv_size,tv_action,ms_price`
]]

Заключение

Все чанки оформления и js скрипт для работы идут в комплекте. Конечно, не факт, что у вас все получится настроить как надо с первого раза, для этого нужны кое-какие знания MODX, jQuery и понимание работы Ajax. При всех «не работает!» первым делом смотрите в консоль своего браузера на предмет ошибок javascript.

Но я, как смог, постарался упростить задачу построения фильтра. И теперь, при определенном желании, вы сможете сделать это у себя на сайте\магазине.

Вся работа над mFilter была заказана и оплачена веб-студией Simple Dream.

Следующая заметка
Jason Coward обновил getPage до версии 1.2.3
Предыдущая заметка
Интернет магазин miniShop 1.7.1


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

  1. Denys Butenko 24 июня 2012, 22:58 # 0
    Какие-то непонятки с поиском.
    Установил modx вместе с minishop, потом поставил msearch.
    Так вот, вывел на главную страницу форму поиска, ввожу запрос — 502 ошибка, иногда переадресация успевает и domain.com/search.html?#page=1&sort=ms_price%2Casc&limit=9 Перекидывает на domain.com/search.html?
    Проверил все, на соседнем сайте 1 в 1, но работает. В каталоге выводятся товары, а через поиск не передается ?query=[[+mse.query]]
    Если передать в адресной строке domain.com/search.html?query=чтото
    тогда, поиск происходит.
    1. Denys Butenko 24 июня 2012, 23:20 # 0
      Если вызывать через mSearch — тот же результат, открывает domain.com/search.html? и всё.
      1. Василий Наумкин 25 июня 2012, 02:25 # 0
        Даже не знаю, что вам ответить. Не встречал такого.

        У вашей формы стоит method=«get»?

        Чтобы отключить для теста отправку форму после загрузке страницы с фильтром — попробуйте закомментировать в /assets/components/msearch/js/mfilter.js эту функцию goo.gl/tevLF
        1. Denys Butenko 25 июня 2012, 02:35 # 0
          Форма которая на главной странице — да.
          В принципе, настройки все дефолтные, или по крайней мере, точно рабочие.
          Закомментировал с 116-146 строки. Кэш почистил, проверил изменения в mfilter.js в браузере.
          Никаких изменения не произошло. Тоже самое /search.html? и все
          1. Denys Butenko 25 июня 2012, 02:40 # 0
            Мда, как всегда. Все проверил, еще раз зашел на modx-minishop, увидел разницу, в моей форме отсутствовал атрибут name=«query», который и стал виновником торжества.
            1. Василий Наумкин 25 июня 2012, 02:41 # 0
              Понятно =)
        2. Виталий Батушев 24 июля 2012, 05:39 # 0
          Бьюсь с mFilter.
          1. Обнаружил, что не поддерживаются «любые параметры getPage и\или getResources\msGetResources». Касается это, в частности, шаблона вывода пагинации в getPage, оно и понятно — mFilter просто не учитывает их.
          2. Фильтрация по TV не работает. По полям miniShop — все как надо, по TV — ни фига. При этом сами фильтры генерируются нормально, а вот выбрать — категорически не получается. mSearch эти TV проиндексировал (при поиске их видно).
          Вызов mFilter таков:
          [[!mFilter?
          &resources=`[[!getCatIds]]`
          &includeTVs=`1`
          &includeTVList=`good.vendor,good.os`
          &includeMS=`1`
          &includeMSList=`price`
          &tpl=`good.grid.item`
          &templates=`4`
          ]]
          Голову уже себе сломал, чего ему не хватает.
          1. Василий Наумкин 24 июля 2012, 06:24 # 0
            1. https://github.com/bezumkin/mSearch/blob/master/core/components/msearch/elements/snippets/snippet.mfilter.php#L39, внимательно смотрим на строку 52

            Все учитывается.

            2. А у меня работает. Давайте ссылку, где можно посмотреть.
            1. Виталий Батушев 24 июля 2012, 06:55 # 0
              Посмотрел. Потом посмотрел на тот, что у меня — разные файлы!
              И то верно. mFilter обновлен месяц назад, а версия 1.4.1 от 10 июня.
              1. Василий Наумкин 24 июля 2012, 07:09 # 0
                И по вашей ссылке параметры формы передаются через GET, а у меня — через POST.

                1. Виталий Батушев 24 июля 2012, 07:10 # 0
                  Это от отчаянья. Поправил. Лучше не стало.
                  1. Василий Наумкин 24 июля 2012, 07:18 # 0
                    Кидайте админский доступ к сайту, погляжу.

                    У вас там вообще параметры игнорируются, даже пагинация не пашет.
                    1. Виталий Батушев 24 июля 2012, 07:28 # 0
                      Кинул. У меня пагинация пашет, однако.
                      1. Василий Наумкин 24 июля 2012, 07:32 # 0
                        А через POST — не пашет. Я в форме поменял и фигу.

                        Сейчас поразбираюсь и отпишусь, в чем беда. Может, это моя недоработка.
                        1. Василий Наумкин 24 июля 2012, 07:43 # 0
                          Разгадка простая — не нужно называть ТВ параметры через точку.

                          Вместо good.vendor делайте good_vendor и все работает. Имя ТВ используется потом в массивах и прочей обработке — точка там не проходит.

                          А еще лучше, вообще так не делать, а раскладывать ТВ в категории. Тогда будут просто vendor, os, size и т.д.
                          1. Виталий Батушев 24 июля 2012, 07:50 # 0
                            Вот йолы! Большое спасибо! Будет здесь кто из Кемерова, попрошу передать бутылку рома.
            2. Виталий Батушев 29 июля 2012, 20:48 # 0
              И снова вопрос. А mSearch по артикулам товаров miniShop не ищет?
              1. Василий Наумкин 29 июля 2012, 20:57 # 0
                Должен искать, если товары индексируются с includeMS — смотрите настройка плагина.
                1. Виталий Батушев 29 июля 2012, 21:31 # 0
                  Смотрю вызов индексатора:
                  [[!mSearch?
                  &indexer=`1`
                  &limit=`1000`
                  &includeMS=`1`
                  &includeMSList=`article`
                  &includeTVs=`1`
                  ]]
                  Ищем реально существующий артикул: 2845B001. В ответ: Ничего не найдено.
                  1. Василий Наумкин 30 июля 2012, 06:10 # 0
                    Посмотрел в исходники — таблицы miniShop не индексируются =(

                    Или не доделал, или изначально не собирался, но факт есть факт.

                    Нужно делать небольшой плагин, который при OnSaveDocForm будет писать данные в индекс. Ну или в ТВ параметр — а он потом проиндексируестя.

                    Подвешал себе задание.
              2. Александр Розум 31 июля 2012, 18:29 # 0
                День добрый!
                Все никак не могу найти в скрипте часть кода, где вычисляется значение количества товара, которое показывается рядом с чекбоксами. Могли бы вы подсказать, где она находится?
                1. Василий Наумкин 31 июля 2012, 18:31 # 0
                  1. Александр Розум 31 июля 2012, 18:40 # 0
                    Благодарю
                2. Иван Брежнев 01 августа 2012, 19:32 # 0
                  Вопрос, возможно ли уменьшить потребление памяти mSearch'ем?
                  В сравнении с SimpleSearch, mSearch кушает значительно больше
                  1. Василий Наумкин 01 августа 2012, 19:38 # 0
                    Так он и ищет значительно лучше.

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

                    Еще можно в классе mSearch позамерять время через
                    $this->modx->log('', 'Эрап 1:'. microtime(true));
                    чтобы определить другие узкие места.

                    Правда, у меня пока такой потребности не возникало.
                    1. Иван Брежнев 01 августа 2012, 19:40 # 0
                      ОК) спасибо за наводку, вызываю через getPage, и если отключить у getPage кэширование &cache=`1`, то кушает много памяти при повторном обращении, из кэша конечно в разы быстрее, но тогда не всё элементы правильно работают
                    2. Василий Наумкин 01 августа 2012, 19:39 # 0
                      Отключает параметр &disablePhpMorphy=`1`
                      1. Иван Брежнев 01 августа 2012, 19:42 # 0
                        Во, теперь кушает в два раза меньше памяти, кушал 32, теперь 16, и это всего при 4 найденных элементах
                        1. Иван Брежнев 01 августа 2012, 19:43 # 0
                          phpMorphy оказывается прожорлевее ядра MODx
                      2. Иван Брежнев 01 августа 2012, 19:53 # 0
                        Еще вопросик, если мне нужно добавить условие к выборке, к примеру чтобы не выводились товары с нулевой ценой, для этого обязательно класс mSearch хакать? В msGetResources я делаю так &where=`{«ModGoods.price:!=»:0}`
                        1. Василий Наумкин 01 августа 2012, 20:10 # 0
                          И здесь так же, просто видимо не описал.

                          Вот исходник goo.gl/BPkJV
                          1. Иван Брежнев 01 августа 2012, 20:11 # 0
                            Точно, спасибо огромное, на странице компонента во вкладке параметры не нашел такого чуда)
                            1. Василий Наумкин 01 августа 2012, 20:14 # 0
                              Да не успеваю. Смотри changelog — там все изменения goo.gl/6ehby

                              &where появился аж в версии 1.3.0
                            2. Иван Брежнев 01 августа 2012, 20:14 # 0
                              А какой алиас у таблицы modGoods
                              Потому что «ModGoods.price:!=»:0 ничего не выводит
                              1. Василий Наумкин 01 августа 2012, 20:18 # 0
                                А модель miniShop подключена?

                                Вообще не уверен, что так получится, таблицу то еще джоинить надо. Ща не соображу — спать охота.
                                1. Иван Брежнев 01 августа 2012, 20:22 # 0
                                  ок, нада джойнить я думал что уже это сделано т.к. параметр includeMS=1
                                  1. Василий Наумкин 01 августа 2012, 20:35 # 0
                                    Это у mFilter.

                                    mSearch вроде так не умеет еще.
                                    1. Василий Наумкин 01 августа 2012, 21:03 # 0
                                      Вспомнил, почему так.

                                      mSearch ищет все что можно
                                      mFilter — фильтрует найденное.

                                      Поэтому и фильтра есть поддержка miniShop, а у поиска — нет. Ну и делались они с разное время.

                                      Поэтому, советую сделать на сайте фильтр для вывода найденных товаров.
                                      1. Иван Брежнев 01 августа 2012, 22:05 # 0
                                        ага, понял, буду юзать mFilter
                              2. Иван Брежнев 02 августа 2012, 12:31 # 0
                                Решил этот вопрос дописал условие

                                if (isset($this->config['includeMS']) && $this->config['includeMS']) {
                                $db_ms_join = «LEFT JOIN ms_modGoods `ModGoods` ON $db_index.`rid` = `ModGoods`.`gid`»;
                                }
                              3. Иван Брежнев 01 августа 2012, 23:04 # 0
                                какая-то ерунда происходит.
                                Создал сниппет, в него приходит число из [[+total]] вот так:
                                [[!snippet?&num=`[[+total]]`]]

                                Мне нужно это число конвертировать в int (целочисленное).

                                Пишу $num = (int) $num; возвращает 0;

                                Если просто вывести переменную до приведения её к int выводит то что положено, но я не могу с неё произвести никакие манипуляции до приведения.

                                Т.к. во всех функциях php ей конвертирует в 0
                                1. Иван Брежнев 01 августа 2012, 23:19 # 0
                                  var_dump показывает string(10) «4»

                                  Хотя должно быть string(1) «4»
                                  1. Василий Наумкин 02 августа 2012, 06:57 # 0
                                    Действительно, фигня какая то. Может, из-за UTF-8? Хотя все равно, 10 — многовато.

                                    Попробуй функцию intval() php.net/manual/ru/function.intval.php
                                    1. Иван Брежнев 02 августа 2012, 11:02 # 0
                                      Я понял в чем косяк. Он показывает почему-то размер самого плейсхолдера [[+total]]
                                      1. Иван Брежнев 02 августа 2012, 11:03 # 0
                                        Если я вызываю плейсхолдер после сниппета [[mSearch]] то все нормально, а перед вызовом нифига. Хотя такого быть не должно
                                        1. Василий Наумкин 02 августа 2012, 11:12 # 0
                                          Пробуй вызвать и сниппет и плейсхолдер некэшированными.
                                          1. Иван Брежнев 02 августа 2012, 12:08 # 0
                                            Я пробовал по всякому, у меня на странице не сам сниппет вызывается а getPage

                                            Но я уже решил проблему в лоб, дописал в сниппете нужный мне код, и создал плейсхолдер
                                2. Ican Amake 06 августа 2012, 18:50 # 0
                                  Здравствуйте! Сложно ли будет научить mFilter искать по мультиселекту, чекбоксам или доп параметрам? К примеру есть параметр цвет: черный, белый, серый..., mFilter вернет чекбокс со строкой — черный, белый, серый..., а надо для каждого цвета свой чекбокс?
                                  1. Василий Наумкин 06 августа 2012, 19:06 # 0
                                    Скоро будет. На гитхабе уже закомичены изменения, чтобы выводить параметры через кастомный сниппет.
                                    1. Виталий Сентяков 21 октября 2012, 06:42 # 0
                                      Василий, расскажите пожалуйста подробней и как скоро оно выйдет в свети можно ли это уже использовать как-то сейчас?
                                      1. Василий Наумкин 21 октября 2012, 07:13 # 0
                                        https://github.com/bezumkin/mSearch/commit/5e9a93fe5996075edd2aff711616a95ac10a243d

                                        Когда выйдет новая версия — не знаю. Занят другим.
                                        1. Виталий Сентяков 21 октября 2012, 07:21 # 0
                                          Василий, по-сути эту доработку можно использовать сейчас?
                                          В любом случае подожду пока выйдет новая версия, т.к. не понятно как использовать эту доработку, к примеру для параметра, где есть несколько цветов (красный, белый, черный).
                                          Спасибо.
                                  2. Дмитрий Кузьмин 14 августа 2012, 19:33 # 0
                                    TV с точкой в именах не работают в mfiltr — signal.shum ip.razvertka.
                                    Слайдеры с параметрами меньше 1 (0.1-0.9) не работают. :(
                                    1. Василий Наумкин 14 августа 2012, 19:36 # 0
                                      Печалька =(
                                      1. Дмитрий Кузьмин 14 августа 2012, 19:36 # 0
                                        Что делать?
                                        1. Василий Наумкин 14 августа 2012, 19:37 # 0
                                          Переименовать ТВ параметры в signal_shum и ip_razvertka?

                                          Ну и jQuery плагин для слайдеров другой поискать.
                                          1. Дмитрий Кузьмин 14 августа 2012, 19:39 # 0
                                            ТВ я уже переименовал, а вот плагин другой прикрутить мне не по зубам.
                                    2. Алексей Гладков 21 августа 2012, 18:27 # 0
                                      Доброго времени суток… Пытаюсь вставить мФильтр на страницу и он… не вставляется… То есть чанк он выводит а вот фильтра нет вообще не в каком виде
                                      1. Василий Наумкин 21 августа 2012, 18:40 # 0
                                        Не судьба.
                                      2. Denys Butenko 22 августа 2012, 18:48 # 0
                                        Проблемы с Jquery 1.8.0 и mFilter.
                                        Uncaught Error: Syntax error, unrecognized expression: [name=ms_price[]][value=800]
                                        1. Василий Наумкин 22 августа 2012, 18:52 # 0
                                          И?

                                          Мне надо метнуться и срочно все переделать из-за свежего jQuery?
                                          1. Михаил Т. 21 декабря 2012, 19:00 # 0
                                            Там надо в mfilter.js обернуть в двойные кавычки значения. В 126 и 142 строке.
                                            Хотя я думаю вы и сами уже догадались.=)
                                            el = $('input[name="'+i+'"][value="'+vars[i][i2]+'"]');
                                          2. Alexey Naumov 24 августа 2012, 15:56 # 0
                                            Насколько реально подружить mSearch с Quip и сделать поиск по комментариям?
                                            1. Василий Наумкин 24 августа 2012, 16:08 # 0
                                              Не особо реально, я думаю.

                                              Поиск по сторонним таблицам я вообще не закладывал. Для этого есть AdvSearch.
                                              1. Alexey Naumov 24 августа 2012, 16:15 # 0
                                                Жаль, в некоторых проектах информация в комментариях важнее страниц. Придется мудрить и делать 2 разных поиска и как то это красиво интегрировать в интерфейсе. Спасибо.
                                                1. Василий Наумкин 24 августа 2012, 16:18 # 0
                                                  Согласен, но вот как то не разошелся я на работу с любыми таблицами ­=(

                                                  С трудом хватает времени поддерживать текущие расширения, не до ­жиру.

                                                  Если есть навыки — вы можете сделать форк и прислать ­изменения, я включу их в ­код.

                                                  https://github.com/bezumkin/mSearch/
                                            2. Max Skoryk 11 сентября 2012, 13:42 # 0
                                              Ивините если где пропустил…
                                              А отдельное использование фильтра без поиска есть?
                                              1. Василий Наумкин 11 сентября 2012, 14:43 # 0
                                                Поиск включается только если не указан параметр &resources.

                                                Отдельным пакетом — нет, нету.
                                              2. Ольга 17 сентября 2012, 12:24 # 0
                                                Добрый день!
                                                Подскажите пожалуйста, может ли работать mFilter на сайте без MiniShop? То есть фильтровать ресурсы по указанным TV-параметрам? Если да, то каким образом он должен вызываться?
                                                1. Александр Иващенко 25 октября 2012, 18:24 # 0
                                                  Вопрос:
                                                  Как в mFilter выводить список категорий? Где переделывать нужно и что дописывать подскажите пожалуйста. По моему это полезная функция для магазинов, но могу и ошибаться…
                                                  1. Василий Наумкин 25 октября 2012, 18:35 # 0
                                                    1. С этим отлично справляются Wayfinder и getResources
                                                    2. Фильтр фильтрует любые ресурсы, которые были ему переданы по любым их ТВ параметрам. А в них можно записывать и категорию, конечно.

                                                    В общем, включайте фантазию.
                                                  2. Дмитрий Прес 01 ноября 2012, 22:40 # 0
                                                    Спасибо за дополнения!
                                                    Думаю полезно было бы указать что фильтр работает в области с id=mItmes, то есть внутри тега . Еще хотелось бы применить money_format к цене, для красоты =)
                                                    1. Svetlana Zakrevskaya 07 ноября 2012, 22:35 # 0
                                                      Здравствуйте, Василий.
                                                      Подскажите, пожалуйста, можно ли побороть в mSearch зависимость от регистра?
                                                      1. Dmitriy Badanin 19 ноября 2012, 09:28 # 0
                                                        Добрый день.
                                                        Можно ли настроить mSearch, чтобы он искал только в пределах одного контекста?
                                                        У меня многоязыковой сайт и в результаты поиска попадают страницы со всех версий сайта.
                                                        1. Василий Наумкин 19 ноября 2012, 09:31 # 0
                                                          Нет, такого функционала в него не заложено.

                                                          Однако, он может возвращать найденные id документов, а вы можете выводить их другими сниппетами, которые будут фильтровать по контексту.
                                                        2. Николай 20 декабря 2012, 02:14 # 0
                                                          Василий а словари En utf 8 существуют на источнике указанном вами лежат 1251 только
                                                          1. Василий Наумкин 20 декабря 2012, 08:24 # 0
                                                            Видимо, нет.
                                                          2. Николай 20 декабря 2012, 14:33 # 0
                                                            если база и сервер сайта настроены в utf то этот словарь не годится? или пойдет
                                                            1. Alexey Guz 21 декабря 2012, 11:43 # 0
                                                              Добрый день!

                                                              Я меня msearch при выводе найденных элементов выводит 2 доп.ТВполя. Проблема в том что они выводятся только для первого найденного элемента, для остальных не выводятся. Посмотреть можно на new.galaxiv.ru В чем может быть проблема?
                                                              1. Евгений Дружинин 21 декабря 2012, 15:24 # 0
                                                                Alexey Guz, аналогичная ситуация!
                                                                При выводе TV в результатах поиска, первый товар выводится как и задумано со всеми указанными TV, а все последующие товары выдаются без них (отображаются только стандартные плейсхолдеры modx). И выдаются 2 ошибки относительно обработки includeTVList.
                                                                Вот скриншот
                                                                Вот вызов mSearch:
                                                                [[!getPage@catalog_fill? 
                                                                &element=`mSearch` 
                                                                &includeTV=`1`
                                                                &includeTVList=`image,price,articul,instock` 
                                                                &tpl=`product_list` 
                                                                &limit=`10` ]]
                                                                
                                                                Minishop не установлен.
                                                                1. Василий Наумкин 21 декабря 2012, 15:54 # 0
                                                                  Даже не знаю.

                                                                  Может стоит открыть файл, который пишется в ошибке и посмотреть на строках 101 и 102 — в чем там дело?
                                                                  1. Евгений Дружинин 21 декабря 2012, 16:32 # 0
                                                                    Я же говорю там идет разбор includeTVList. Вот 100-105 строки:
                                                                    if ($includeTVs && !empty($includeTVList)) {
                                                                    	$includeTVList = explode(',',$includeTVList);
                                                                    	foreach ($includeTVList as $k => $v) {
                                                                    		$arr[$tvPrefix.$v] = $tmp->getTVValue($v);
                                                                    	}
                                                                    }
                                                                    
                                                                    1. Евгений Дружинин 21 декабря 2012, 16:41 # 0
                                                                      Как я понимаю из сообщения ошибок, то каким-то макаром $includeTVList не является строкой и поэтому его не получается разбить в массив. Как я подразумеваю после первой выдачи результата, $includeTVList не приобретает новое значение (второго товара) а берется опять тот же массив… Короче решением является запись результата разбития строки в другую переменную, а не в саму себя. Вот такой вот код должен быть:
                                                                      if ($includeTVs && !empty($includeTVList)) {
                                                                      	$includeTVListArr = explode(',',$includeTVList);
                                                                      	foreach ($includeTVListArr as $k => $v) {
                                                                      		$arr[$tvPrefix.$v] = $tmp->getTVValue($v);
                                                                      	}
                                                                      }
                                                                      
                                                                      Вот так всё нормально обрабатывается!
                                                                      1. Евгений Дружинин 21 декабря 2012, 16:46 # 0
                                                                        И это наверно надо подправить в
                                                                        snippet.msearch.php
                                                                        
                                                                        1. Евгений Дружинин 21 декабря 2012, 16:59 # 0
                                                                          Вот такие вот рассуждения во время написания коммента приводят к истине :)))
                                                                        2. Евгений Дружинин 21 декабря 2012, 16:56 # 0
                                                                          Блин, а ведь не помогает просто переписать это в snippet.msearch.php
                                                                          При обновлении кэша сайта почему-то 37.include.cache.php и 37.сache.php по новой переписываются на старые варианты, даже если в snippet.msearch.php уже всё изменено. От куда тогда берется этот кусок кода?
                                                                      2. Евгений Дружинин 24 декабря 2012, 02:26 # 0
                                                                        Сделал через mFilter (подумал, что все равно нужны будут фильтры) и результаты стали нормально выводиться. Но вот заметил что сортировка по цене происходит не по возрастанию/убыванию числа, а по «алфавиту» + поиск не идет по числовым значениям TV, например, по цене или артикулу(не использую миниШоп, поэтому эти значения находятся в обычных TV с типом «Число»). Наверно ещё http://bezumkin.ru/blog/54/#comment-175 нет результатов или уже есть где-то на гит?
                                                                        И вот ещё один вопросик, как сделать выдачу результатов с приоритетом для pagetitle? Например, если человек ищет «карта памяти» то сначала должны выводиться результаты у которых это словосочетание есть в заголовке, а потом уже те, у которых оно может встречаться где-то в описании. А сейчас получается что первыми выпадают товары с англоязычными заголовками, а потом идут русскоязычные т.е. сначала выпадают допустим телефоны (Nokia...,Apple...) а потом аж в конце выпадают сами карты памяти с тайтлом «карта памяти....»
                                                                        1. Евгений Дружинин 24 декабря 2012, 13:32 # 0
                                                                          сначала выпадают допустим телефоны (Nokia...,Apple...)
                                                                          дополню лишь что у этих товаров встречается только в описании характеристик фразы про поддержку карт памяти и я не думаю что пользователю будет более интересно на эти товары сначала смотреть, в то время как действительно релевантные товары этому запросу находятся в конце поисковой выдачи где-то на 9-10 страницах. Может добавить ещё один параметр (в будущих сборках) аналог &sortFilters, только там указать приоритеты полей товара для выдачи результатов. Например, всем полям/TV, участвующим в поиске по умолчанию дать 999 приоритет, а если всё же заполнен этот параметр, допустим, &prioritySearchFields=`pagetitle,content,introtext....` то первыми будут выпадать все у которых поисковая фраза присутствует в заголовках, а потом уже все остальные.
                                                                        2. Смачнов Юрей 25 декабря 2012, 17:04 # 0
                                                                          Перечитал кучу документации и никак не пойму как сделать перенаправление на страницу результатов поиска, если форма будет установлена на всех страницах сайта. Также читал про ajax поиск с mSearch, но это мне не подходит.

                                                                          Подскажите пожалуйста как оформить перенаправление например на страницу search-result пусть её будет id=`6`
                                                                          1. Denys Butenko 25 декабря 2012, 17:38 # 0
                                                                            Дык, делаете форму в ней указываете action='[[~6]]', на странице с id=6 вызываете сниппет mSearch
                                                                            1. Denys Butenko 25 декабря 2012, 17:40 # 0
                                                                              Один нюанс, у input'a должен быть атрибут name=«query» обязательно.
                                                                              1. Смачнов Юрей 25 декабря 2012, 17:53 # 0
                                                                                Спасибо, оч. полезный и быстрый ответ.
                                                                                name у меня стоит и все работает прекрасно.
                                                                                1. Павел Левин 16 сентября 2013, 16:33 # 0
                                                                                  Действительно важный нюанс, долго искал почему не работает поиск =)

                                                                                  — Спасибо.
                                                                            2. Смачнов Юрей 25 декабря 2012, 18:47 # 0
                                                                              А можно ли сделать mFilter не на jQuery, а просто сформировать ссылки на страницы выдачи результатов по определенным запросам к TV параметрам?
                                                                              1. Смачнов Юрей 10 января 2013, 15:03 # 0
                                                                                Как сделать чтобы в случае отсутствия результата в результатах поиска mSearch выводилось сообщение типа «ничего не найдено»?
                                                                                1. Василий Наумкин 10 января 2013, 16:02 # 0
                                                                                  Оно так и выводится. Текст можно изменить в словарях системы.


                                                                                  1. Смачнов Юрей 10 января 2013, 16:15 # 0
                                                                                    Спасибо!
                                                                                    Оказывается я упустил из виду вот это:
                                                                                    [[+mse.error]]
                                                                                2. Prizrak Pro 13 января 2013, 00:50 # 0
                                                                                  Подскажите а значения с сотыми долями могут фильтроваться, например 2.12?
                                                                                  1. Василий Наумкин 13 января 2013, 15:12 # 0
                                                                                    Должны.

                                                                                    Только с ними jquery slider глючил, но ведь можно не тольrо его использовать.
                                                                                    1. Prizrak Pro 13 января 2013, 17:49 # 0
                                                                                      Что то я тупанул. Мы же ищем по диапазон значений. Ну вот на и нужно на слайдере выставить 2 и 3. Вот и получим 2.12. И ни какие долевые части не нужны.
                                                                                  2. Prizrak Pro 14 января 2013, 23:12 # 0
                                                                                    Прошу помощи в настройке mFiltra. Моя проблема в не глубоком знании системы modx.

                                                                                    Есть список товаров в minishop. В настоящий момент они выводятся таким образом.

                                                                                    [[!getPage@NavPage?
                                                                                        &element=`msGetResources`
                                                                                        &tpl=`tpl.Conditioner.production`
                                                                                        &limit=`15`
                                                                                        &sortbyMS=`price`
                                                                                        &sortdir=`ASC`
                                                                                        &parents=`[[*id]]`
                                                                                        &includeTVs=`1`
                                                                                    ]]
                                                                                    Помимо стандартных полей продукты в minishop я расширил своими TV переменными.
                                                                                    powerCool — точность до сотых единиц. (0,01)
                                                                                    ventilation — точность единица (1)
                                                                                    Оба числовые.

                                                                                    Я уже понял, что слайдер с сотыми не работает, и параметры для слайдера я округлил. Но суть не в этом.

                                                                                    Решил отсортировать по одному параметру ventilation, он у меня целый. Взяв готовый вариант для примера, я смог сформировать слайдер, но при отправке запроса ajax возвращается пусто ответ.

                                                                                    Для примера я взял готовы вариант.

                                                                                    <form action="[[~[[*id]]]]" method="post" id="mFilter" class="form-horizontal">
                                                                                    	[[!mFilter?
                                                                                    	&resources=`49,50,51,52`
                                                                                    		&includeMS=`0`
                                                                                    		&includeTVs=`1`
                                                                                    		&includeTVList=`ventilation`
                                                                                    		&sortFilters=`tv_ventilation`
                                                                                    
                                                                                    	]]
                                                                                    	<input type="hidden" name="query" value="[[+mse.query]]">
                                                                                    	<input type="hidden" name="page" value="1">
                                                                                    	<input type="hidden" name="sort" value="tv_ventilation">
                                                                                    	<input type="hidden" name="limit" value="3">
                                                                                    	<input type="hidden" name="cat_id" value="[[*id]]">
                                                                                    	<input type="hidden" name="action" value="filter" />
                                                                                    </form>


                                                                                    Я понимаю. Что Сам mFilter и формирует список товаров. И его нужно вставить в мой getPage. Я прав?

                                                                                    Очень много лазил по примеру modx-minishop. Но там сначала ищем товар.
                                                                                    Я же не передаю параметр query так как в начале я вывожу все товары в категории. А затем фильтрую. И так подозреваю именно поэтому получаю пусто ответ.
                                                                                    Но мне и нужно фильтр применить ко все товарам в категории.
                                                                                    Хотелось бы пример. Но, много не прошу, хотя бы подскажите.

                                                                                    И ещё. Стадно, но спрошу. Я не могу понять. Если фильтр выводит товары. То каким образом расположит сам фильтр(слайдер) с боку. Если только в ручную прописать с настройками js куда, что отправлять. Так как если это будет выводить mFilter он мне будет это делать не там где нужно.

                                                                                    И последнее из пример на modx-minishop. Я не могу понять что такое &templates, шаблон. Тогда, что возвращает это [[++minishop.goods_tpl]]. Тут просто мое не знание системы.

                                                                                    Постарался сформулировать четкие вопросы. Но одним словом у меня просто не получается интегрировать mFilter в свою систему.
                                                                                    1. Василий Наумкин 15 января 2013, 05:06 # 0
                                                                                      Я уже сам не особо помню, как там что работает, но оно не простое, это да.

                                                                                      Для фильтрации должен быть указан либо параметр query в $_GET, либо resources при вызове сниппета. mFilter — это фильтр результатов поиска, в первую очередь.

                                                                                      В твоём случае, видимо, нужно указать в &resource=`[[!getIds]]` и в сниппете getIds выбирать все id в категории.

                                                                                      &templates — это фильтр по шаблону при поиске mSearch, тебе он совсем не нужен. Ты же указываешь уже готовые ресурсы для фильтрации.

                                                                                      Блок с фильтром располагается там, где ты его вызываешь. А вот результаты своей работы он выводит в блоке #mItems, через Ajax. Это должно быть хорошо видно на modx-minishop.ru.

                                                                                      Честно признаю, что реализация вышла не самая удобная и нуждается в переделке — но пока нет времени.
                                                                                      1. Prizrak Pro 15 января 2013, 23:47 # 0
                                                                                        Опять комент не в ответ написал.
                                                                                        Спасибо. Все завелось. Есть правда у меня 2 проблемы. Пока сам поковыряюсь. Но если не получиться, надеюсь подскажешь.
                                                                                    2. Prizrak Pro 15 января 2013, 06:45 # 0
                                                                                      resources — вот оно. Список ресурсов. Даже не родитель, а именно список.

                                                                                      С #mItems понял. Разберусь.

                                                                                      Спасибо огромное.

                                                                                      1. Prizrak Pro 27 января 2013, 02:44 # 0
                                                                                        Заработал у меня фильтр как нужно. Кручу дальше.
                                                                                        Я вывожу цену преобразовывая её в msGetPrice. Доллары перевожу в рубли, по установленному курсу. А так же начисляю процент, если таковой установлен в соответствующем TV-параметре.

                                                                                        А построение фильтра то идет из базовых значений. И в самом просто случае на сайте человек видеть в рублях, а в фильтре в доллары. Можно было бы в js курс передавать и преобразовывать на лету, но тогда фильтр не будет работать. Да у меня ещё и процент.

                                                                                        Выход вижу такой. Перед вызовом фильтра, вызывать сниппет, который с учетом всех моих параметров, преобразует цену и пишет её в соответствующий TV. И фильтровать уже по этому TV, а не по полю price.

                                                                                        Но вот на сколько это будет нагружать систему.

                                                                                        А может быть есть другое решение?

                                                                                        P.S. Почитал документацию. Есть события при изменении товар и при изменении TV товара. Мне подходит. Проверяю, и пишу в свой TV, и перед фильтром действия производить не нужно. А будут ли эти события срабатывать при добавлении товара и при импорте?
                                                                                        1. Василий Наумкин 27 января 2013, 03:36 # 0
                                                                                          Импорт работает через процессоры, так что — да.
                                                                                        2. Prizrak Pro 01 февраля 2013, 15:29 # 0
                                                                                          Подскажите. В отфильтрованных товарах мне нужно показывать параметры других TV(не только те по которым фильтрую). Но если они не указаны в настройках фильтра, то они не выводятся. А если указать, по ним показываются элементы для фильтрации. Которые мне не нужны.

                                                                                          Пока выход вижу в удалении элементов через jquery. А можно ли как то, это настроить в фильтре.

                                                                                          1. Василий Наумкин 01 февраля 2013, 16:09 # 0
                                                                                            В самом фильтре товары выводятся через msGetResources.

                                                                                            То есть, в вызове mFilter надо указать includeTVs=`` и т.д.

                                                                                            Вот вызов с реального сайта:
                                                                                            [[!mFilter?
                                                                                                    &resources=`[[!getCatIds]]`
                                                                                                    &includeTVs=`1`
                                                                                                    &includeTVList=`category,color,size,action,popular,new,action_until,chehol,dlya_kogo,napolnitel,obyom,povod,sezon,sostav_filter,tkan`
                                                                                                    &excludeTVList=`popular,new,action_until,action`
                                                                                                    &includeMS=`1`
                                                                                                    &includeMSList=`add2,price,add3:size_extra_filter`
                                                                                                    &tplOuter=`tpl.mFilter.outer`
                                                                                                    &tpl=`tpl.msGoods.row2`
                                                                                                    &templates=`5`
                                                                                                    &sortFilters=`tv_dlya_kogo,tv_category,tv_subcategory,ms_add2,ms_add3,tv_obyom,ms_price,tv_color,tv_povod,tv_sezon,tv_sostav_filter,tv_chehol,tv_napolnitel,tv_tkan,tv_action`
                                                                                            ]]
                                                                                          2. Prizrak Pro 01 февраля 2013, 16:47 # 0
                                                                                            А все понял. Спасибо.
                                                                                            1. Андрей Селивёрстов 12 февраля 2013, 16:10 # 0
                                                                                              Добрый день!
                                                                                              По ссылке
                                                                                              modx-minishop.ru/search.html?query=sony#page=1&sort=ms_price%2Casc&limit=3
                                                                                              не отображаются параметры фильтра (диапазон цены и т.п.).
                                                                                              1. Василий Наумкин 12 февраля 2013, 17:24 # 0
                                                                                                Спасибо, поправил.
                                                                                              2. k m 24 февраля 2013, 18:55 # 0
                                                                                                Василий, восстановите, пожалуйста, доступ в админке сайта.
                                                                                                1. Алексей 28 февраля 2013, 17:12 # 0
                                                                                                  Постоянно появляется сообщение в журнале ошибок modx:

                                                                                                  (ERROR @ /index.php) Вы должны скачать словари phpMorphy с http://sourceforge.net/projects/phpmorphy/files/phpmorphy-dictionaries/ и распаковать в www/core/components/msearch/phpmorphy/dicts/. Или просто отключите использование phpMorphy опцией &disablePhpMorphy=`1`.
                                                                                                  Выставлял флаг &disablePhpMorphy=`1`
                                                                                                  Распаковал в www/core/components/msearch/phpmorphy/dicts/
                                                                                                  файл morphy-0.3.x-ru_RU-withjo-utf-8.zip
                                                                                                  (кстати там уже он был, после установки, тихо и мирно скачался сам)
                                                                                                  Содержимое папки www/core/components/msearch/phpmorphy/dicts/:

                                                                                                  common_aut.ru_ru.bin installed morph_data_header_cache.ru_ru.bin predict_aut.ru_ru.bin
                                                                                                  gramtab.ru_ru.bin morph_data_ancodes_cache.ru_ru.bin morph_data.ru_ru.bin put-dicts-here
                                                                                                  gramtab_txt.ru_ru.bin morph_data_ancodes_map.ru_ru.bin options.ru_ru.ini

                                                                                                  И все равно в журнале ошибок появляется это сообщение…

                                                                                                  Не подскажете, в чем моя ошибка? может не та версия словарей? я качал morphy-0.3.x-ru_RU-withjo-utf-8.zip от 2009-11-21
                                                                                                  1. Василий Наумкин 28 февраля 2013, 17:37 # 0
                                                                                                    А в параметре плагина не делал disablePhpMorphy?

                                                                                                    Это, наверное, он и возмущается.
                                                                                                    1. Алексей 28 февраля 2013, 18:09 # 0
                                                                                                      неа. вообще ничего не менял, пока не увидел сообщение.
                                                                                                      и конечноже, поставил на тестовом сайте — все ок, никаких ошибок
                                                                                                      буду разбираться.
                                                                                                      1. Алексей 28 февраля 2013, 18:23 # 0
                                                                                                        не в курсе, на Linode нужно переводить сумму за месяц, или они сами спишут с карточки?
                                                                                                        1. Василий Наумкин 28 февраля 2013, 18:29 # 0
                                                                                                          Сами списывают.
                                                                                                        2. Алексей 28 февраля 2013, 21:03 # 0
                                                                                                          это нормально, что я по запросу: «новый»
                                                                                                          s2513.modx-test.com/index.php?query=%D0%BD%D0%BE%D0%B2%D1%8B%D0%B9
                                                                                                          ничего не нахожу?
                                                                                                          при том что у меня проиндексирован документ со всеми формами этого слова:
                                                                                                          нового
                                                                                                          новому
                                                                                                          нового
                                                                                                          новым
                                                                                                          новом
                                                                                                          новая
                                                                                                          новой
                                                                                                          новой
                                                                                                          новую
                                                                                                          новой
                                                                                                          новою
                                                                                                          новой
                                                                                                          новое
                                                                                                          нового
                                                                                                          новому
                                                                                                          новое
                                                                                                          новым
                                                                                                          новом

                                                                                                          новые
                                                                                                          новых
                                                                                                          новым
                                                                                                          новых
                                                                                                          новые
                                                                                                          новыми
                                                                                                          новых

                                                                                                          новее
                                                                                                          поновее
                                                                                                          новей
                                                                                                          поновей

                                                                                                          нов
                                                                                                          нова
                                                                                                          ново
                                                                                                          новы
                                                                                                          новы
                                                                                                      2. Сергей Савельев 08 марта 2013, 00:38 # 0
                                                                                                        Подскажите, пожалуйста, возможно ли использовать сниппет mSearch через Ajax? Нужно чтобы поиск осуществлялся без перезагрузки. Если да то как?
                                                                                                        1. Сергей Савельев 08 марта 2013, 02:58 # 0
                                                                                                          Чтобы параметр parents заработал, пришлось в файле core/components/msearch/model/msearch/msearch.class.php изменить в 272 строке:
                                                                                                          if (!empty($parents)) {
                                                                                                          На
                                                                                                          if (!empty($this->config['parents'])) {
                                                                                                          	$parents = $this->config['parents'];
                                                                                                          Может быть я не всё просчитал, поправьте в таком случае, пожалуйста.
                                                                                                          1. Николай 13 апреля 2013, 18:11 # 0
                                                                                                            Добрый день, а можно ли настроить сниппет на поиск по 2-м языкам?
                                                                                                            Просто у меня постельное белье, которое называется на английском, а в остальном сайт на русском. И запрос может быть такой: комплект Rosa. mSearch в случае, если настроен на русский, будет искать только комплект, а мне нужно, чтобы искалось и то и другое.
                                                                                                            1. Василий Наумкин 13 апреля 2013, 18:11 # 0
                                                                                                              Нет, нельзя.
                                                                                                            2. Олег Песчанский 24 апреля 2013, 16:25 # 0
                                                                                                              В демо minishop2 не установлены поиск с фильтром, где теперь примеры подключения посмотреть?
                                                                                                              1. Сергей Щерба 25 апреля 2013, 22:39 # 0
                                                                                                                Ссылки на пример не актуальные (и в статье на хабре).
                                                                                                                А без примера совсем беда. Сейчас пыжусь с фильтрами и никак… Поиск работает на отлично, а вот куда и как правильно фильтры прикрутить никак не догоняю…
                                                                                                                Сделайте, пожалуйста, пример, например на minishop2.
                                                                                                                Буду премного благодарен.
                                                                                                                1. Николай 26 апреля 2013, 03:26 # 0
                                                                                                                  Ты хочешь фильтры в поиске или категории? Если в поиске то там синепт msearch не нужен, достаточно одного чанка mfilter который идет в комплекте с минишопом. Ну и необходимо подключить несколько скриптов в хэд.
                                                                                                                  Ах да, важно не забывать обязательное присутствие дива id = «mItems» в котором будут выводиться результаты.

                                                                                                                  1. Сергей Щерба 27 апреля 2013, 19:12 # 0
                                                                                                                    Спасибо за подсказку, чанк mfilter как-то я упустил из виду.
                                                                                                                2. Олег Песчанский 27 апреля 2013, 09:17 # 0
                                                                                                                  Не получается вывести форму фильтра!
                                                                                                                  Вывожу так:
                                                                                                                  [[!mFilter?
                                                                                                                  &includeTVs=`1`
                                                                                                                  &includeTVList=`garage`
                                                                                                                  ]]
                                                                                                                  mSearch работает, а фильтр не виводится, очень не хватает примера… Что не так делаю?
                                                                                                                  1. Олег Песчанский 27 апреля 2013, 19:45 # 0
                                                                                                                    Разобрался!
                                                                                                                    Видимо, это особенность minishop. Я же не использую его, у меня просто tv-параметры. Так вот, например, если параметр «Гараж» — это checkbox с единственным значением «Да» (отмечено, значит есть гараж, не отмечено — нет), то в форме фильтра он не выводится, так как в сниппете значится следующее:
                                                                                                                    if (count($v['values']) < 2) {continue;}
                                                                                                                    Соответственно, если заменить двойку на единицу:
                                                                                                                    if (count($v['values']) < 1) {continue;}
                                                                                                                    То такого рода параметры будут показаны в фильтре.
                                                                                                                  2. Олег Песчанский 27 апреля 2013, 19:53 # 0
                                                                                                                    В файле mfilter.js допущены ошибки такого рода:
                                                                                                                    input[name='+i+"]
                                                                                                                    Здесь отсутствуют двойные кавычки, обрамляющие значение атрибута name. Должно выглядеть так:
                                                                                                                    input[name="'+i+'"]
                                                                                                                    В файле все селекторы такого рода написаны без двойных кавычек, и поэтому, если перейти по url, вроде /#tv_garage[]=Да, ни одного товара не покажет, и галочку на нужном чекбоксе не отметит.
                                                                                                                    Ниже код исправленного скрипта:
                                                                                                                    $(document).ready(function() {
                                                                                                                    
                                                                                                                    	// Слайдеры фильтра
                                                                                                                    	$('.mFilter_slider').each(function() {
                                                                                                                    		var form = $(this).parents('form');
                                                                                                                    		var idx = $(this).parents('.mFilter_wrapper').data('idx');
                                                                                                                    		var vmin = Number($('#min_'+idx).val());
                                                                                                                    		var vmax = Number($('#max_'+idx).val());
                                                                                                                    
                                                                                                                    		$(this).slider({
                                                                                                                    			min: vmin
                                                                                                                    			,max: vmax
                                                                                                                    			,values: [vmin, vmax]
                                                                                                                    			,range: true
                                                                                                                    			,stop: function(event, ui) {
                                                                                                                    				$('input#min_'+idx).val($(this).slider('values',0));
                                                                                                                    				$('input#max_'+idx).val($(this).slider('values',1));
                                                                                                                    				$(form).find('input[name="page"]').val(1);
                                                                                                                    				$(form).submit();
                                                                                                                    			},
                                                                                                                    			slide: function(event, ui){
                                                                                                                    				$('input#min_'+idx).val($(this).slider('values',0));
                                                                                                                    				$('input#max_'+idx).val($(this).slider('values',1));
                                                                                                                    			}
                                                                                                                    		})
                                                                                                                    	})
                                                                                                                    
                                                                                                                    	$(document).on('change', '#mFilter input', function() {
                                                                                                                    		if ($(this).attr('type') == 'checkbox') {
                                                                                                                    			$('#mFilter input[name="page"]').val(1);
                                                                                                                    			$(this).parent().find('sup').toggle();
                                                                                                                    		}
                                                                                                                    		$(this).parents('form').submit()
                                                                                                                    	})
                                                                                                                    	
                                                                                                                    	$(document).on('click', '#mItems .mLimit', function(e) {
                                                                                                                    		var limit = $(this).data('limit');
                                                                                                                    		$('#mFilter input[name="page"]').val(1);
                                                                                                                    		$('#mFilter input[name="limit"]').val(limit).trigger('change');
                                                                                                                    		e.preventDefault();
                                                                                                                    	})
                                                                                                                    
                                                                                                                    	$(document).on('click', '#mItems .mSort', function(e) {
                                                                                                                    		var sortby = $(this).data('sort');
                                                                                                                    		$('#mFilter input[name="sort"]').val(sortby).trigger('change');
                                                                                                                    		e.preventDefault();
                                                                                                                    	})
                                                                                                                    
                                                                                                                    	$(document).on('click', '#mItems .pagination a', function(e) {
                                                                                                                    		var href = $(this).attr('href').split('=');
                                                                                                                    		
                                                                                                                    		$('#mFilter input[name="page"]').val(href[href.length - 1]).trigger('change');
                                                                                                                    		e.preventDefault();
                                                                                                                    	})
                                                                                                                    
                                                                                                                    	$(document).on('submit', '#mFilter', function(e) {
                                                                                                                    		$(this).ajaxSubmit({
                                                                                                                    			success: function(res,status,form) {
                                                                                                                    				var data = $.parseJSON(res)
                                                                                                                    
                                                                                                                    				if (data.total) {
                                                                                                                    					$('h1 span').text(' ('+data.total+')');
                                                                                                                    				}
                                                                                                                    				$('#mFilter input[type=checkbox]').each(function() {
                                                                                                                    					var name = $(this).attr('name').replace(/\[\]/, '');
                                                                                                                    					var val = $(this).val();
                                                                                                                    
                                                                                                                    					if (data.filter[name] == undefined) {tmp = 0;}
                                                                                                                    					else {tmp = data.filter[name][val];}
                                                                                                                    					
                                                                                                                    					if (tmp != 0) {
                                                                                                                    						$(this).removeAttr('disabled').parent().find('sup').text(tmp);
                                                                                                                    					}
                                                                                                                    					else {
                                                                                                                    						$(this).attr('disabled','disabled').parent().find('sup').text(0);
                                                                                                                    					}
                                                                                                                    				})
                                                                                                                    				$('#mItems').html(data.rows).css('opacity',1)
                                                                                                                    			}
                                                                                                                    			,beforeSubmit: function showRequest(formData, jqForm, options) {
                                                                                                                                    $('#mItems').css('opacity',.5)
                                                                                                                    				var tmp = new Object();
                                                                                                                    				for (var i in formData) {
                                                                                                                    					key = formData[i].name
                                                                                                                    					if (key == 'query' || key == 'action' || key == 'cat_id') {continue;}
                                                                                                                    					if (tmp[key] == undefined) {
                                                                                                                    						tmp[key] = new Array();
                                                                                                                    					}
                                                                                                                    					tmp[key].push(formData[i].value)
                                                                                                                    				}
                                                                                                                    				var tmp2 = new Object();
                                                                                                                    				for (var i in tmp) {
                                                                                                                    					tmp2[i] = tmp[i].join('--')
                                                                                                                    				}
                                                                                                                    				document.location.hash = $.param(tmp2)
                                                                                                                    				return true; 
                                                                                                                    			} 
                                                                                                                    		})
                                                                                                                    		e.preventDefault();
                                                                                                                    	})
                                                                                                                    	$(document).on('change', '#mFilter .minCost, #mFilter .maxCost', function() {
                                                                                                                    		var fieldset = $(this).parents('fieldset');
                                                                                                                    		var vmin = fieldset.find('.minCost').val();
                                                                                                                    		var vmax = fieldset.find('.maxCost').val();
                                                                                                                    
                                                                                                                    		if (Number(vmin) > Number(vmax)) {
                                                                                                                    			vmin = vmax;
                                                                                                                    			fieldset.find('.minCost').val(vmin);
                                                                                                                    			fieldset.find('.maxCost').val(vmax);
                                                                                                                    		}
                                                                                                                    		fieldset.find('.mFilter_slider').slider("values",0,vmin);
                                                                                                                    		fieldset.find('.mFilter_slider').slider("values",1,vmax);
                                                                                                                    	})
                                                                                                                    
                                                                                                                    
                                                                                                                    	// Если есть хэш в url - пробуем отправить форму
                                                                                                                    	if (vars = getUrlVars()) {
                                                                                                                    		if ($('#mFilter').length == 0) {return;}
                                                                                                                    		
                                                                                                                    		for (i in vars) {
                                                                                                                    			if (/\[\]/.test(i)) {
                                                                                                                    				for (i2 in vars[i]) {
                                                                                                                    					el = $('input[name="'+i+'"][value="'+vars[i][i2]+'"]');
                                                                                                                    					if (el.length > 0) {
                                                                                                                    						el.attr('checked','checked').parent().find('sup').hide();
                                                                                                                    					}
                                                                                                                    					else {
                                                                                                                    						var name = i.replace(/\[\]/, '');
                                                                                                                    						if (i2 == 0) {
                                                                                                                    							$('#mfilter_'+name+' .vmin').val(vars[i][0]).parent().find('.mFilter_slider').slider("values",0,vars[i][0]);
                                                                                                                    						}
                                                                                                                    						else {
                                                                                                                    							$('#mfilter_'+name+' .vmax').val(vars[i][1]).parent().find('.mFilter_slider').slider("values",1,vars[i][1])
                                                                                                                    						}
                                                                                                                    					}
                                                                                                                    				}
                                                                                                                    			}
                                                                                                                    			else {
                                                                                                                    				$('input[name='+i+']').val(vars[i]);
                                                                                                                    			}
                                                                                                                    		}
                                                                                                                    		$('#mFilter').submit()
                                                                                                                    	}
                                                                                                                    	else if ($('#mFilter').length) {
                                                                                                                    		$('#mFilter').submit();
                                                                                                                    	}
                                                                                                                    })
                                                                                                                    
                                                                                                                    
                                                                                                                    // Разбор хэша url на значения
                                                                                                                    function getUrlVars() {
                                                                                                                        var vars = new Object(), hash;
                                                                                                                        var hashes = decodeURIComponent(window.location.hash.substr(1));
                                                                                                                        if (hashes.length == 0) {return false;}
                                                                                                                        else {hashes = hashes.split('&');}
                                                                                                                    
                                                                                                                    	for (var i in hashes) {
                                                                                                                            hash = hashes[i].split('=');
                                                                                                                    
                                                                                                                    		if (hash[1] != undefined && /\[\]/.test(hash[0])) {
                                                                                                                    			var tmp = hash[1].split('--');
                                                                                                                    			hash[1] = new Array();
                                                                                                                    			for (var i2 in tmp) {
                                                                                                                    				hash[1].push(tmp[i2]);
                                                                                                                    			}
                                                                                                                    		}
                                                                                                                    		vars[hash[0]] = hash[1];
                                                                                                                    	}
                                                                                                                    	return vars;
                                                                                                                    }
                                                                                                                    1. Олег Песчанский 27 апреля 2013, 20:21 # 0
                                                                                                                      Один пропустил
                                                                                                                      $('input[name='+i+']').val(vars[i]);
                                                                                                                    2. Олег Песчанский 10 мая 2013, 14:16 # 0
                                                                                                                      Еще одна ошибочка в mfilter.js

                                                                                                                      При движении слайдера (slider), для изменения числового значения в инпутах (input) вместо
                                                                                                                      $(this).slider('values',0)
                                                                                                                      нужно использовать
                                                                                                                      ui.values[0]
                                                                                                                      Иначе значения как-то отстают, правильными становятся только после отпускания ползунка, то есть собития stop.
                                                                                                                      1. Василий Наумкин 10 мая 2013, 16:38 # 0
                                                                                                                        Спасибо, в mSearch2 все заново напишу.
                                                                                                                      2. Олег Песчанский 10 мая 2013, 16:50 # 0
                                                                                                                        Очень интересует следующий вопрос!

                                                                                                                        В modx evo autofilter так реализован, что можно создавать некие «посадочные» страницы. Например, на странице «деревянные дома с гаражом» в фильтре предустановлены параметры «дерево» и «гараж», а сами товары выводятся не js, а обычно.
                                                                                                                        Эти предустановки очень удобны при создании страниц под узкочастотные запросы, и при этом робот увидит товары на этих страницах,
                                                                                                                        А mSearch выводит их динамически джаваскриптом. Я боюсь, что поисковики не найдут товары на таких страницах.
                                                                                                                        1. Руслан Кундиус 01 июля 2013, 15:08 # 0
                                                                                                                          Здравствуйте!
                                                                                                                          Можно ли сделать, что бы mSearch выводил результаты где встречаются все искомые слова?
                                                                                                                          1. Василий Наумкин 01 июля 2013, 15:12 # 0
                                                                                                                            Нет, первый mSearch так не умеет.

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

                                                                                                                            Например, вот поиск твоего комментария.
                                                                                                                            1. Руслан Кундиус 01 июля 2013, 15:21 # 0
                                                                                                                              Супер, то что надо, буду покупать)
                                                                                                                          2. Dennis Nichi 05 августа 2013, 13:27 # 0
                                                                                                                            А есть возможность настроить сортировку самих фильтров, например, производителей в алфавитном порядке?
                                                                                                                            clip2net.com/s/5vJVUE
                                                                                                                            1. Dmitry Rodionov 02 сентября 2013, 20:02 # 0
                                                                                                                              а два раза вызов mSearch на странице возможен?
                                                                                                                              надо разделить на 2 блока поиск по товарам, и поиск по определенным документам, контентным страницам, и так чтобы это шло все не вперемешку, а раздельно, но на одной странице (использовать постраничное разбиение — не надо)
                                                                                                                              1. Dmitry Rodionov 02 сентября 2013, 22:07 # 0
                                                                                                                                просто вызываю сниппеты — но второй дублирует первый, т.е. выводит тоже самое а не то что должен, если по отдельности — то все нормально
                                                                                                                                1. Василий Наумкин 03 сентября 2013, 07:11 # 0
                                                                                                                                  Нет, не возможен.
                                                                                                                                2. Павел Левин 16 сентября 2013, 21:32 # 0
                                                                                                                                  Возможно ли ограничить поисковую выдачу в зоне текущего контекста?
                                                                                                                                  Возможно ли проверять допустим [[++cultureKey]]?

                                                                                                                                  Использовал параметр:
                                                                                                                                  &parents=`[[++site_start]],[[++test]]`
                                                                                                                                  но он не работает.
                                                                                                                                  1. Павел Левин 18 сентября 2013, 00:18 # 0
                                                                                                                                    Возможен ли фильтр по родителям?
                                                                                                                                    &sortFilters=`parent`
                                                                                                                                    пробовал, но не работает, м.б. по другому? подскажите пожалуйста.

                                                                                                                                    Делаю так:
                                                                                                                                    [[!mFilter?
                                                                                                                                    &sortFilters=`parent`
                                                                                                                                    &snippet=`pdoResources`
                                                                                                                                    ]]
                                                                                                                                    [[!getPage@catalog_fill? &element=`mSearch` &limit=`10` &parents=`[[++site_start]]`]]
                                                                                                                                    1. Павел Левин 18 сентября 2013, 00:20 # 0
                                                                                                                                      Еще вопрос. Поисковая выдача начинается с нуля, возможно ли это исправить? Я смотрел сниппет, не нашел вывод идентификаторов.
                                                                                                                                      1. Vlad 19 октября 2013, 01:05 # 0
                                                                                                                                        Плагин работает отлично! С большим удовольстивем задонейтил бы, скажите только куда.

                                                                                                                                        Но есть один затык — у меня документы редактируются из фронтенда и видимо поэтому mSearchIndexer не обновляет поисковый индекс.
                                                                                                                                        Можно ли это как-то победить?
                                                                                                                                        1. Василий Наумкин 19 октября 2013, 05:02 # 0
                                                                                                                                          Нужно обновлять документы через процессоры — и не будет проблем.

                                                                                                                                          Задонейтить можно купив вторую версию mSearch — она по всем параметрам лучше.
                                                                                                                                          1. Vlad 19 октября 2013, 21:41 # 0
                                                                                                                                            А после покупки поможете с настройкой обновления документов? ))
                                                                                                                                            1. Василий Наумкин 19 октября 2013, 21:44 # 0
                                                                                                                                              У слова «donate» немного иной смысл, оно подразумевает безвозмездный дар — это не оплата услуг.

                                                                                                                                              Я помогу с настройкой купленного компонента, если будет нужда, но редактирование страниц сайта с этим никак не связано.
                                                                                                                                              1. Vlad 19 октября 2013, 22:02 # 0
                                                                                                                                                Дык в моем случае и mSearch отлично подходит, собственно за него уже задонейтил путем покупки подписки, т.к. других способов не нашел.
                                                                                                                                                Спору нет, mSearch2 прекрасен, но для моей текущей задачи он избыточен и единственное оправдание его покупки — это решение проблемы с индексацией. Вот я и хочу понять, сможете ли Вы или ребята из Simple Dream проконсультировать в объеме анализа нескольких сот байт кода и рекомендации по его изменениям.
                                                                                                                                                1. Василий Наумкин 19 октября 2013, 23:18 # 0
                                                                                                                                                  Я тебе еще раз объясняю, что индексация завит от того, как ты работаешь с документом на фронтенде.

                                                                                                                                                  Если ты не используешь процессоры — как плагин узнает, что документ обновился и его нужно индексировать? Никак.
                                                                                                                                                  1. Vlad 20 октября 2013, 00:08 # 0
                                                                                                                                                    Если ты не используешь процессоры — как плагин узнает, что документ обновился и его нужно индексировать?
                                                                                                                                                    Это я уже понял, но к сожалению, я не настолько хорошо знаю MODX, чтобы ответить на вопрос, используются процессоры или нет. Раз индекскации не происходит, то очевидно, не используются. работа идет чреез FormIt, вот posthook, который сохраняет форму.

                                                                                                                                                    <?php
                                                                                                                                                    $doc = $modx->getObject('modResource', array('id' => $hook->getValue('resource_id')));
                                                                                                                                                    
                                                                                                                                                    if (empty($doc))
                                                                                                                                                    	{
                                                                                                                                                    	$doc = $modx->newObject('modResource');
                                                                                                                                                    	$doc->set('createdby', $modx->user->get('id'));
                                                                                                                                                    	}
                                                                                                                                                      else
                                                                                                                                                    	{
                                                                                                                                                    	$doc->set('editedby', $modx->user->get('id'));
                                                                                                                                                    	}
                                                                                                                                                    
                                                                                                                                                    $allFormFields = $hook->getValues();
                                                                                                                                                    
                                                                                                                                                    foreach($allFormFields as $field => $value)
                                                                                                                                                    	{
                                                                                                                                                    	if ($field !== 'spam' && $field !== 'resource_id')
                                                                                                                                                    		{
                                                                                                                                                    		$doc->set($field, $value);
                                                                                                                                                    		}
                                                                                                                                                    	}
                                                                                                                                                    
                                                                                                                                                    $doc->set('alias', $alias);
                                                                                                                                                    $doc->set('template', $template);
                                                                                                                                                    $doc->save();
                                                                                                                                                    
                                                                                                                                                    foreach($allFormFields as $field => $value)
                                                                                                                                                    	{
                                                                                                                                                    	if (!empty($value) && $tv = $modx->getObject('modTemplateVar', array(
                                                                                                                                                    		'name' => $field
                                                                                                                                                    	)))
                                                                                                                                                    		{
                                                                                                                                                    		/* handles checkboxes & multiple selects elements */
                                                                                                                                                    		if (is_array($value))
                                                                                                                                                    			{
                                                                                                                                                    			$featureInsert = array();
                                                                                                                                                    			while (list($featureValue, $featureItem) = each($value))
                                                                                                                                                    				{
                                                                                                                                                    				$featureInsert[count($featureInsert) ] = $featureItem;
                                                                                                                                                    				}
                                                                                                                                                    
                                                                                                                                                    			$value = implode('||', $featureInsert);
                                                                                                                                                    			}
                                                                                                                                                    
                                                                                                                                                    		$tv->setValue($doc->get('id') , $value);
                                                                                                                                                    		$tv->save();
                                                                                                                                                    		}
                                                                                                                                                    	}
                                                                                                                                                    
                                                                                                                                                    $modx->cacheManager->refresh();
                                                                                                                                                    return true;
                                                                                                                                                    1. Василий Наумкин 20 октября 2013, 07:23 # 0
                                                                                                                                                      Нет здесь процессоров.
                                                                                                                                                      Еще и кэш всего сайта очищается при каждом редактировании.

                                                                                                                                                      Вот как это решено в компоненте Tickets.
                                                                                                                                        2. Evgeny Epifanov 11 ноября 2013, 17:24 # 0
                                                                                                                                          Василий, ай нид хелп.
                                                                                                                                          Как в фильтре вывести слайдер?
                                                                                                                                          Сейчас вывожу так:
                                                                                                                                          [[mFilter2? &parents=`2` &filters=`resource|parent:parents,tv|price:number` &tplFilter.row.tv|price=`tpl.mFilter2.filter.slider`]]
                                                                                                                                          А на сайте выводится вот что:

                                                                                                                                          Что еще нужно подключить и где?
                                                                                                                                          1. Игорь Козлов 14 марта 2014, 16:48 # 0
                                                                                                                                            Здравствуйте!

                                                                                                                                            Подскажите пожалуйста, где можно удалить стандартные значения автозаполнения для поиска, такие как «Пароль при оформлении заказа»?
                                                                                                                                            1. Максим 03 сентября 2014, 05:31 # 0
                                                                                                                                              Доброго времени суток, Василий и сообщество!
                                                                                                                                              У меня mFilter не работает с pdoPage, только с getPage. Причём консоль браузера показывает ошибку в файле mfilter.js, в функции ajaxSubmit, там где success. Такое впечатление, что ответ сервера приходит не в таком виде, в каком его ждёт mfilter.js. У кого-нибудь была подобная неприятность? Подскажите, плиз, решение. Искренне уважаю все доработки Василия, использую pdoMenu, pdoCrumbs, pdoField, а тут, блин, такой облом. Может у кого есть мысли куда думать?
                                                                                                                                              Заранее всем спасибо. Я MODX пока знаю на троечку, поэтому каждая Ваша мысль, уважаемые коллеги, на вес золота))
                                                                                                                                              1. Василий Наумкин 03 сентября 2014, 05:53 # 0
                                                                                                                                                Открой консоль браузера и посмотри, какой ответ приходит от сервера.
                                                                                                                                                1. Максим 03 сентября 2014, 06:50 # 0
                                                                                                                                                  Очень надеюсь, что Вас правильно понял.
                                                                                                                                                  1. Василий Наумкин 03 сентября 2014, 08:04 # 0
                                                                                                                                                    Unexpected token означает, что сервер отдает не JSON.

                                                                                                                                                    Наверняка там ошибка в PHP какая-то, смотри вот так:
                                                                                                                                                    1. Максим 03 сентября 2014, 08:30 # 0
                                                                                                                                                      Спасибо за подсказку, Василий.
                                                                                                                                                      Если вывожу через getPage, то ответ сервера (смотрю там где Вы подсказали на картинке) имеет следующий вид:
                                                                                                                                                      {"rows":"<div class=\"sort\">\n\t<p>\u0421\u043e\...  
                                                                                                                                                      А вот когда подключаю pdoPage, то на этой вкладке отображается просто текущий html-документ, то есть
                                                                                                                                                      <html><head>...</head><body>... 
                                                                                                                                                      То есть ровно то, что я увижу нажав просто F12. Ну и
                                                                                                                                                      <div id="mItems"></div>
                                                                                                                                                      пустой, без товаров(((
                                                                                                                                                      1. Василий Наумкин 03 сентября 2014, 08:54 # 0
                                                                                                                                                        Видимо, нет результатов и он тебе отсылает редирект.

                                                                                                                                                        Проверяй параметры pdoPage, такое может быть при &limit=`0` или чем то подобным.
                                                                                                                                                        1. Максим 03 сентября 2014, 09:00 # 0
                                                                                                                                                          Ок. Буду разбираться. В любом случае спасибо, Василий, что уделил внимание и подсказал куда думать. И за мФильтр спасибо, и за весь МС спасибо. Надо отдать должное, что магазин при его бесплатности очень сильный получается! А у нас ещё хватает наглости помощи просить)))
                                                                                                                                                          1. Василий Наумкин 03 сентября 2014, 09:11 # 0
                                                                                                                                                            Можешь просто купить mSearch2 и спокойно задавать вопросы в поддержке магазина.
                                                                                                                                                            1. Максим 03 сентября 2014, 09:16 # 0
                                                                                                                                                              Обязательно куплю, и не только mSearch2, мне ещё некоторые компоненты приглянулись. Но чуть позже. Для начала надо дособирать магазин и запустить, чтобы $ приносить начал))
                                                                                                                                                          2. Максим 03 сентября 2014, 11:56 # 0
                                                                                                                                                            Василий, проблему решил! В чанке mFilter убрал строку
                                                                                                                                                            <input type="hidden" name="page" value="1">
                                                                                                                                                            . Почему так — пока не понял, но теперь pdoPage прекрасно работает с mFilter. Ура! Да здравствует MS2!
                                                                                                                                                            1. Максим 03 сентября 2014, 12:04 # 0
                                                                                                                                                              Не. Рано радуюсь. Товары выводятся, а страницы не переключаются.
                                                                                                                                                              1. Максим 03 сентября 2014, 13:00 # 0
                                                                                                                                                                Самое интересное, что pdoPage не работает только с page=1. Если передать page=2, всё прекрасно работает.
                                                                                                                                                                1. Максим 03 сентября 2014, 13:44 # 0
                                                                                                                                                                  Всё ясно. В самом сниппете pdoPage есть условие — если $_REQUEST[$pageVarKey] <= 1, то $pdoPage->redirectToFirst(). Это условие и не даёт работать mFilter в паре с pdoPage при &page=1.
                                                                                                                                                                  1. Василий Наумкин 03 сентября 2014, 13:50 # 0
                                                                                                                                                                    Видимо, да.

                                                                                                                                                                    Ты же понимаешь, что для меня mSearch1 давно не актуален =)
                                                                                                                                                                    1. Максим 03 сентября 2014, 15:31 # +1
                                                                                                                                                                      Конечно, понимаю, Василий! Это так, мысли вслух, всё-таки с 6 утра разбираюсь с этой проблемой. Вот и выплеснул накопившееся у тебя в комментариях. Может кому и пригодится. Лично я все комментарии по MS2 перечитал и в них реально куча полезной инфы. Ни в коем случае не подумай, что я прошу тебя что-то исправить-добавить в сниппете или помочь мне написать какой-нить костыль. Для бесплатного продукта, честно, не хватает цензурных слов выразить восторг. Может это говорит об уровне культуры, но восторга от этого не меньше, собираю магазин и кайфую))
                                                                                                                                                                    2. Максим 03 сентября 2014, 15:57 # 0
                                                                                                                                                                      Ха! Просто комментируешь это условие и pdoPage прекрасно продолжает работать и с аяксом и в стандартных ситуациях! Ну как тут без нецензурщины? Класс, и очень не плохой фильтрик получился. Как настоящий)) Василий, мне аж жаль, что вы такие вещи бесплатно раздаёте))) Если это ваша тренировка перед mSearch2, представляю какой сам mSearch2. Конечно, может и стоило бы его купить и 4 дня жизни и немного нервов сберечь, но уж больно интересно было первый настроить.
                                                                                                                                                                      1. Василий Наумкин 03 сентября 2014, 17:19 # 0
                                                                                                                                                                        mSearch2 лучше просто-таки по всем статьям, что в поиске, что в фильтрации, что в админке.

                                                                                                                                                                        Сравнивать невозможно.
                                                                                                                                                    2. oleg 19 ноября 2014, 19:49 # 0
                                                                                                                                                      Вот делаю я вызов mFilter таким образом
                                                                                                                                                      [[!mFilter?
                                                                                                                                                      &resources=`[[!getCatIds]]`
                                                                                                                                                      &includeTVs=`51`
                                                                                                                                                      &includeTVList=`availability`
                                                                                                                                                      &tpl=`catAll`
                                                                                                                                                      ]]
                                                                                                                                                      а в ответ тишина. Почему так может быть?
                                                                                                                                                      Добавление новых комментариев отключено.