Фильтр связей по мастеру и характеристикам "раба"

Добрый день. Имеется следующая структура — есть база товаров, разбитая по категориям. Например
-Asus
--N Series
---Asus N53
---Asus N73
--A Series
---Asus A53
---Asus A73
-Acer
--Aspire
---Aspire 50C
---Aspire 60C

И так далее
И имеется база комплектующих — которые связаны связью «один ко многим» (к одному товару подходит много комплектующих).
Требуется собственно искать комплектующие, которые подходят к Товарам выбранной категории, например «Комплектующие для всех Asus N53» или «Комплектующие для ASUS», но так же требуется и фильтровать полученные результаты по цене или например наличию данной комплектующей.

Собственно вопрос — возможно ли это сделать средствами mFilter2 или необходимо изобретать что-то своё?
Владимир Новопашин
22 июня 2017, 15:47
modx.pro
1
1 070
0

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

Владимир Новопашин
27 июня 2017, 15:49
0
В общем-то, делается это примерно так
<?php

$query = $modx->newQuery('msProductLink');
$query->leftJoin('msProduct', 'msProductMaster', 'msProductLink.master = msProductMaster.id');
$query->leftJoin('msProductData', 'msProductDataMaster', 'msProductLink.master = msProductDataMaster.id');
$query->leftJoin('msProduct', 'msProductSlave', 'msProductLink.slave = msProductSlave.id');
$query->leftJoin('msProductData', 'msProductDataSlave', 'msProductLink.slave = msProductDataSlave.id');
if (isset($where)){
    $query->where($where);
}
$query->groupby('msProductLink.slave');

$links = $modx->getCollection('msProductLink', $query);

$results = array();
foreach($links as $id => $link){
    $ids = explode('-', $id);
    $results[] = $ids[2];
}
$output = implode(',', $results);

return $output;
Затем вызываем этот сниппет навроде
{set $resources = '!getSlaves' | snippet : ['where' => 'msProductMaster.id IN (1,2,3,4,5,6) AND msProductDataSlave.price <= 2000']}
где для указания каких-либо параметров мастера\раба используем msProductMaster.PARAMNAME\msProductSlave.PARAMNAME соответственно, а для фильтра по их характеристикам msProductDataMaster.PARAMNAME\msProductDataSlave.PARAMNAME — и уже переменную $resources прописываем куда нужно — в pdoPage или pdoResources или еще куда в параметр resources
    Вячеслав Варов
    08 октября 2018, 12:53
    0
    Владимир, можно подробнее как это работает?

    Я правильно понимаю что тут идет подмена полей мастера полями раба чтобы mfilter2 фильтровал по рабам а мастеров выводил всегда с различными полями?
      Владимир Новопашин
      08 октября 2018, 15:53
      0
      Нет, подмены никакой. Просто создается огромная таблица, основа которой — связи с данными кто мастер и кто раб. Затем джойнятся соответствующие таблицы чтобы была еще и вся информация и у мастера и у раба. Получается огромная таблица со всеми данными и дальше уже можем фильтровать по чему угодно, просто в where указывать msProductMaster. или msProductSlave. перед названием поля по которому выборка.
    Авторизуйтесь или зарегистрируйтесь, чтобы оставлять комментарии.
    3