private:koding:hostcms:modules:shop:useful:discount_sorting

Сортировка по величине скидки для адаптивных фильтров

Была задача реализовать сортировку товаров по абсолютной величине скидки, ниже представлена реализация такой сортировки для адаптивных фильтров. Для добавления нового способа сортировки в адаптивных фильтрах необходимо расширить метод setSorting контроллера Extendedfilters_Shop и добавить желуемую сортировку следующим образом:

<?php
 
class Shop_Controller_Show_ExtendedWithSorting extends Extendedfilters_Shop
{
	protected function setSorting()
	{
		// ...
 
		if (in_array('discount_0', $this->_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

private/koding/hostcms/modules/shop/useful/discount_sorting.txt · Last modified: 20.10.17 в 16:47 by maximzasorin_gmail.com