Поиск по полям 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 - рабочий и документированный способ. Главное - правильно указать класс, псевдоним и условие связи. После этого вы сможете искать товары по цене, цвету, артикулу и любым другим атрибутам. Если результаты не появляются, проверьте чанк вывода и пути к модели.