Если у товара несколько торговых предложений и у каждого предложения разные цены, иногда требуется вывести минимальную цену торговых предложений, отсортировав ее из всех торговых предложений. Можно воспользоваться 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(" / ", $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?>
Получится примерно так. С помощью стилей можно будет сделать так, чтобы предложения показывались только при наведении.

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

Поддержать выпуски видео уроков, поблагодарить за полезную инструкцию или заметку можно через:
ЮманейПодскажите пожалуйста как вывести цену и название.
Использую ред. Старт.
Цена хранится в созданом мной поле 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;?> |

Цитата |
---|
Антон Сурнин написал: Добрый день! Подскажите пожалуйста как вывести цену и название. Использую ред. Старт. Цена хранится в созданом мной поле price. |
В старте нет модуля sale (магазина). Если цена просто в свойстве, выводите как простое свойство- типа строка
<? echo $arResult['DISPLAY_PROPERTIES']['КОД_СВОЙСТВА']['~VALUE'];?>
подскажите пожалуйста как Вывести минимальную цену(тип цены Опт id=3) торговых предложений.
спс)

Цитата |
---|
Артур пишет: $ar_price |
Код |
---|
echo '<pre>'; printr($ar_price); echo '</pre>'; |
И соответственно выводится не минимальная цена СКУ, а цена у которого ID наименьший среди других. На моем примере это видно (см.скрин). https://yadi.sk/i/w1yKStmgcMKAUQ
Так как сделать сортировку именно по цене?

Цитата |
---|
Вячеслав пишет: Михаил, насколько я понял ["SKU_PROPERTY_ID"] - это ID свойства привязки предложения к товару. И соответственно выводится не минимальная цена СКУ, а цена у которого ID наименьший среди других. На моем примере это видно (см.скрин). https://yadi.sk/i/w1yKStmgcMKAUQ Так как сделать сортировку именно по цене? |
"PRICE"=>"ASC"
В новой версии модуля 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 написал: Как исключить неактивные торг. предложения ? |
разобрался сам, добавил в фильтр 'ACTIVE' => 'Y'
Код |
---|
$mxResult['IBLOCK_ID'], 'ACTIVE' => 'Y', 'PROPERTY_'.$mxResult['SKU_PROPERTY_ID'] => $arItem["ID"]) |