- Модуль: catalog
- Путь к файлу: ~/bitrix/modules/catalog/lib/product/catalogprovider.php
- Класс: BitrixCatalogProductCatalogProvider
- Вызов: CatalogProvider::fillOfferXmlId
static function fillOfferXmlId(array $products, array $catalogProductDataList): array
{
$offerList = [];
foreach ($catalogProductDataList as $entityData)
{
if ($entityData['TYPE'] != CatalogProductTable::TYPE_OFFER)
{
continue;
}
if (strpos($products[$entityData['ID']]['PRODUCT_DATA']['~XML_ID'], '#') !== false)
{
continue;
}
$offerList[] = $entityData['ID'];
}
unset($entityData);
if (!empty($offerList))
{
$parentMap = [];
$parentIdList = [];
$parentList = CCatalogSku::getProductList($offerList, 0);
foreach ($parentList as $offerId => $offerData)
{
$parentId = (int)$offerData['ID'];
if (!isset($parentMap[$parentId]))
{
$parentMap[$parentId] = [];
}
$parentMap[$parentId][] = $offerId;
$parentIdList[$parentId] = $parentId;
}
unset($offerId, $offerData, $parentList);
if (!empty($parentMap))
{
sort($parentIdList);
foreach (array_chunk($parentIdList, 500) as $pageIds)
{
$iterator = IblockElementTable::getList([
'select' => [
'ID',
'XML_ID',
],
'filter' => ['@ID' => $pageIds],
]);
while ($row = $iterator->fetch())
{
$parentId = (int)$row['ID'];
if (empty($parentMap[$parentId]))
{
continue;
}
foreach ($parentMap[$parentId] as $index)
{
$products[$index]['PRODUCT_DATA']['~XML_ID'] = $row['XML_ID'] . '#'
. $products[$index]['PRODUCT_DATA']['~XML_ID']
;
}
}
unset($parentId, $index);
unset($row, $iterator);
}
unset($pageIds);
}
unset($parentIdList, $parentMap);
}
unset($offerList);
return $products;
}