Пока Битрикс не выпустил обновление, решающее эту задачу, опишу костыль для решения на коленке.
Проблема: товары родители в торговом каталоге c SKU не имеют цены и потому не попадают в выгрузку.
Решение: получить цену (в данном случае - минимальную) для торгового предложения (которое есть в наличии) данного товара
Примечание: данное решение подходит для случая, когда все торговые предложения данного товара выводятся на одной странице - мы берем только одно предложение, чтобы не дублировать URL. Для случая, когда предложения на разных страницах - надо генерировать отдельные offers со своими уникальными URL [spoiler]
По шагам:
1. копируем yandex_run.php и yandex_setup.php в yandex_sku_run.php и yandex_sku_setup.php в папках /bitrix/php_interface/include/catalog_export/ и /bitrix/modules/catalog/load/
В списке профилей экспорта интернет-магазина появится yandex_sku.
2. в /bitrix/modules/catalog/load/yandex_sku_run.php находим строку 409 и комментируем этот код -
- у товаров родителей нет цены
3. после закомментированного кода вставляем этот код:
где (подставьте свои значения):
Что делает этот код? Он вытаскивает из инфоблока торговых предложений предложения, привязанные к данному элементу. Причем, предложение будет с минимальной ценой и количеством на складе больше нуля.
PS код отлично работает на отдельной тестовой странице, а внутри yandex_sku_run.php - не хочет, зараза.. Кто знает, в чем дело?
PPS Евгений Жуков подсказал, что лучше использовать CIBlockElement::GetList() - не нужно указывать ID инфоблока. Вот альтернативный код:
он работает
Проблема: товары родители в торговом каталоге c SKU не имеют цены и потому не попадают в выгрузку.
Решение: получить цену (в данном случае - минимальную) для торгового предложения (которое есть в наличии) данного товара
Примечание: данное решение подходит для случая, когда все торговые предложения данного товара выводятся на одной странице - мы берем только одно предложение, чтобы не дублировать URL. Для случая, когда предложения на разных страницах - надо генерировать отдельные offers со своими уникальными URL [spoiler]
По шагам:
1. копируем yandex_run.php и yandex_setup.php в yandex_sku_run.php и yandex_sku_setup.php в папках /bitrix/php_interface/include/catalog_export/ и /bitrix/modules/catalog/load/
В списке профилей экспорта интернет-магазина появится yandex_sku.
2. в /bitrix/modules/catalog/load/yandex_sku_run.php находим строку 409 и комментируем этот код -
if ($XML_DATA['PRICE'] > 0)
{
$minPrice = $arAcc["CATALOG_PRICE_".$XML_DATA['PRICE']];
$minPriceGroup = $XML_DATA['PRICE'];
$minPriceCurrency = $arAcc["CATALOG_CURRENCY_".$XML_DATA['PRICE']];
$minPriceRUR = CCurrencyRates::ConvertCurrency($arAcc["CATALOG_PRICE_".$XML_DATA['PRICE']], $arAcc["CATALOG_CURRENCY_".$XML_DATA['PRICE']], $RUR);
}
else
{
if ($arPrice = CCatalogProduct::GetOptimalPrice(
$arAcc['ID'],
1,
array(2), // anonymous
'N',
array(),
$ar_iblock['LID']
))
{
$minPrice = $arPrice['DISCOUNT_PRICE'];
$minPriceCurrency = $BASE_CURRENCY;
$minPriceRUR = CCurrencyRates::ConvertCurrency($minPrice, $BASE_CURRENCY, $RUR);
$minPriceGroup = $arPrice['PRICE']['CATALOG_GROUP_ID'];
} |
3. после закомментированного кода вставляем этот код:
$SKU_IBLOCK_ID = 19;
$sku_items = GetIBlockElementListEx("1c_catalog",
$SKU_IBLOCK_ID,
array(),
array('CATALOG_PRICE_4' => 'ASC', '>CATALOG_QUANTITY' => 0),
1,
array("=PROPERTY_CML2_LINK_VALUE" => $arAcc["ID"]),
array("ID","CATALOG_GROUP_4_VALUE")
X );
while($arItem = $sku_items->GetNext())
{
$minPrice = $arItem['CATALOG_PRICE_4'] ;
}
|
$SKU_IBLOCK_ID - ИД инфоблока торгового предложения 1c_catalog - код типа инфоблока CATALOG_PRICE_4 - цена с ИД 4 |
PS код отлично работает на отдельной тестовой странице, а внутри yandex_sku_run.php - не хочет, зараза.. Кто знает, в чем дело?
PPS Евгений Жуков подсказал, что лучше использовать CIBlockElement::GetList() - не нужно указывать ID инфоблока. Вот альтернативный код:
$sku_items = CIBlockElement::GetList( array('CATALOG_PRICE_4' => 'ASC'),
X array("=PROPERTY_CML2_LINK" => $arAcc["ID"]),
false,
false,
array("ID", "CATALOG_GROUP_4")
);
$i=0;
while($arItem = $sku_items->GetNext())
{
if($i == 0) $minPrice = (integer)$arItem['CATALOG_PRICE_4'] ;
$i++;
}
|