Телефон отдела продаж
Email отдела продаж
Email тех. поддержки
Не нашли ответ на свой вопрос
Просмотров: 15342
Сортировка товаров и торговых предложений по цене с учетом скидки
+Как настроить сортировку по цене, если у вас есть торговые предложения(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 Баннер замена главного баннера настройка свойств умный фильтр ТП замена графики выбор города замена картинок изменение шаблона ошибки Наши предложения загрузить логотип замена логотипа настройка брендов заменить лого лого свойства товаров типы цен хит продаж шаблон корзины .htaccess Google jivosite youtube Главная страница Похожие товары Яндекс веб формы гугл пейдж спид зачеркнутая цена интеграция кодировка новинки обратный звонок перечеркнутая цена села сменить цветовую схему цвет футера шаблон оформления 1с 8.3 GooglePageSpeed Twitter landing Аксессуары Дополнительные фотографии Редактирование видео дизайн заказать звонок иероглифы инфоблок маркер новости оптимизация сайта письма ссылки уведомления установка демо шапка сайта LiveId ajax lazy load Артикул Кастом Рейтинг изменение верстки карта консультант местоположения новый слайдер отзывы подгрузка брендов правила работы с корзиной скорость загрузки сортировка старая цена улицы установка обновления яндекс карта 404 Liveinternet custom Корзина СКУ внесение изменений доработка шаблона изменение заголовков многосайтовость обновление шаблона отзывы о магазине поиск скролл сортировка брендов счетчики фильтр цели яндекс метрика 443 Livejournal email администратора mysql_connect Бонусы Магазины второй сайт дубли изменение функционала кастом купоны на скидку накопительная система

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

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

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

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

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