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