- Модуль: main
- Путь к файлу: ~/bitrix/modules/main/lib/analytics/catalog.php
- Класс: BitrixMainAnalyticsCatalog
- Вызов: Catalog::getProductIdsByOfferIds
static function getProductIdsByOfferIds($offerIds)
{
if (empty($offerIds))
return array();
$bestList = array();
$iblockGroup = array();
$itemIterator = BitrixIblockElementTable::getList(array(
'select' => array('ID', 'IBLOCK_ID'),
'filter' => array('@ID' => $offerIds, '=ACTIVE'=> 'Y')
));
while ($item = $itemIterator->fetch())
{
if (!isset($iblockGroup[$item['IBLOCK_ID']]))
$iblockGroup[$item['IBLOCK_ID']] = array();
$iblockGroup[$item['IBLOCK_ID']][] = $item['ID'];
$bestList[$item['ID']] = array();
}
if (empty($iblockGroup))
{
return array();
}
$iblockSku = array();
$iblockOffers = array();
$iblockIterator = BitrixCatalogCatalogIblockTable::getList(array(
'select' => array('IBLOCK_ID', 'PRODUCT_IBLOCK_ID', 'SKU_PROPERTY_ID', 'VERSION' => 'IBLOCK.VERSION'),
'filter' => array('=IBLOCK_ID' => array_keys($iblockGroup), '!=PRODUCT_IBLOCK_ID' => 0)
));
while ($iblock = $iblockIterator->fetch())
{
$iblock['IBLOCK_ID'] = (int)$iblock['IBLOCK_ID'];
$iblock['PRODUCT_IBLOCK_ID'] = (int)$iblock['PRODUCT_IBLOCK_ID'];
$iblock['SKU_PROPERTY_ID'] = (int)$iblock['SKU_PROPERTY_ID'];
$iblock['VERSION'] = (int)$iblock['VERSION'];
$iblockSku[$iblock['IBLOCK_ID']] = $iblock;
$iblockOffers[$iblock['IBLOCK_ID']] = $iblockGroup[$iblock['IBLOCK_ID']];
}
unset($iblock, $iblockIterator);
if (empty($iblockOffers))
return array();
$offerLink = array();
foreach ($iblockOffers as $iblockId => $items)
{
$skuProperty = 'PROPERTY_'.$iblockSku[$iblockId]['SKU_PROPERTY_ID'];
$iblockFilter = array(
'IBLOCK_ID' => $iblockId,
'=ID' => $items
);
$iblockFields = array('ID', 'IBLOCK_ID', $skuProperty);
$skuProperty .= '_VALUE';
$offersIterator = CIBlockElement::getList(
array('ID' => 'ASC'),
$iblockFilter,
false,
false,
$iblockFields
);
while ($offer = $offersIterator->Fetch())
{
$productId = (int)$offer[$skuProperty];
if ($productId <= 0)
{
unset($bestList[$offer['ID']]);
}
else
{
$bestList[$offer['ID']]['PARENT_ID'] = $productId;
$bestList[$offer['ID']]['PARENT_IBLOCK'] = $iblockSku[$iblockId]['PRODUCT_IBLOCK_ID'];
if (!isset($offerLink[$productId]))
$offerLink[$productId] = array();
$offerLink[$productId][] = $offer['ID'];
}
}
}
if (!empty($offerLink))
{
$productIterator = BitrixIblockElementTable::getList(array(
'select' => array('ID'),
'filter' => array('@ID' => array_keys($offerLink), '=ACTIVE' => 'N')
));
while ($product = $productIterator->fetch())
{
if (empty($offerLink[$product['ID']]))
continue;
foreach ($offerLink[$product['ID']] as $value)
{
unset($bestList[$value]);
}
}
}
if (empty($bestList))
return array();
$finalIds = array();
$dublicate = array();
foreach ($bestList as $id => $info)
{
if (empty($info))
{
if (!isset($dublicate[$id]))
$finalIds[] = $id;
$dublicate[$id] = true;
}
else
{
if (!isset($dublicate[$id]))
$finalIds[] = $info['PARENT_ID'];
$dublicate[$info['PARENT_ID']] = true;
}
}
unset($id, $info, $dublicate);
return $finalIds;
}