Автокэширование в 1с-Битрикс — хорошо развитая и довольно сложная система, позволяющая в разы уменьшить число обращений к базе данных и ускорить выполнение страниц. Понимать принципы и грамотно ее использовать должен любой успешный «битрикс-разработчик» для создания быстрых и качественных проектов. Сегодня поговорим о связи кэша и шаблона компонента.
Как работает компонент
Для начала небольшое описание составных частей среднестатистического компонента в 1с-Битрикс:
- component.php — файл с кодом, который формирует данные для шаблона ($arResult) и подключает его. Кроме того, может выполнять какие-либо действия после получения данных. Например, устанавливать заголовок страницы или добавлять пункты в навигационную цепочку.
- template.php — файл шаблона. В идеале не содерижит никакой логики, только вывод данных из $arResult. кэшируется html-вывод, т.е. PHP код из этого файла выполнится 1 раз, затем будет возвращаться html до следующего обновления кэша.
- result_modifier.php — файл, который подключается до template.php и может менять $arResult. кэшируется так же как и template.php
- component_epilog.php — файл, который подключается после template.php. Не кэшируется.
Последние 3 файла относятся к шаблону, предпочтительно редактировать именно их. Component.php в стандартных компонентах изменять нельзя, т.к. есть шанс что правки затрутся после обновления системы.
Общую схему работы компонента можно представить несколькими шагами:
- Проверка входных данных в component.php
- Проверка на наличие валидного (активного) кэша файлов result_modifier.php и template.php. Если кэш валидный, то вывод его, заполнение $arResult и переход к пункту 5.
- В случае невалидного кэша производятся необходимые действия для получения данных. По сути — заполняется массив $arResult
- Подключение файлов result_modifier.php и template.php, формирование + вывод html, а также «запоминание» этого вывода и части массива $arResult
- Подключение файла component_epilog.php
- Выполнение остального кода в component.php
Что нужно помнить
Содержимое массива $arResult на разных этапах различается. В result_modifier.php и template.php попадает массив, содержащий ВСЕ данные, которые получены на шаге 3. В файле component_epilog.php и коде компонента, который выполняется после него, доступны данные массива $arResult с ключами, которые были указаны в функции
Например,
// component_epilog шаблона компонента news.list// задача - вывести заголовок страницы вида "[Название инфоблока] (кол-во элементов)"global $APPLICATION;// кусок кода из component.php, так устанавливаются ключи, которые попадут в кэш$this->SetResultCacheKeys(array("ID","IBLOCK_TYPE_ID","LIST_PAGE_URL","NAV_CACHED_DATA","NAME","SECTION","ELEMENTS",));// этот код не сработает, т.к. в массиве $arResult не определен элемент с ключем "ITEMS"if(isset($arResult["NAME"]) && isset($arResult["ITEMS"])) {$title = $arResult["NAME"]." (".count($arResult["ITEMS"]).")";$APPLICATION->SetTitle($title);}// правильный вариант, все нужные элемента массива присутствуют в кэшеif(isset($arResult["NAME"]) && isset($arResult["ELEMENTS"])) {$title = $arResult["NAME"]." (".count($arResult["ELEMENTS"]).")";$APPLICATION->SetTitle($title);}Данные, которые доступны в component_epilog.php и далее (т.е. указаны в SetResultCacheKeys) можно изменять в result_modifier.php и template.php. Будет закэшировано их новое значение.
Например,
// result_modifier шаблона компонента news.list// задача - вывести заголовок страницы вида "[Название инфоблока] (кол-во элементов)"// доступен весь массив $arResult и мы можем переопределить элементы, которые попадут в кэш$arResult["NAME"] .= " (".count($arResult["ELEMENTS"]).")";// теперь при отмеченной опции "Устанавливать заголовок страницы" компонент использует измененный $arResult["NAME"] и мы получим нужный заголовокВ result_modifier.php можно добавлять данные в кэш.
Например,
// result_modifier шаблона компонента news.list// задача - "SEOшник со стажем" сказал сделать description вида "[Название элементов через запятую] скачать бесплатно без регистрации без смс"$arNames = Array(); // сюда собираем названия элементовforeach($arResult["ITEMS"] as $arItem)$arNames[] = $arItem["NAME"];$arResult["DESCRIPTION"] = implode(", ", $arNames)." скачать бесплатно без регистрации без смс";$cp = $this->__component; // объект компонентаif (is_object($cp))$cp->SetResultCacheKeys(array('DESCRIPTION')); // запомнить $arResult["DESCRIPTION"] в кэш// component_epilog шаблона компонента news.listglobal $APPLICATION;// устанавливаем DESCRIPTIONif(isset($arResult["DESCRIPTION"])) {$APPLICATION->SetDirProperty("keywords", $arResult["DESCRIPTION"]);}
Для полного понимания технологии кэширования обязательны к прочтению следующие материалы:
- Компоненты 2.0::кэширование в компоненте и далее по разделу
- component_epilog и шаблон компонента
- Компоненты
