Телеграм: @camouf_ru Почта: mihail@bazarow.ru

Вывести минимальную цену торговых предложений в Битрикс

Просмотров: 26824

Если у товара несколько торговых предложений и у каждого предложения разные цены, иногда требуется вывести минимальную цену торговых предложений, отсортировав ее из всех торговых предложений. Можно воспользоваться API Битрикс обратившись к CCatalogSKU::GetInfoByProductIBlock

Если у товара несколько торговых предложений и у каждого предложения разные цены, иногда требуется вывести минимальную цену торговых предложений, отсортировав ее из всех торговых предложений. Можно воспользоваться API Битрикс обратившись к CCatalogSKU::GetInfoByProductIBlock

Сделать это просто, нужно добавить вот такой код в catalog.section:


<div class="pricebl"> 
<? 
 	$intIBlockID = 4; 
 	$mxResult = CCatalogSKU::GetInfoByProductIBlock( 
 	$intIBlockID 
); 
if (is_array($mxResult)) 
{ 
$rsOffers = CIBlockElement::GetList(array("PRICE"=>"ASC"),array('IBLOCK_ID' => $mxResult['IBLOCK_ID'], 'PROPERTY_'.$mxResult['SKU_PROPERTY_ID'] => $arElement["ID"])); 
 while ($arOffer = $rsOffers->GetNext()) 
 	 	{ 
 		 	$ar_price = GetCatalogProductPrice($arOffer["ID"], 1); 
 		 	echo "<p>от ".$ar_price["PRICE"]." руб. </p>" ; 
 		 	break; 
 		 } 
 } 
 ?> 
 </div> 
 

Где:
$intIBlockID = 4; - ID нашего инфоблока
GetCatalogProductPrice($arOffer["ID"], 1); - ID необходимого типа цен для вывода

Усложненный вариант вывода:

Если нужно помимо минимальной стоимости показать еще и цены отдельных предложений, плюс дать возможность отправить заказ конкретного предложения в корзину. Можно использовать вот такой код:

 <?if(is_array($arElement["OFFERS"]) && !empty($arElement["OFFERS"])):?> 
 <!-- Показываем наименьшую для от --> 
 		<div class="pricebl"> 
 				<? 
 					$intIBlockID = 32; 
 					$mxResult = CCatalogSKU::GetInfoByProductIBlock( 
 					$intIBlockID 
 					); 
 					if (is_array($mxResult)) 
 						{ 
 							$rsOffers = CIBlockElement::GetList(array("PRICE"=>"ASC"),array('IBLOCK_ID' => $mxResult['IBLOCK_ID'], 'PROPERTY_'.$mxResult['SKU_PROPERTY_ID'] => $arElement["ID"])); 
 							while ($arOffer = $rsOffers->GetNext()) 
 								{ 
 									$ar_price = GetCatalogProductPrice($arOffer["ID"], 7); 
 									echo "<p>от " .$ar_price["PRICE"]. " руб.</p>" ; 
 									break; 
 								} 
 						} 
 			 ?> 
 		 </div> 
 <!-- Показываем предложения товаров --> 
 		<div class="offers"> 
 		<table class="offerstb" width="100%" cellspacing="0" cellpadding="0"> 
 				<?foreach($arElement["OFFERS"] as $arOffer):?> 
 					<tr> 
 					<?foreach($arOffer["PRICES"] as $code=>$arPrice):?> 
 						<?if($arPrice["CAN_ACCESS"]):?> 
 							<td><b><?=$arPrice["PRINT_VALUE"]?></b></td> 
 						<?endif;?> 
 					<?endforeach;?> 
 					<td width="100"><p>/ 
 					<?foreach($arOffer["DISPLAY_PROPERTIES"] as $pid=>$arProperty):?> 
 							<? 
 							if(is_array($arProperty["DISPLAY_VALUE"])) 
 								echo implode("&nbsp;/&nbsp;", $arProperty["DISPLAY_VALUE"]); 
 							else 
 								echo $arProperty["DISPLAY_VALUE"]; 
 							?> 
 						кг.</p> 
 					<?endforeach?> 
 					</td><td> 
 							<form action="<?=POST_FORM_ACTION_URI?>" method="post" enctype="multipart/form-data"> 
 								<input type="text" name="<?echo $arParams["PRODUCT_QUANTITY_VARIABLE"]?>" value="1" size="5" style="display:none;"> 
 								<input type="hidden" name="<?echo $arParams["ACTION_VARIABLE"]?>" value="BUY"> 
 								<input type="hidden" name="<?echo $arParams["PRODUCT_ID_VARIABLE"]?>" value="<?echo $arOffer["ID"]?>"> 
 								<input type="submit" name="<?echo $arParams["ACTION_VARIABLE"]."BUY"?>" value="Купить" style="display:none;"> 
 								<input type="submit" name="<?echo $arParams["ACTION_VARIABLE"]."ADD2BASKET"?>" value="В корзину"> 
 							</form> 
 					</td></tr> 
 				<?endforeach;?> 
 		</table> 
 		</div> 
 <?else:?><!-- Если у товара предложений вообще нет --> 
 	<?foreach($arElement["PRICES"] as $code=>$arPrice):?> 
 		<?if($arPrice["CAN_ACCESS"]):?> 
 			<div class="nooffers"> 
 			<?if($arPrice["DISCOUNT_VALUE"] < $arPrice["VALUE"]):?> 
 				<s><?=$arPrice["PRINT_VALUE"]?></s> <?=$arPrice["PRINT_DISCOUNT_VALUE"]?> 
 			<?else:?> 
 				<p><?=$arPrice["PRINT_VALUE"]?></p> 
 			<?endif;?> 
 			<noindex> 
 			     <a href="<?echo $arElement["ADD_URL"]?>" rel="nofollow">В корзину</a> 
 			</noindex> 
 			</div> 
 		<?endif;?> 
 	<?endforeach;?> 
 <?endif?> 

Получится примерно так. С помощью стилей можно будет сделать так, чтобы предложения показывались только при наведении.

Шаблон списка элементов как у битрикс

И напоследок, модернизация данного решения до вида похожего на список элементов как в типовом шаблоне битрикс Одежда+, но более простого для чтения и внесения правок (на основе описанного выше метода). Суть в том, что вывод торговых предложений представлен в виде табов. Скачать

Выглядит вот так:

Сергей Бушкевич 12.12.2017
Михаил, не подскажете. Почему при вставке этой функции в цене выводятся нули после запятой. Хотя на всем сайте цена выводится без их
Антон Сурнин 13.06.2018
Добрый день!
Подскажите пожалуйста как вывести цену и название.
Использую ред. Старт.
Цена хранится в созданом мной поле price.

Код
<?if(!defined("B_PROLOG_INCLUDED") || B_PROLOG_INCLUDED!==true)die();?>

 <?foreach($arResult["ITEMS"] as $cell=>$arElement):?>
 <?
 $this->AddEditAction($arElement['ID'], $arElement['EDIT_LINK'], CIBlock::GetArrayByID($arParams["IBLOCK_ID"], "ELEMENT_EDIT"));
 $this->AddDeleteAction($arElement['ID'], $arElement['DELETE_LINK'], CIBlock::GetArrayByID($arParams["IBLOCK_ID"], "ELEMENT_DELETE"), array("CONFIRM" => GetMessage('CT_BCS_ELEMENT_DELETE_CONFIRM')));
 ?>
 <div id="<?=$this->GetEditAreaId($arElement['ID']);//вывод товара (id панель управления/редактирования товара)?>">

 <?
 $renderImageCat = CFile::ResizeImageGet($arElement["PREVIEW_PICTURE"], Array("width" => 267, "height" => 400), BX_RESIZE_IMAGE_EXACT, false);
 ?>

 <a href="<?=$arElement["DETAIL_PAGE_URL"]?>" title="<?=$arElement["NAME"]?>">
 <img border="0" src="<?echo $renderImageCat['src']?>" alt="<?=$arElement["NAME"]?>" />
 </a>
 <?if(is_array($arElement["OFFERS"]) && !empty($arElement["OFFERS"]))://вывод цены?>

 <?
 $intIBlockID = 3;
 $mxResult = CCatalogSKU::GetInfoByProductIBlock(
 $intIBlockID
 );
 if (is_array($mxResult))
 {

 $rsOffers = CIBlockElement::GetList(array("PRICE"=>"ASC"),
 array('IBLOCK_ID' => $mxResult['IBLOCK_ID'],
 'PROPERTY_'.$mxResult['SKU_PROPERTY_ID'] => $arElement["ID"]));
 while ($arOffer = $rsOffers->GetNext())
 {
 $ar_price = GetCatalogProductPrice($arOffer["ID"], 1);
 echo "<p>от ".$ar_price["PRICE"]." руб. </p>" ;
 break;
 }
 }
 ?>

 <?else:?>
 <?foreach($arElement["PRICES"] as $code=>$arPrice):?>
 <?if($arPrice["CAN_ACCESS"]):?>
 <p><?=$arResult["PRICES"][$code]["TITLE"];?>:  
 <?if($arPrice["DISCOUNT_VALUE"] < $arPrice["VALUE"]):?>
 <s><?=$arPrice["PRINT_VALUE"]?></s> <span class="catalog-price"><?=$arPrice["PRINT_DISCOUNT_VALUE"]?></span>
 <?else:?><span class="catalog-price"><?=$arPrice["PRINT_VALUE"]?></span><?endif;?>
 </p>
 <?endif;?>
 <?endforeach;?>
 <?endif?>
 <?endforeach; // foreach($arResult["ITEMS"] as $arElement):?>
<?if($arParams["DISPLAY_BOTTOM_PAGER"]):?>
<?=$arResult["NAV_STRING"]?>
<?endif;?>
В общем-то шаблон создан по видео Михаила.
Михаил Базаров 14.06.2018
Цитата
Антон Сурнин написал:
Добрый день!
Подскажите пожалуйста как вывести цену и название.
Использую ред. Старт.
Цена хранится в созданом мной поле price.

В старте нет модуля sale (магазина). Если цена просто в свойстве, выводите как простое свойство- типа строка

<? echo $arResult['DISPLAY_PROPERTIES']['КОД_СВОЙСТВА']['~VALUE'];?>
Артур 08.08.2018
Добрый день, мы используем несколько видов цен,
подскажите пожалуйста как Вывести минимальную цену(тип цены Опт id=3) торговых предложений.
спс)
Михаил Базаров 08.08.2018
Цитата
Артур пишет:
$ar_price
Распечатайте массив $ar_price

Код
echo '<pre>'; printr($ar_price);  echo '</pre>'; 
Там увидите, в массиве, в каком параметре передается нужная цена
Вячеслав 19.07.2019
Михаил, насколько я понял ["SKU_PROPERTY_ID"] - это ID свойства привязки предложения к товару.
И соответственно выводится не минимальная цена СКУ, а цена у которого ID наименьший среди других. На моем примере это видно (см.скрин). https://yadi.sk/i/w1yKStmgcMKAUQ
Так как сделать сортировку именно по цене?
Михаил Базаров 19.07.2019
Цитата
Вячеслав пишет:
Михаил, насколько я понял ["SKU_PROPERTY_ID"] - это ID свойства привязки предложения к товару.
И соответственно выводится не минимальная цена СКУ, а цена у которого ID наименьший среди других. На моем примере это видно (см.скрин). https://yadi.sk/i/w1yKStmgcMKAUQ
Так как сделать сортировку именно по цене?
Вот это правило сортировки, должно вывести именно наименьшую цену
"PRICE"=>"ASC"
Вячеслав 22.07.2019
Разобрался.
В новой версии модуля catalog (начиная с версии 18.6.200) изменились поля.
Теперь для сортировки по цене нужно в getlist передавать параметр catalog_PRICE_типцены.
То-есть вместо "PRICE"=>"ASC" указываем "catalog_PRICE_1"=>"ASC".
https://dev.1c-bitrix.ru/learning/course/index.php?COURSE_ID=43&LESSON_ID=12183#iblock_18_6_200
В старой версии модуля будет работать старый метод.
Johnny Po 19.12.2019
Михаил спасибо за ваши статьи и помощь начинающим.

Как исключить неактивные торг. предложения ?
Johnny Po 19.12.2019
Цитата
Johnny Po написал:
Как исключить неактивные торг. предложения ?

разобрался сам,  добавил в фильтр   'ACTIVE' => 'Y'
Код
$mxResult['IBLOCK_ID'], 'ACTIVE' => 'Y', 'PROPERTY_'.$mxResult['SKU_PROPERTY_ID'] => $arItem["ID"])

Записная книжка разработчика

Примерно с 2013-го года пишу заметки по разработке сайтов на Битрикс.
Вы можете задавать уточняющие вопросы в комментариях- отвечаю или дополняю заметки по возможности.

Многосайтовость битрикс на разных доменах и поддоменах Просмотров: 61197 Часто спрашивают "как настроить многосайтовость Битрикс на разных доменах", решил записать... Информация о заказах и содержимое корзины текущего пользователя. Просмотров: 11734 В процессе разработки сайта могут понадобиться рецепты приведенные ниже. Использовать можн... Создание блога с комментариями, оценками и просмотрами на сайте с 1С-... Просмотров: 22989 Если на вашем сайте требуется создание раздела с блогом или новостями, статьями. Записям в... Вывести свойство привязка к Яндекс Картам в Битрикс Просмотров: 18143 Часто бывает нужно вывести свойство привязка к Яндекс карте в детальном описании элемента... Заполнение габаритов товара, после обмена с 1С, из свойств элемента и... Просмотров: 10383 Если Ваш интернет-магазин интегрирован с 1С, скорее всего столкнулись с такой проблемой: 1... Как работает система сертификации партнеров 1С-Битрикс, уровни партне... Просмотров: 3456 Сертификация от «1С-Битрикс» – это объективная оценка знаний и практических навыков разраб... Вывести информацию, только на первом уровне раздела каталога, в 1С-Би... Просмотров: 4216 Задача: на сайте, в каталоге, выводится два фильтра - боковой и верхний. Оба компонента по... Вывести список всех пользователей с необходимой информацией Просмотров: 24030 Если нужно, на какой-либо странице сайта, вывести всех пользователей из группы "Зарегистир... Создание раздела инфоблока при регистрации пользователя в Битрикс Просмотров: 7873 Например вам нужно выводить информацию исключительно для определенного пользователя. Само ... Следующая/предыдущая новость/статья при просмотре подробной в Битрикс Просмотров: 17521 Дизайн создается только для наглядного и удобного предоставления содержимого сайта, пользо... Смена вида карточек товаров в catalog.section с иммитацией AJAX Просмотров: 782 Смену вида карточек товаров, в разделе каталога, можно реализовать с помощью сессии, запис... Скопировать номер телефона из поля пользователя в телефон для регистр... Просмотров: 1593 Задача, на конкретном сайте: раньше все пользователи регистрировались по стандартному режи... Автоматически отгрузить заказ и сменить статус отгрузки, при выполнен... Просмотров: 321 Проблема: Заказы, на сайте, обрабатываются только в 1С. При этом 1С не работает с отгрузка... Создание скидки на общую сумму покупки в Битрикс корзине Просмотров: 26908 Функционал интернет-магазина, работающего под управлением 1С Битрикс, позволяет задавать м... Ленивая подгрузка картинок в компоненте, на vue js Битрикс Просмотров: 9424 Если на одну страницу сайта выводится большое количество картинок, которые могут долго под... Подключение SSL на Битрикс виртуальная машина Просмотров: 11893 С первого января 2017 года, наличие безопасного соединения HTTPS становится практически об... Добавление и удаление из сравнения на AJAX: Битрикс Просмотров: 17648 Рецепт лежал у меня в закромах, почти о нем и забыл, но тут подвернулся под руку- решил оп... Определить местоположение пользователя и показать на карте Просмотров: 3254 Задача определить местоположение текущего пользователя и показать его на карте, с меткой. ... Вывод даты создания элемента в правильном формате в Битрикс Просмотров: 21619 Если нужно вывести дату создания новости, статьи или товара в каталоге, в принципе любого ... Автоматически помечаем новинки лейблом в каталоге битрикс Просмотров: 5357 Если вы хотите помечать новинки каталога, вашего магазина на Битрикс, лейблом "Новинка". И...