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

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

+Как настроить сортировку по цене, если у вас есть торговые предложения(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 типы цен загрузка логотипа кастом активация купона цветовая тема настройка брендов ТП замена баннеров лого Баннер замена главного баннера логотип список товаров фильтр по параметрам оптимизация сайта Blogger сменить цвет сайта Магазины Вконтакте перечеркнутая цена landing ссылки улицы новый слайдер Дополнительные фотографии Похожие товары кодировка robots.txt фильтрация по наличию отзывы cookies сменить цветовую схему маркер внесение изменений чат для сайта персональные данные изображения lang старая цена О компании доработка шаблона .htaccess Бонусы отзывы о магазине custom местоположения второй сайт шаблон корзины письма иконки lazy load счетчики ускорение сайта обновление шаблона дубли $_SERVER['HTTPS'] села консультант ssl замена надписей email администратора соответствие законодательству многосайтовость настройка согласий в формах шаблон оформления ПКД интеграция LiveId таймер Twitter обновления емейл 152-фз бренды из 1С хит продаж Ошибка замена языковых файлов Facebook сортировка Мой Мир@mail.ru шапка сайта подгрузка брендов инфоблок Liveinternet таймер обратного отсчета yandex установка обновления измененного шаблона 1с 8.3 скорость загрузки купоны на скидку в наличии Цвет facebook pixel сортировка брендов надписи настройки компонентов Геолокация языковые файлы поиск правила работы с корзиной

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

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

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

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

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