Хорошая штука композитный кеш в битриксе, но порой необходимо чтоб на странице были разные данные для, например, пользователей из разных групп. В данном примере, кеш создается в зависимости от cookie
Код класса который необходимо подключить в init.php
namespace Project\BitrixExtends; class CacheProvider extends \Bitrix\Main\Data\StaticCacheProvider { /** * @return string */ public function getCachePrivateKey() { return self::getCachePrefix(); } /** * */ public function setUserPrivateKey() { \CHTMLPagesCache::setUserPrivateKey(self::getCachePrefix(), 0); } /** * @return bool */ public function isCacheable() { return true; } /** * */ public function onBeforeEndBufferContent() { } /** * @return string */ public static function getCachePrefix() { global $APPLICATION; return ($APPLICATION->get_cookie("DESIGN_30") == "Y") ? 'standart' : 'design30'; } /** * Установить Ключ КЕШа с учетом Куки дизайна. * * @return CacheProvider */ public static function setCustomUserPrivateKey() { \CHTMLPagesCache::setUserPrivateKey(self::getCachePrefix(), 0); return new self(); } }
Код для сохранения cookie
if ($_GET["new_header"] == "Y") { $_COOKIE["BITRIX_SM_DESIGN_30"] = "Y"; setcookie("BITRIX_SM_DESIGN_30", "Y", time() + (3600 * 24 * 30), "/"); }
Ну и вещаем на событие OnGetStaticCacheProvider
$eventManager = \Bitrix\Main\EventManager::getInstance(); $eventManager->addEventHandler("main", "OnGetStaticCacheProvider", array( "\\Project\\BitrixExtends\\CacheProvider", "setCustomUserPrivateKey" ));
Взято отсюда: https://dev.1c-bitrix.ru/community/webdev/user/127124/blog/38176/