Телеграм: @bazarow_ru mihail@bazarow.ru Проверяю почту и телеграм 2-3 раза в день.
С 1 по 10 января 2024 будет сделан редизайн сайта.
Пришла пора освежиться!

Вывести минимальную цену сфмого дешевого торгового предложения

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

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

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

$mxResult = CCatalogSKU::GetInfoByProductIBlock(
    $arParams['IBLOCK_ID']
);
if (is_array($mxResult)) {
    $rsOffers = CIBlockElement::GetList(
        array(
            "catalog_PRICE_1" => "ASC" // Сортируем по цене, ID нужной
        ),
        array(
            'IBLOCK_ID' => $mxResult['IBLOCK_ID'],
            'PROPERTY_' . $mxResult['SKU_PROPERTY_ID'] => $arElement["ID"]
        ),
        false,
        array(
            'nTopCount' => 1 // Получаем один элемент
        ),
        array(
            'ID'
        )
    );
    while ($arOffer = $rsOffers->Fetch()) {
        $ar_price = GetCatalogProductPrice($arOffer["ID"], 1);
        echo "

от " . $ar_price["PRICE"] . " руб.

"; break; } }
  • С помщью CCatalogSKU::GetInfoByProductIBlock получили информацию о инфоблоке торговых предложений, зная инфоблок торговго каталога (из параметра $arParams['IBLOCK_ID'])
  • Далее с помощью CIBlockElement::GetList получили список связанных с товаром торговых предложений: отсортировали его по возрвстанию цены и ограничились одним (самым дешевым)
  • Выевели цену этого, одного, торогового предложения.
  • Усложненный вариант вывода:

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

     <?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"])