Фильтр связей по мастеру и характеристикам "раба"
Добрый день. Имеется следующая структура — есть база товаров, разбитая по категориям. Например
-Asus
--N Series
---Asus N53
---Asus N73
--A Series
---Asus A53
---Asus A73
-Acer
--Aspire
---Aspire 50C
---Aspire 60C
…
И так далее
И имеется база комплектующих — которые связаны связью «один ко многим» (к одному товару подходит много комплектующих).
Требуется собственно искать комплектующие, которые подходят к Товарам выбранной категории, например «Комплектующие для всех Asus N53» или «Комплектующие для ASUS», но так же требуется и фильтровать полученные результаты по цене или например наличию данной комплектующей.
Собственно вопрос — возможно ли это сделать средствами mFilter2 или необходимо изобретать что-то своё?
-Asus
--N Series
---Asus N53
---Asus N73
--A Series
---Asus A53
---Asus A73
-Acer
--Aspire
---Aspire 50C
---Aspire 60C
…
И так далее
И имеется база комплектующих — которые связаны связью «один ко многим» (к одному товару подходит много комплектующих).
Требуется собственно искать комплектующие, которые подходят к Товарам выбранной категории, например «Комплектующие для всех Asus N53» или «Комплектующие для ASUS», но так же требуется и фильтровать полученные результаты по цене или например наличию данной комплектующей.
Собственно вопрос — возможно ли это сделать средствами mFilter2 или необходимо изобретать что-то своё?
Комментарии: 3
В общем-то, делается это примерно так
<?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
Владимир, можно подробнее как это работает?
Я правильно понимаю что тут идет подмена полей мастера полями раба чтобы mfilter2 фильтровал по рабам а мастеров выводил всегда с различными полями?
Я правильно понимаю что тут идет подмена полей мастера полями раба чтобы mfilter2 фильтровал по рабам а мастеров выводил всегда с различными полями?
Нет, подмены никакой. Просто создается огромная таблица, основа которой — связи с данными кто мастер и кто раб. Затем джойнятся соответствующие таблицы чтобы была еще и вся информация и у мастера и у раба. Получается огромная таблица со всеми данными и дальше уже можем фильтровать по чему угодно, просто в where указывать msProductMaster. или msProductSlave. перед названием поля по которому выборка.
Авторизуйтесь или зарегистрируйтесь, чтобы оставлять комментарии.