====== Сортировка по величине скидки для адаптивных фильтров ======
Была задача реализовать сортировку товаров по абсолютной величине скидки, ниже представлена реализация такой сортировки для [[private:market:extended_filters:programmist|адаптивных фильтров]]. Для добавления нового способа сортировки в адаптивных фильтрах необходимо расширить метод ''setSorting'' контроллера ''Extendedfilters_Shop'' и добавить желуемую сортировку следующим образом:
_sorting))
{
$usedSorting[] = 'discount_0';
$sAbsoluteDiscountField = 'absolute_discount';
$sAbsoluteDiscountSwitch = '0';
if (count($this->getArrayActiveDiscountsId()))
{
// Получаем список валют магазина
$aoShopCurrencies = Core_Entity::factory('Shop_Currency')->findAll();
foreach ($aoShopCurrencies as $oShopCurrency)
{
// Получаем коэффициент пересчета для каждой валюты
$currencyCoefficient = Shop_Controller::instance()->getCurrencyCoefficientInShopCurrency(
$oShopCurrency, $this->getEntity()->Shop_Currency
);
$sAbsoluteDiscountSwitch = "
IF (`shop_items`.`shop_currency_id` = '{$oShopCurrency->id}',
IF (shop_discounts.value,
IF (shop_discounts.type,
IF (`shop_discounts`.`value` < `shop_items`.`price` * {$currencyCoefficient},
`shop_discounts`.`value`,
0
),
`shop_items`.`price` * shop_discounts.value * {$currencyCoefficient} / 100
),
0
),
{$sAbsoluteDiscountSwitch})
";
}
}
Core_Event::attach('shop_item.onCallabsolute_discount', function () {});
$this
->_Shop_Items
->queryBuilder()
->select(array(Core_QueryBuilder::expression($sAbsoluteDiscountSwitch), $sAbsoluteDiscountField))
->orderBy($sAbsoluteDiscountField, 'DESC');
}
// ...
}
}
Метод ''setSorting'' достаточно объемный, необходимо оставить все его тело и интегрировать туда этот код. Используемый здесь подход можно адаптировать и применить для стандартных фильтров.
Страницу создал Максим Засорин 20.10.17 в 16:37