Автокэширование в 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 с ключами, которые были указаны в функции $this->SetResultCacheKeys(Array()). Вызов ее происходит в компоненте.
Например,
// 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.list
global $APPLICATION;
// устанавливаем DESCRIPTION
if(isset($arResult["DESCRIPTION"])) {
$APPLICATION->SetDirProperty("keywords", $arResult["DESCRIPTION"]);
}
Для полного понимания технологии кэширования обязательны к прочтению следующие материалы:
— Компоненты 2.0::кэширование в компоненте и далее по разделу
— component_epilog и шаблон компонента
— Компоненты
Больше статей и материалов по web-разработке в tg-канале - подписывайтесь!
Подписаться в telegram