Как в mFilter2 (mSearch2) сделать фильтр категорий, но при этом не выводить в него папки с товарами, в которых расположены вариации товаров?

Для того чтобы сделать фильтр категорий в mFilter2 или mSearch2 и исключить папки с товарами, в которых расположены вариации товаров, вам понадобится некоторая кастомизация кода.

Для начала, необходимо понять, каким образом вариации товаров организованы в вашей системе. В модели данных MODX Evolution стандартным способом является создание отдельных вариаций товаров как отдельных веб-страниц, каждая из которых является дочерней страницей основного товара.

Один из подходов, который вы можете использовать, - это использование событий MODX для обработки событий на создание или изменение страницы товара и проверки, содержит ли эта страница подстраницы с вариациями товара. Если у товара есть вариации, вы можете пометить его специальной системной свойством (например, "hasVariations") для дальнейшей фильтрации.

Для этого вам потребуется создать два события: одно для обработки создания страницы товара (OnDocFormSave), другое для изменения (OnDocFormSaveAfter). Внутри обработчика события вы можете проверить, есть ли у текущей страницы дочерние элементы, которые являются вариациями товаров. Если есть, установите значение системного свойства "hasVariations" текущей страницы на true, иначе - на false.

Пример кода для обработчика события может выглядеть примерно так:

<?php
/**
 * Event handler for OnDocFormSave and OnDocFormSaveAfter events
 */

if ($modx->event->name == 'OnDocFormSave' || $modx->event->name == 'OnDocFormSaveAfter') {
    $parentId = $resource->get('parent'); // Получаем ID родительской страницы товара
    $hasVariations = $modx->getCount('modResource', array('parent' => $parentId)); // Проверяем, есть ли дочерние страницы товаров

    $resource->set('hasVariations', $hasVariations ? 1 : 0); // Устанавливаем значение системного свойства "hasVariations"
    $resource->save(); // Сохраняем изменения
}

Затем вы можете использовать это системное свойство "hasVariations" в mFilter2 (mSearch2) для фильтрации категорий. В файле конфигурации mFilter2 (mSearch2) (например, assets/snippets/msearch2/configs/default.config.inc.php) найдите раздел "CATEGORY FILTER" и добавьте следующий фрагмент кода:

'prepareCategories' => function($parentId) {
    $condition = array(
        'parent' => $parentId,
        'template' => array( /* insert your template IDs for product pages here */ ),
        'hasVariations' => 0, // Только страницы товаров без вариаций
    );
    return $condition;
},

Убедитесь, что вам нужно заменить /* insert your template IDs for product pages here */ на фактические шаблоны страниц товаров в вашей системе.

После этого фильтр категорий в mFilter2 (mSearch2) будет исключать папки с товарами, которые имеют вариации.