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

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

+Как настроить сортировку по цене, если у вас есть торговые предложения(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 цены свойства баннеры на сайт теги установка готового решения баннеры карточка товара включение тегов добавление тегов создание тегов производители характеристики товара настройка тегов бренды оформление заказа выпадающее меню слайдеры загрузка картинок в меню обратная связь торговые предложения настройка каталога коллекции настройка меню формы logo замена логотипа выбор города цветовая гамма Наши предложения типы цен ошибки настройка брендов загрузить логотип активация купона лого заменить лого логотип загрузка логотипа ТП почта список товаров настройка производителей замена баннеров почтовые шаблоны свойства товаров SKU настройка свойств замена главного баннера умный фильтр кастом замена графики скидки политика конфиденциальности замена картинок услуги изменение шаблона обновления измененного шаблона замена каталога Яндекс Google Разные профили цен для разных пользователей лайфхак таймер обратного отсчета второй сайт установка переключение инфоблока изображения скролл накопительная система дубли Цвет 404 поменять товары youtube сортировка брендов настройки сайта обработка персональных данных яндекс карта google analytics распродажа ланги бренды из 1С установка 1С-Битрикс Ошибка переключить каталог иконки metrika СКУ наличие емейл 443 популярные разделы каталог из 1С Аксессуары сортировка товаров обработчик наличия замена надписей яндекс метрика GooglePageSpeed расчет доставки лендинг в наличии переключить цветовую гамму интеграция mysql_connect цветовая тема ajax посадочные страницы категории на главной специальное предложение непонятные символы обработчики событий замена языковых файлов https редирект валюта товары на главной Геолокация установка демо панель настроек перечеркнутая цена инфоблок OpenID слетела кодировка цели ATT_BRAND после выгрузки не отображаются товары кодировка Артикул специальные предложения новинка jivosite Рейтинг веб формы Главная страница установка обновления панель управления персональные данные как сделать оптовые цены PHP7 сменить инфоблок цена по запросу Blogger Похожие товары Баннер список местоположений

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

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

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

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

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