static function SetCatalogDiscountCache($arCatalogGroups, $arUserGroups, $siteId = false)
{
$result = false;
if (!is_array($arUserGroups))
return $result;
MainTypeCollection::normalizeArrayValuesByInt($arUserGroups, true);
if (empty($arUserGroups))
return $result;
if ($siteId === false)
$siteId = SITE_ID;
if(BitrixMainConfigOption::get('sale', 'use_sale_discount_only') === 'Y')
{
self::$needDiscountCache = false;
if (self::$saleIncluded === null)
self::$saleIncluded = Loader::includeModule('sale');
if (self::$saleIncluded)
{
$cache = SaleDiscountRuntimeCacheDiscountCache::getInstance();
$ids = $cache->getDiscountIds($arUserGroups);
if (!empty($ids))
{
$discountList = $cache->getDiscounts(
$ids,
['all', 'catalog'],
$siteId,
[]
);
if (!empty($discountList))
{
$result = true;
}
}
}
return $result;
}
if (self::$catalogIncluded === null)
self::$catalogIncluded = Loader::includeModule('catalog');
if (self::$catalogIncluded)
{
if (!is_array($arCatalogGroups))
return $result;
MainTypeCollection::normalizeArrayValuesByInt($arUserGroups, true);
if (empty($arUserGroups))
return $result;
$arRestFilter = array(
'PRICE_TYPES' => $arCatalogGroups,
'USER_GROUPS' => $arUserGroups,
);
$arRest = CCatalogDiscount::GetRestrictions($arRestFilter, false, false);
$arDiscountFilter = array();
$arDiscountResult = array();
if (empty($arRest) || (array_key_exists('DISCOUNTS', $arRest) && empty($arRest['DISCOUNTS'])))
{
foreach ($arCatalogGroups as $intOneGroupID)
{
$strCacheKey = CCatalogDiscount::GetDiscountFilterCacheKey(array($intOneGroupID), $arUserGroups, false);
$arDiscountFilter[$strCacheKey] = array();
}
unset($intOneGroupID);
}
else
{
$arResultDiscountList = array();
$select = array(
'ID', 'TYPE', 'SITE_ID', 'ACTIVE', 'ACTIVE_FROM', 'ACTIVE_TO',
'RENEWAL', 'NAME', 'SORT', 'MAX_DISCOUNT', 'VALUE_TYPE', 'VALUE', 'CURRENCY',
'PRIORITY', 'LAST_DISCOUNT',
'USE_COUPONS', 'UNPACK', 'CONDITIONS'
);
$currentDatetime = new MainTypeDateTime();
$discountRows = array_chunk($arRest['DISCOUNTS'], 500);
foreach ($discountRows as $pageIds)
{
$discountFilter = array(
'@ID' => $pageIds,
'=SITE_ID' => $siteId,
'=TYPE' => CatalogDiscountTable::TYPE_DISCOUNT,
array(
'LOGIC' => 'OR',
'ACTIVE_FROM' => '',
'<=ACTIVE_FROM' => $currentDatetime
),
array(
'LOGIC' => 'OR',
'ACTIVE_TO' => '',
'>=ACTIVE_TO' => $currentDatetime
),
'=USE_COUPONS' => 'N',
'=RENEWAL' => 'N',
);
CTimeZone::Disable();
$iterator = CatalogDiscountTable::getList(array(
'select' => $select,
'filter' => $discountFilter
));
while ($row = $iterator->fetch())
{
$row['ID'] = (int)$row['ID'];
$row['HANDLERS'] = array();
$row['MODULE_ID'] = 'catalog';
$row['TYPE'] = (int)$row['TYPE'];
if ($row['ACTIVE_FROM'] instanceof MainTypeDateTime)
$row['ACTIVE_FROM'] = $row['ACTIVE_FROM']->toString();
if ($row['ACTIVE_TO'] instanceof MainTypeDateTime)
$row['ACTIVE_TO'] = $row['ACTIVE_TO']->toString();
$row['COUPON_ACTIVE'] = '';
$row['COUPON'] = '';
$row['COUPON_ONE_TIME'] = null;
$arResultDiscountList[$row['ID']] = $row;
}
unset($row, $iterator);
CTimeZone::Enable();
}
unset($pageIds, $discountRows);
foreach ($arCatalogGroups as $intOneGroupID)
{
$strCacheKey = CCatalogDiscount::GetDiscountFilterCacheKey(array($intOneGroupID), $arUserGroups, false);
$arDiscountDetailList = array();
$arDiscountList = array();
foreach ($arRest['RESTRICTIONS'] as $intDiscountID => $arDiscountRest)
{
if (empty($arDiscountRest['PRICE_TYPE']) || array_key_exists($intOneGroupID, $arDiscountRest['PRICE_TYPE']))
{
$arDiscountList[] = $intDiscountID;
if (isset($arResultDiscountList[$intDiscountID]))
$arDiscountDetailList[] = $arResultDiscountList[$intDiscountID];
}
}
sort($arDiscountList);
$arDiscountFilter[$strCacheKey] = $arDiscountList;
$strResultCacheKey = CCatalogDiscount::GetDiscountResultCacheKey($arDiscountList, $siteId, 'N');
$arDiscountResult[$strResultCacheKey] = $arDiscountDetailList;
}
unset($intOneGroupID);
}
$boolFlag = CCatalogDiscount::SetAllDiscountFilterCache($arDiscountFilter, false);
$boolFlagExt = CCatalogDiscount::SetAllDiscountResultCache($arDiscountResult);
$result = $boolFlag && $boolFlagExt;
self::$needDiscountCache = $result;
}
return $result;
}