Автоматический вывод всех свойств категории в mFilter2

Небольшой сниппет обёртка для mFilter2 который автоматически выводит все свойства с возможностью исключать определенные.

Как пользоваться:


  1. Создаем сниппет, называем его, например: mFilter3
  2. Создаем категорию (папку, чтобы не было путаницы), называем его, например: Не участвует в фильтрации, запоминаем его ID
  3. Помещаем все свойства которые не должны участвовать в фильтрации в данную категорию

Вызов:


// MODX

[[mFilter3?
    &filters=`                            // Указываем дефолтные фильтры для всех категорий
        ms|price:number,
        ms|vendor:vendors,
        msoption|size,
        msoption|color
    `
    &hiddenCategories=`61`    // Тут указываем ID категории, можно несколько через запятую
]]

// Fenom, я пользуюсь файловыми сниппетами, потому и вызываю из файла

{'@FILE snippets/snippet.mfilter.php' | snippet : [
    'filters' => '                            // Указываем дефолтные фильтры для всех категорий
        ms|price:number,
        ms|vendor:vendors,
        msoption|size,
        msoption|color
    ',
    'hiddenCategories' => 61,    // Тут указываем ID категории, можно несколько через запятую
]}

Код сниппета:


<?php
$id = $modx->resource->id;
$opKey = 'msOption';
$copKey = 'msCategoryOption';
$hiddenCategories = explode(',', $scriptProperties['hiddenCategories']);
$filters = explode(',', $scriptProperties['filters']);

if($modx->resource->parent == 0) {
    array_unshift($filters, 'resource|parent:categories');
    $q = $modx->newQuery($opKey);
    $q->select(array("{$opKey}.key"));
} else {
    $q = $modx->newQuery($copKey);
    $q->select(array(
        "{$copKey}.category_id",
        "{$copKey}.option_id",
        "{$opKey}.key"
    ));
    $q->where(array("{$copKey}.category_id" => $id));
    $q->leftJoin($opKey, $opKey, "{$copKey}.option_id = {$opKey}.id");
}

if($hiddenCategories) $q->where(array("{$opKey}.category:NOT IN" => $hiddenCategories));
$q->prepare();
$q->stmt->execute();
$options = $q->stmt->fetchAll(PDO::FETCH_ASSOC);

$_options = array();

foreach ($options as $option) {
    $filter = '';
    
    if ($option['type'] == 'checkbox') {
      $filter = ':boolean';
    }
    
    $_options[] = 'msoption|' . $option['key'].$filter;
}

$scriptProperties['filters'] = implode(',', array_merge($filters, $_options));

return $modx->runSnippet('mFilter2', $scriptProperties);

Сниппет в случае, если документ находится в корне сайта (Это значит верхний каталог), добавляет к фильтрации вывод категорий и выбирает все свойства кроме тех у которых категории (папки) не те, что мы указали в качестве значения параметра hiddenCategories, иначе он выводит те свойства которые назначены только текущей категории товаров.

Тут напишу что-то очевидное: Вроде того, что знатоки прыгайте в комментарии и дополняйте или исправляйте код
____________________________________

На счёт цикла MIGX: Если кто ждал или ждет, извините, времени нет даже голову почесать. Есть пара материалов и как будет время буду публиковать.

Кстати: тут Сергей Шлоков спросил аксакал он или нет, отвечу тут:

Конечно аксакал.
А я буду надеяться, что я джигит)

☕ Угостить чашкой кофе
Баха Волков
14 декабря 2018, 15:13
modx.pro
13
1 374
+9

Комментарии: 4

Андрей
14 декабря 2018, 17:09
+3
Для чекбоксов, да/нет можно добавить условие, недавно просто делал такую задачу.

foreach ($options as $option) {
    $filter = '';
    
    if ($option['type'] == 'checkbox') {
      $filter = ':boolean';
    }
    
    $_options[] = 'msoption|' . $option['key'].$filter;
}
    Баха Волков
    14 декабря 2018, 17:12
    0
    Ок, добавил
      Андрей
      14 декабря 2018, 21:56
      0
      Есть ещё интересная задача, чтобы в каждой категории можно было выбирать определённый набор фильтров =)
        Павел Голубев
        19 декабря 2018, 14:10
        0
        Что-то типа наследования наборов фильтров в категориях?
    Авторизуйтесь или зарегистрируйтесь, чтобы оставлять комментарии.
    4