• Модуль: main
  • Путь к файлу: ~/bitrix/modules/main/lib/analytics/catalog.php
  • Класс: BitrixMainAnalyticsCatalog
  • Вызов: Catalog::catchCatalogBasket
static function catchCatalogBasket(Event $event)
{
	$isNew = $event->getParameter("IS_NEW");

	// new items only
	if (!$isNew)
	{
		return;
	}

	// exclude empty cookie
	if (!static::getBxUserId())
	{
		return;
	}

	// alter b_sale_basket - add recommendation, update it here
	if (!static::isOn())
	{
		return;
	}

	/** @var BasketItem $basketItem */
	$basketItem = $event->getParameter("ENTITY");

	// get product id by offer id
	$iblockId = 0;
	$realProductId = $basketItem->getProductId();
	$isCatalog = $basketItem->getField('MODULE') == 'catalog';

	if ($isCatalog)
	{
		$productInfo = CCatalogSKU::GetProductInfo($realProductId);

		if (!empty($productInfo['ID']))
		{
			$realProductId = $productInfo['ID'];
			$iblockId = $productInfo['IBLOCK_ID'];
		}
		else
		{
			// get iblock id
			$element = BitrixIblockElementTable::getRow(array(
				'select' => array('IBLOCK_ID'),
				'filter' => array('=ID' => $realProductId)
			));

			if (!empty($element))
			{
				$iblockId = $element['IBLOCK_ID'];
			}
		}
	}

	// select site user id & recommendation id
	$siteUserId = 0;
	$recommendationId = '';

	// first, try to find in cookies
	$recommendationCookie = Context::getCurrent()->getRequest()->getCookie(static::getCookieLogName());

	if (!empty($recommendationCookie))
	{
		$recommendations = static::decodeProductLog($recommendationCookie);

		if (is_array($recommendations) && isset($recommendations[$realProductId]))
		{
			$recommendationId = $recommendations[$realProductId][0];
		}
	}

	if (empty($recommendationId) && $isCatalog)
	{
		// ok then, lets see in views history
		//if(COption::GetOptionString("sale", "encode_fuser_id", "N") == "Y")
		if (!is_numeric($basketItem->getFUserId()))
		{
			$filter = array('CODE' => $basketItem->getFUserId());
		}
		else
		{
			$filter = array('ID' => $basketItem->getFUserId());
		}

		$result = CSaleUser::getList($filter);

		if (!empty($result))
		{
			$siteUserId = $result['USER_ID'];

			// select recommendation id
			$fuser = $result['ID'];

			$viewResult = CatalogViewedProductTable::getList(array(
				'select' => array('RECOMMENDATION'),
				'filter' => array(
					'=FUSER_ID' => $fuser,
					'=PRODUCT_ID' => $basketItem->getProductId()
				),
				'order' => array('DATE_VISIT' => 'DESC')
			))->fetch();

			if (!empty($viewResult['RECOMMENDATION']))
			{
				$recommendationId = $viewResult['RECOMMENDATION'];
			}
		}
	}

	// prepare data
	$data = array(
		'product_id' => $realProductId,
		'iblock_id' => $iblockId,
		'user_id' => $siteUserId,
		'bx_user_id' => static::getBxUserId(),
		'domain' => Context::getCurrent()->getServer()->getHttpHost(),
		'recommendation' => $recommendationId,
		'date' => date(DATE_ISO8601)
	);

	// debug info
	global $USER;

	$data['real_user_id'] = $USER->getId() ?: 0;
	$data['is_admin'] = (int) $USER->IsAdmin();
	$data['admin_section'] = (int) (defined('ADMIN_SECTION') && ADMIN_SECTION);
	$data['admin_panel'] = (int) CTopPanel::shouldShowPanel();

	// try to guess unnatural baskets
	$data['artificial_basket'] = (int) (
		($data['user_id'] > 0 && $data['user_id'] != $data['real_user_id'])
		||  $data['is_admin'] || $data['admin_section'] || $data['admin_panel']
	);

	// save
	CounterDataTable::add(array(
		'TYPE' => 'basket',
		'DATA' => $data
	));

	// update basket with recommendation id
	if (!empty($recommendationId))
	{
		$conn = Application::getConnection();
		$helper = $conn->getSqlHelper();

		$conn->query(
			"UPDATE ".$helper->quote('b_sale_basket')
			." SET RECOMMENDATION='".$helper->forSql($recommendationId)."' WHERE ID=".(int) $basketItem->getId()
		);
	}
}