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

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

+Как настроить сортировку по цене, если у вас есть торговые предложения(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 настройка свойств замена главного баннера политика конфиденциальности услуги кастом замена графики скролл Twitter установка Дополнительные фотографии переключение инфоблока 1с 8.3 кастомизация курьером сортировка брендов Бонусы обновления Цвет поменять товары facebook pixel распродажа Livejournal надписи внесение изменений отзывы о магазине яндекс карта кастомизация шаблона СКУ yandex настройки компонентов установка 1С-Битрикс доработка шаблона переключить каталог лайфхак сортировка товаров обновления измененного шаблона замена каталога популярные разделы Google расчет доставки накопительная система второй сайт яндекс метрика изображения youtube настройки сайта дубли переключить цветовую гамму 404 ланги специальное предложение бренды из 1С обработка персональных данных цветовая тема посадочные страницы google analytics редирект metrika наличие товары на главной Ошибка иконки каталог из 1С слетела кодировка Аксессуары установка демо емейл перечеркнутая цена 443 лендинг специальные предложения в наличии обработчик наличия цели замена надписей после выгрузки не отображаются товары GooglePageSpeed Рейтинг mysql_connect интеграция категории на главной сменить инфоблок непонятные символы установка обновления персональные данные ajax https список местоположений валюта обработчики событий цена по запросу замена языковых файлов Похожие товары самовывоз OpenID Геолокация

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

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

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

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

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