2014-08-07

Разные кеши на одной странице в Битриксе

Бывают случаи, когда необходимо выводить разные данные в кешируемом компоненте на одной странице для разных пользователей. На самом деле, имею ввиду не пользователей разных групп, а просто тех, что совершили разные действия на сайте.
Отключение кеша Битрикса - в крайнем случае, надо учиться с ним правильно работать.
Также замечу, что решение подходит для тех случаев, когда функционала component_epilog.php недостаточно и добавлять параметры к адресу страницы тоже не вариант. Еще в решении этой задачи может помочь использование разных компонентов, которые выводить по условию на странице.
Рассмотрим еще одно интересное решение этой задачи. Выбор того или иного подхода нужно делать по ситуации, выбирая наиболее оптимальный в каждом конкретном случае.

Итак, вспоминаем из курсов: обычно, кеш зависит от адреса страницы, группы пользователей, параметров компонента и прочих условий, если они предусмотрены в компоненте.
Для примера, возьмем любой стандартный компонент, разместим его на странице и выведем какой-нибудь динамический контент в шаблоне. Зайдем незарегистрированными пользователями в разных браузерах и увидим на странице один и тот же закешированный (в прошлом динамический) контент.
Допустим, нам понадобилось, чтобы контент отличался в зависимости от того, какие действия совершил пользователь на сайте, к примеру, принял соглашение или пришел с определенной страницы и т.д. и т.п.
Помним, что адрес страницы у нас один и тот же, группа пользователей тоже одна, параметры компонента также фиксированы.
Хм, параметры...
А ведь, мы можем создавать свои собственные параметры для любого шаблона. Для этого в корневую папку шаблона необходимо поместить файл ".parameters.php" и прописать в нем что-нибудь подобное:

$arTemplateParameters = array(
 "SESSION" => Array(
  "NAME" => "session value",
  "TYPE" => "TEXT",
  "DEFAULT" => "mydefault",
 ),
 );
Затем, в нашем параметре в компоненте на странице пропишем переменную. К примеру, если хотим, чтобы кеш зависел от сессии, то укажем в значении параметра переменную $_SESSION с нужным ключем:
// в коде компонента на странице
"SESSION" => $_SESSION["session"],

После сохранения настроек, компонент начнет генерировать кеш, зависящий, кроме адреса страницы и группы пользователя, еще и от значения сессии.