• Модуль: iblock
  • Путь к файлу: ~/bitrix/modules/iblock/classes/general/comp_pricetools.php
  • Класс: CIBlockPriceTools
  • Вызов: CIBlockPriceTools::SetCatalogDiscountCache
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;
}