Поиск по полям price и color в SimpleSearch для MODX

    При разработке интернет-магазина на MODX Revolution часто возникает необходимость искать товары не только по названию, но и по дополнительным полям - цене, цвету, бренду. Стандартный сниппет SimpleSearch ищет только по контенту ресурса (pagetitle, content). Чтобы расширить поиск на поля miniShop2 (msProductData), требуется особая настройка пакетов и запросов. В этой статье разберём рабочий пример и объясним каждый параметр.

    Как работает SimpleSearch с дополнительными пакетами

    SimpleSearch поддерживает механизм customPackages, который позволяет подключать сторонние модели данных и объединять их с основным запросом через JOIN. Для поиска по полям товаров miniShop2 нужно указать класс msProductData и связать его с modResource по полю id.

    Параметр customPackages: структура и синтаксис

    Значение параметра выглядит так:

    &customPackages=`msProductData:article:minishop2:{core_path}/components/minishop2/model/:msProductData.id = modResource.id`

    Разберём по частям:

    • msProductData - имя класса модели miniShop2, хранящего дополнительные поля товара (price, color, article и др.).
    • article - псевдоним (alias) таблицы в SQL-запросе. Можно задать любой, но лучше использовать осмысленное имя.
    • minishop2 - название пакета (package), в котором находится модель.
    • {core_path}/components/minishop2/model/ - путь к папке с моделями. Используется плейсхолдер core_path.
    • msProductData.id = modResource.id - условие соединения (ON). Здесь id товара из таблицы msProductData приравнивается к id ресурса.

    После подключения пакета SimpleSearch сможет искать по всем полям класса msProductData, включая price, color, article, weight и т.д.

    Полный пример вызова сниппета с пояснениями

    В исходном вопросе приведён такой код:

    [[!SimpleSearch? 
    &customPackages=`msProductData:article:minishop2:{core_path}/components/minishop2/model/:msProductData.id = modResource.id`
    &tpl=`Tpl.SearchResult` 
    &containerTpl=`Tpl.SearchResults` 
    &pageTpl=`Tpl.PageLink` 
    ¤tPageTpl=`Tpl.CurrentPageLink`
    &perPage=`0`
    &useAllWords=`0`
    &ids=`17,50`
    ]]

    Разберём ключевые параметры:

    • tpl - чанк для одного результата поиска. Внутри него можно использовать плейсхолдеры полей товара, например [[+price]], [[+color]].
    • perPage - количество результатов на страницу. Значение 0 означает «не разбивать на страницы».
    • useAllWords - если 0, поиск работает по принципу «хотя бы одно слово» (OR). Если 1 - должны совпасть все слова (AND).
    • ids - список ID ресурсов, среди которых нужно искать. Указаны 17 и 50. Если оставить пустым, поиск будет по всем ресурсам.

    Типичные ошибки и их решение

    Ошибка 1: пустые результаты при поиске по цене

    Убедитесь, что вы используете правильные плейсхолдеры в чанке Tpl.SearchResult. Для вывода цены пишите [[+price]], а не [[*price]]. SimpleSearch возвращает данные через плейсхолдеры строки, а не ресурса.

    Ошибка 2: поиск не видит поля из msProductData

    Проверьте, что путь к модели указан корректно. Вместо {core_path} можно прописать абсолютный путь, например /var/www/site/core/components/minishop2/model/. Но лучше использовать плейсхолдер - он подставится автоматически.

    Ошибка 3: дублирование результатов

    Если товар имеет несколько записей в связанных таблицах (например, несколько изображений), может возникнуть дубль. Решается добавлением GROUP BY modResource.id - но SimpleSearch не поддерживает группировку «из коробки». В таком случае используйте pdoTools или дорабатывайте запрос через событие.

    Что делать, если SimpleSearch не подходит

    Для сложной фильтрации по множеству полей (цена от-до, цвет, размер) лучше использовать mSearch2 (на базе Elasticsearch) или pdoFetch с ручным формированием запроса. SimpleSearch хорош для простого текстового поиска, но не для фасетной фильтрации.

    Заключение

    Подключение поиска по полям miniShop2 через customPackages - рабочий и документированный способ. Главное - правильно указать класс, псевдоним и условие связи. После этого вы сможете искать товары по цене, цвету, артикулу и любым другим атрибутам. Если результаты не появляются, проверьте чанк вывода и пути к модели.

    Часто задаваемые вопросы