Телефон отдела продаж
Email отдела продаж
Email тех. поддержки
Не нашли ответ на свой вопрос
Просмотров: 22143

Сортировка товаров и торговых предложений по цене с учетом скидки

+Как настроить сортировку по цене, если у вас есть торговые предложения(SKU)
Сортировка товаров и торговых предложений по цене с учетом скидки

Необходимо создать свойства полей товара "MINIMUM_PRICE" и "MAXIMUM_PRICE", и они должны быть целочисленные. Затем нужно добавить код в файл /bitrix/php_interface/init.php

Файл init.php Информация по файлу init.php
<?

AddEventHandler("iblock", "OnAfterIBlockElementUpdate", "DoIBlockAfterSave");
AddEventHandler("iblock", "OnAfterIBlockElementAdd", "DoIBlockAfterSave");
AddEventHandler("catalog", "OnPriceAdd", "DoIBlockAfterSave");
AddEventHandler("catalog", "OnPriceUpdate", "DoIBlockAfterSave");

function DoIBlockAfterSave($arg1, $arg2 = false){

	global $USER;
	$ELEMENT_ID = false;
	$IBLOCK_ID = false;
	$OFFERS_IBLOCK_ID = false;
	$OFFERS_PROPERTY_ID = false;
	$BX_SITE_ID = "s1"; //you site id

	if (CModule::IncludeModule('currency'))
		$strDefaultCurrency = CCurrency::GetBaseCurrency();
	//Check for catalog event

	if(is_array($arg2) && $arg2["PRODUCT_ID"] > 0){
		//Get iblock element
		$rsPriceElement = CIBlockElement::GetList(
			array(),
			array(
				"ID" => $arg2["PRODUCT_ID"],
			),
			false,
			false,
			array("ID", "IBLOCK_ID")
		);
		if($arPriceElement = $rsPriceElement->Fetch()){
			$arCatalog = CCatalog::GetByID($arPriceElement["IBLOCK_ID"]);
			if(is_array($arCatalog)){
				//Check if it is offers iblock
				if($arCatalog["OFFERS"] == "Y"){
					//Find product element
					$rsElement = CIBlockElement::GetProperty(
						$arPriceElement["IBLOCK_ID"],
						$arPriceElement["ID"],
						"sort",
						"asc",
						array("ID" => $arCatalog["SKU_PROPERTY_ID"])
					);
					$arElement = $rsElement->Fetch();
					if($arElement && $arElement["VALUE"] > 0){
						$ELEMENT_ID = $arElement["VALUE"];
						$IBLOCK_ID = $arCatalog["PRODUCT_IBLOCK_ID"];
						$OFFERS_IBLOCK_ID = $arCatalog["IBLOCK_ID"];
						$OFFERS_PROPERTY_ID = $arCatalog["SKU_PROPERTY_ID"];
					}
				}
				//or iblock which has offers
				elseif($arCatalog["OFFERS_IBLOCK_ID"] > 0){
					$ELEMENT_ID = $arPriceElement["ID"];
					$IBLOCK_ID = $arPriceElement["IBLOCK_ID"];
					$OFFERS_IBLOCK_ID = $arCatalog["OFFERS_IBLOCK_ID"];
					$OFFERS_PROPERTY_ID = $arCatalog["OFFERS_PROPERTY_ID"];
				}
				//or it's regular catalog
				else{
					$ELEMENT_ID = $arPriceElement["ID"];
					$IBLOCK_ID = $arPriceElement["IBLOCK_ID"];
					$OFFERS_IBLOCK_ID = false;
					$OFFERS_PROPERTY_ID = false;
				}
			}
		}
	}
	//Check for iblock event
	elseif(is_array($arg1) && $arg1["ID"] > 0 && $arg1["IBLOCK_ID"] > 0){
		//Check if iblock has offers
		$arOffers = CIBlockPriceTools::GetOffersIBlock($arg1["IBLOCK_ID"]);
		if(is_array($arOffers)){
			$ELEMENT_ID = $arg1["ID"];
			$IBLOCK_ID = $arg1["IBLOCK_ID"];
			$OFFERS_IBLOCK_ID = $arOffers["OFFERS_IBLOCK_ID"];
			$OFFERS_PROPERTY_ID = $arOffers["OFFERS_PROPERTY_ID"];
		}
	}

	if($ELEMENT_ID){
		static $arPropCache = array();
		if(!array_key_exists($IBLOCK_ID, $arPropCache)){
			//Check for MINIMAL_PRICE property
			$rsProperty = CIBlockProperty::GetByID("MINIMUM_PRICE", $IBLOCK_ID);
			$arProperty = $rsProperty->Fetch();
			if($arProperty)
				$arPropCache[$IBLOCK_ID] = $arProperty["ID"];
			else
				$arPropCache[$IBLOCK_ID] = false;
		}

		if($arPropCache[$IBLOCK_ID]){
			//Compose elements filter
			if($OFFERS_IBLOCK_ID){
				$rsOffers = CIBlockElement::GetList(
					array(),
					array(
						"IBLOCK_ID" => $OFFERS_IBLOCK_ID,
						"PROPERTY_".$OFFERS_PROPERTY_ID => $ELEMENT_ID,
					),
					false,
					false,
					array("ID")
				);
				while($arOffer = $rsOffers->Fetch())
					$arProductID[] = $arOffer["ID"];

				if (!is_array($arProductID))
					$arProductID = array($ELEMENT_ID);
			}
			else
				$arProductID = array($ELEMENT_ID);

			$minPrice = false;
			$maxPrice = false;

			foreach ($arProductID as $productID) {

				$arDiscountPrice = CCatalogProduct::GetOptimalPrice($productID, 1, $USER->GetUserGroupArray(), false, false, $BX_SITE_ID);

				if (CModule::IncludeModule('currency') && $strDefaultCurrency != $arDiscountPrice['RESULT_PRICE']['CURRENCY'])
					$arDiscountPrice['DISCOUNT_PRICE'] = CCurrencyRates::ConvertCurrency($arDiscountPrice['DISCOUNT_PRICE'], $arDiscountPrice['RESULT_PRICE']["CURRENCY"], $strDefaultCurrency);

				$PRICE = $arDiscountPrice['DISCOUNT_PRICE'];

				if($minPrice === false || $minPrice > $PRICE)
					$minPrice = $PRICE;

				if($maxPrice === false || $maxPrice < $PRICE)
					$maxPrice = $PRICE;
			}

			//Save found minimal price into property
			if($minPrice !== false){
				CIBlockElement::SetPropertyValuesEx(
					$ELEMENT_ID,
					$IBLOCK_ID,
					array(
						"MINIMUM_PRICE" => $minPrice,
						"MAXIMUM_PRICE" => $maxPrice,
					)
				);
			}
		}
	}
}
?>

Также в старых версиях решения DELUXE нужно поменять поля, по которым будут сортироваться товары в bitrix/templates/имя_шаблона/components/bitrix/catalog/.default/section.php

<?$BASE_PRICE = CCatalogGroup::GetBaseGroup();?>
<?$arSortFields = array(
  "SHOWS" => array(
    "ORDER"=> "DESC",
    "CODE" => "SHOWS",
    "NAME" => GetMessage("CATALOG_SORT_FIELD_SHOWS")
  ),  
  "NAME" => array( // параметр в url
    "ORDER"=> "ASC", //в возрастающем порядке
    "CODE" => "NAME", // Код поля для сортировки
    "NAME" => GetMessage("CATALOG_SORT_FIELD_NAME") // имя для вывода в публичной части, редактировать в (/lang/ru/section.php)
  ),
  "PRICE_ASC"=> array(
    "ORDER"=> "ASC",
    "CODE" => "PROPERTY_MINIMUM_PRICE",  // изменен для сортировки по ТП
    "NAME" => GetMessage("CATALOG_SORT_FIELD_PRICE_ASC")
  ),
  "PRICE_DESC" => array(
    "ORDER"=> "DESC",
    "CODE" => "PROPERTY_MAXIMUM_PRICE", // изменен для сортировки по ТП
    "NAME" => GetMessage("CATALOG_SORT_FIELD_PRICE_DESC")
  )
);?>

Также для сортировки в разделе новинки и т.д.

Нужно создать новый шаблон и в нем поменять поля сортировки , аналогично коду выше

Хотим заметить, что сортировка работает по базовой цене и если вы используете торговые предложения , то не нужно заполонять цену у основного товара

 
Текст сообщения*
Популярные теги
каталог настройка карточки товара корзина 4.00 цены свойства баннеры на сайт баннеры создание тегов производители карточка товара характеристики товара включение тегов добавление тегов настройка тегов теги установка готового решения выпадающее меню торговые предложения загрузка картинок в меню обратная связь настройка каталога коллекции настройка меню формы бренды оформление заказа слайдеры выбор города Наши предложения ошибки настройка брендов загрузить логотип активация купона лого ТП заменить лого почта логотип список товаров загрузка логотипа почтовые шаблоны свойства товаров настройка производителей умный фильтр замена баннеров скидки SKU настройка свойств замена главного баннера политика конфиденциальности услуги кастом замена графики замена картинок изменение шаблона цветовая гамма logo типы цен замена логотипа Ошибка иконки редирект metrika наличие товары на главной установка демо емейл перечеркнутая цена 443 каталог из 1С слетела кодировка Аксессуары обработчик наличия цели замена надписей после выгрузки не отображаются товары GooglePageSpeed лендинг специальные предложения в наличии интеграция Рейтинг mysql_connect установка обновления персональные данные ajax категории на главной сменить инфоблок непонятные символы обработчики событий цена по запросу замена языковых файлов Похожие товары https список местоположений валюта Геолокация панель настроек инфоблок самовывоз OpenID фильтр письма ATT_BRAND кодировка сменить каталог Артикул новинка jivosite веб формы Главная страница панель управления как сделать оптовые цены PHP7 уведомления фильтр по параметрам ПКД Blogger сменить цвет сайта Баннер новинки обратный звонок чат для сайта зачеркнутая цена landing Магазины ссылки Вид корзины города Партнерская программа карта Rambler улицы фильтрация по наличию заказать звонок подгрузка брендов cookies консультант сменить цветовую схему новости окно куки шаблон корзины иероглифы правила работы с корзиной lang маркер старая цена видео группы доставок

Оставить обращение в тех. поддержку

Ваше обращение будет обработано в течение 48 часов с момента регистрации. Обращения обрабатываются: по будним дням с 12:00 до 18:00 (МСК). Правила оказания технической поддержки Вы можете посмотреть здесь

Ваше имя?*
Электронная почта*
Тема обращения*
Адрес сайта*
Логин и пароль от системы администрирования*
Описание проблемы*
Защита от автоматического заполнения
Введите символы с картинки*

* - обязательные поля

Сообщение отправлено
Ваше сообщение успешно отправлено. В ближайшее время с Вами свяжется наш специалист
Закрыть окно