• Модуль: 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;
}