Автокэширование в 1с-Битрикс — сложно о простом
Автокэширование в 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.php и далее (т.е. указаны в SetResultCacheKeys) можно изменять в result_modifier.php и template.php. Будет закэшировано их новое значение.
В result_modifier.php можно добавлять данные в кэш.
Для полного понимания технологии кэширования обязательны к прочтению следующие материалы:
— Компоненты 2.0::кэширование в компоненте и далее по разделу
— component_epilog и шаблон компонента
— Компоненты
Result modifier php битрикс где находится
Цитатник веб-разработчиков В тексте курса вы встретите цитаты, высказанные в разное время разработчиками системы и разработчиками проектов на базе Bitrix Framework. Надеемся, что такие неформальные замечания внесут некоторое разнообразие в процесс изучения. Заодно опытные специалисты поделятся и своим опытом.
Имена авторов цитат даются в том написании, в каком авторы зарегистрировали себя на сайте "1С-Битрикс". .
Евгений Смолин: Сам кувыркался с непонятками (пока курсы учебные не прочитал и руками не попробовал то, что там написано). Битрикс из тех систем, где изучение "методом тыка" не очень эффективно без предварительного изучения учебных курсов. Уважаемые новички, потратьте немного своего драгоценного времени, пройдите пару-тройку учебных курсов и масса вопросов просто испарится — там есть ответы на множество вопросов.
Курс для разработчиков — продолжение линейки учебных курсов по Bitrix Framework. Получение сертификата по курсу рекомендуется после успешной сдачи тестов по всей линейке курсов, так как без понятия о работе Контент-менеджера и Администратора создание успешных сайтов будет затруднено.
Чтобы научиться программировать в Bitrix Framework, нет необходимости изучать всю линейку курсов. Но есть моменты, которые необходимо знать разработчикам о системе, они раскрыты в начальных курсах:
- Интерфейс программы — в главе Элементы управления курса Контент-менеджер.
- Компоненты 2.0 (начальные сведения) в главе Компоненты 2.0 (начальные сведения) курса Контент-менеджер.
- Информационные блоки — в главе Информационные блоки (начальные сведения) курса Контент-менеджер.
- Управление доступом к файлам, элементам контента, модулям и другие права доступа в главе Управление доступом курса Администратор. Базовый.
- Работа с инструментами системы — в главе Работа с инструментами курса Администратор. Базовый.
- Модуль Поиск — в главе Поиск курса Администратор. Базовый.
- Вся информация по администрированию модулей размещена в курсах:
-
— модули "1С-Битрикс: Управление сайтом" — модули "1С-Битрикс: Управление сайтом", связанные с коммерческой деятельностью в Интернете. — модули "1С-Битрикс: Корпоративный портал".
Как построен курс
Общепринятая градация квалификации разработчиков в рамках курса обозначает что:
- Junior сможет создавать простые сайты работая со штатными компонентами и модифицируя их шаблоны.
- Middle разработчик может работать с API Bitrix Framework.
- Senior умеет работать над производительностью и безопасностью сайтов, создавать свои модули и компоненты.
Примечание: Такое построение удобно для пошагового изучения принципов работы Bitrix Framework. По этому же принципу построены и тесты. Но такая структура не очень удобна для использования содержания курса как постоянного источника информации. Что бы переключить курс в режим Справочника, воспользуйтесь переключателем в правом углу
«шапки» курса.
Начальные требования к подготовке
Для успешного изучения курса и овладения мастерством разработки сайтов на Bitrix Framework необходимо владеть (хотя бы на начальном уровне):
- основами PHP, баз данных;
- основами HTML, CSS.
У нас часто спрашивают, сколько нужно заплатить
Курс полностью бесплатен. Изучение курса, прохождение итоговых тестов и получение сертификатов — ничего из этого оплачивать не нужно.
Ещё у нас есть Академия 1С-Битрикс, где можно обучиться на платной основе на курсах нашей компании либо наших партнёров.
Баллы опыта
В конце каждого урока есть кнопка Прочитано! . При клике на неё в вашу итоговую таблицу опыта добавляется то количество баллов, которое указано в прочитанном После нажатия кнопки Прочитано! появится
окно подтверждения:
уроке.
Периодически мы заново оцениваем сложность уроков, увеличивая/уменьшая число баллов, добавляем новые уроки. Поэтому итоговое количество баллов курса и количество набранных вами баллов могут различаться между собой. Набранные вами баллы, в отличие от суммы баллов курса, не пересчитываются. Не переживайте!
Отличный результат — это если общее число набранных вами баллов отличается от максимального на несколько процентов.
Тесты
После изучения курса вам будет предложено пройти тесты на сертификацию. При успешной сдаче последовательности тестов на странице Моё обучение можно просмотреть результат обучения и загрузить сертификат в формате PDF.
Также Вы можете поделиться ссылкой на страницу со своими сертификатами. Для этого на странице Моё обучение отметьте опцию Разрешить публичный доступ к резюме студента
и скопируйте ссылку на страницу резюме
. Страница с Вашим резюме будет доступна всем, кому Вы отправите ссылку на неё.
Комментарии к статьям
На каждой странице курса авторизованный на сайте посетитель может дать комментарий к содержимому страницы. Комментарий — не форум, там не ведётся обсуждений или разъяснений. Это инструмент для сообщений нам об ошибках, неточностях. Для отправки комментария воспользуйтесь расположенной в правом нижнем углу окна браузера кнопкой: 
Что дальше?
Одновременно с изучением курса Разработчик Bitrix Framework вам придётся обращаться к информации о других технологиях Bitrix Framework. Эта информация размещена в следующих курсах:
Для преподавания офлайн
Если данный курс берётся в качестве основы для офлайнового преподавания, то рекомендуемая продолжительность: 6 дней (48 академических часов).
Если нет интернета
Скачать материалы курса в формате EPUB. Файлы формата EPUB Чем открыть файл на
Android:
EPUB Reader
CoolReader
FBReader
Moon+ Reader
eBoox
iPhone:
FBReader
CoolReader
iBook
Bookmate
Windows:
Calibre
FBReader
Icecream Ebook Reader
Плагины для браузеров:
EpuBReader – для Firefox
Readium – для Google Chrome
iOS
Marvin for iOS
ShortBook
Linux:
Calibre
FBReader
Cool Reader
Okular обновляются периодически, поэтому возможно некоторое отставание их от онлайновой версии курса. Версия файла — от 06.03.2023.
Переменные, доступные в компоненте 2.0
В файлах компонентов доступны стандартные компоненты, благодаря которым можно строить, к примеру, относительные пути. Такие компоненты избавляют от необходимости прописания абсолютных величин в файлах компонента.
В файлах компонентов доступны стандартные компоненты, благодаря которым можно строить, к примеру, относительные пути. Такие компоненты избавляют от необходимости прописания абсолютных величин в файлах компонента.
В файле component.php доступны (в файле самого компонента):
очевидные и постоянно используемые:
- $arParams — параметры, чтение/изменение, затрагивает одноименный член класса компонента
- $arResult — результат, чтение/изменение, затрагивает одноименный член класса компонента
- $APPLICATION, $USER, $DB — все доступны, можно не объявлять их как global в файле component.php
- $this — естественно ссылка на текущий вызванный компонент (объект класса CBitrixComponent), можно использовать все методы класса CBitrixComponent
дополнительные, локальные для удобства:
- $componentPath — путь к вызванному компоненту от DOCUMENT_ROOT (пример: /bitrix/components/bitrix/iblock.list)
- $componentName — имя вызванного компонента (например: bitrix:iblock.list)
- $componentTemplate — шаблон вызванного компонента (например: «my_template»)
аналогичные значения, если компонент вызван в составе другого компонента, идут отсылки на родительский компонент:
- $parentComponentPath
- $parentComponentName
- $parentComponentTemplate
В файле result_modifier.php доступны (в файле модификации шаблона компонента):
- $arParams — параметры, чтение, изменение не затрагивает одноименный член компонента, но изменения тут отразятся на $arParams в файле template.php
- $arResult — результат, чтение/изменение, затрагивает одноименный член класса компонента
- $APPLICATION, $USER, $DB — как обычно, объявлять их как global избыточно $this — ссылка на текущий шаблон (объект, описывающий шаблон, тип CBitrixComponentTemplate)
В файле template.php доступны:
- $arParams — параметры, чтение, изменение не затрагивает одноименный член компонента
- $arResult — результат, чтение/изменение, затрагивает одноименный член класса компонента (ссылка на поле компонента)
- $APPLICATION, $USER, $DB — как обычно, объявлять их как global избыточно
- $this — ссылка на текущий шаблон (объект, описывающий шаблон, тип CBitrixComponentTemplate)
- $templateName — имя шаблона компонента (например: «.dеfault»)
- $templateFile — путь к файлу шаблона от DOCUMENT_ROOT (напр. «/bitrix/components/wexpert/iblock.list/templates/.default/template.php»)
- $templateFolder — путь к папке с шаблоном от DOCUMENT_ROOT (напр. «/bitrix/components/bitrix/iblock.list/templates/.default»)
- $componentPath — путь к папке с компонентом от DOCUMENT_ROOT (напр. «/bitrix/components/bitrix/iblock.list»)
- $component — ссылка на текущий вызванный компонент (тип CBitrixComponent)
- $templateData — массив для записи, обратите внимание, таким образом можно передать данные из template.php в файл component_epilog.php, причем эти данные попадают в кеш, т.к. файл component_epilog.php исполняется на каждом хите.
В файле component_epilog.php (эпилог компонента) доступны:
- $arParams — параметры, чтение, изменение не затрагивает одноименный член компонента
- $arResult — результат, чтение/изменение не затрагивает одноименный член класса компонента
- $APPLICATION, $USER, $DB — аналогично, эта «троица» доступна
- $componentPath — путь к папке с компонентом от DOCUMENT_ROOT (напр. «/bitrix/components/bitrix/iblock.list»)
- $component — ссылка на $this, читай на строку ниже
- $this — естественно ссылка на текущий вызванный компонент (объект класса CBitrixComponent), можно использовать все методы класса CBitrixComponent
дополнительные, не явные в component_epilog.php:
- $epilogFile — путь к файлу component_epilog.php относительно DOCUMENT_ROOT
- $templateName — имя шаблона компонента (например: «.dеfault»)
- $templateFile — путь к файлу шаблона от DOCUMENT_ROOT (напр. «/bitrix/components/bitrix/iblock.list/templates/.default/template.php»)
- $templateFolder — путь к папке с шаблоном от DOCUMENT_ROOT (напр. «/bitrix/components/bitrix/iblock.list/templates/.default»)
- $templateData — обратите внимание, таким образом можно передать данные из template.php в файл component_epilog.php, причем эти данные закешируются и будут доступны в component_epilog.php на каждом хите!
и в конце, небольшой пример: чтобы получить в result_modifier.php значение $templateFolder, необходимо воспользоваться методами текущего шаблона:
Чтобы передать данные из вложенного в комплексный компонента, можно в компоненте-потомке обратиться к результирующему массиву родительского компонента:
Т.к. переменная $this в component_epilog.php обращается к классу CBitrixComponent, то для того чтобы использовать функционал шаблона в component_epilog.php, необходимо обратиться к шаблону компонента из самого компонента:
Подключать данный так скрипты не целесообразно- лучше делать подключение из result_modifier.php, чтобы скрипты попадали в кешируемую область.
Как передать в script.js шаблона компонена путь к папке, шаблона:
В файле шаблона, template.php, прописываем:
И в файле script.js можем этот путь получить:
В курсе веб-разработчика 1С-Битрикс появилась таблица с доступностью переменных .
Урок 7. Параметры компонента битрикс и result_modifier.php
Приветствую. В предыдущем уроке мы вывели товары на страницу каталога. Собственно почти готов интернет-магазин, по крайней мере витрина. Но если вы посмотрите, то каталог выводится не очень хорошо, из за того, что разный размер изображений и разная длинна наименования (в одну и две строки) карточки товаров «скачут».

- Разная высота и ширина карточек
- Наименование выводится в две строки и сдвигает в низ цену и кнопку Купить.
Изменение результата работы компонента через result_modifier.php
Первая проблема это то, что изображения предварительного просмотра добавлены в инфоблок разных размеров. Ситуация распространенная, т.к. подгонять все изображение под один размер до миллиметра это не реально. Хотя конечно изображения должны быть примерно одинаковых размеров.
Что нам нужно сделать? Просто версткой, указанием размеров блока изображения проблему не решить, т.к. картинки растянутся не пропорционально. Нужно делать полноценный resize с сохранением пропорций. И в этой задаче нам тоже поможет богатое API Битрикса, в нем есть все функции для этого, а точнее нам понадобится всего одна CFile::ResizeImageGet.
Чтобы изменить размер изображений в инфоблоке Битрикс нужно выполнить следующий код.
Мы снова в цикле обходим элементы массива $arResult и функцией CFile::ResizeImageGet() изменяем размер изображения.
Подробнее о функции можно посмотреть в документации Битрикс. После преобразования мы устанавливаем параметры ширины и высоты изображения 200 пикселов. Но главное мы в качестве источника изображения указываем наш преобразованный файл.
$arResult[«ITEMS»][$cell][«PREVIEW_PICTURE»][‘SRC’] = $file[‘src’];
Данный код можно разместить и в самом шаблоне компонента news.list или в специальном файле result_modifier.php , который должен находится в то же папке где и файл шаблона компонента. На нем я остановлюсь поподробней, т.к. это интересная технология модификации результата работы компонента без изменения кода компонента или шаблона.

Файл result_modifier.php — инструмент для модификации данных работы компонента произвольным образом. Создается разработчиком самостоятельно.

<?foreach($arResult[«ITEMS»] as $item):?>
<?
$file = CFile::ResizeImageGet($item[«PREVIEW_PICTURE»][«ID»],array(‘width’ => 200,’height’ => 200), BX_RESIZE_IMAGE_EXACT, true);
$item[«PREVIEW_PICTURE»][‘WIDTH’] = $file[‘width’];
$item[«PREVIEW_PICTURE»][‘HEIGHT’] = $file[‘height’];
$item[«PREVIEW_PICTURE»][‘SRC’] = $file[‘src’];
?>
Результат работы будет одинаковый. Расположить код внутри шаблона в данном примере более оптимально т.к. нет ненужного цикла по всему массиву $arResult.
Посмотрим результат — уже намного лучше, все карточки одного размера. То, что лица срезались, это изначально картинки выбраны не подходящих пропорций и лучше их автоматически обрезать невозможно.
А чтобы лучше понять, что произошло и как битрикс работает с изображениями предлагаю добавить вывод отладочной информации, в код вывода карточек добавить одну строку (выделил красным).
Код:
Результат будет следующий.

Обратите внимание Битрикс создает отдельную папку resize_cache в которой сохраняет преобразованные файлы.
И остатется вторая проблема — это когда наименование в две строчки у нас сдвигается цена и кнопка купить ниже. Данную проблему мы решим версткой. Зададим фиксированный размер блока вывода наименования таким, чтобы влезало две строки текста.
Код:
.bord h5 <
display: block;
height: 60px;
>
Параметры компонентов Битрикс
<?
if (!defined(«B_PROLOG_INCLUDED») || B_PROLOG_INCLUDED!==true) die();
$arTemplateParameters = array(
«CELL-LARGE» => Array(
«NAME» => «Количество столбцов для большого экрана»,
«TYPE» => «STRING»,
‘DEFAULT’ => «5»,
),
«CELL-MEDIUM» => Array(
«NAME» => «Количество столбцов для среднего экрана»,
«TYPE» => «STRING»,
‘DEFAULT’ => «3»,
),
«CELL-SMALL» => Array(
«NAME» => «Количество столбцов для маленького экрана»,
«TYPE» => «STRING»,
‘DEFAULT’ => «2»,
),
);
?>

Т.к. шаблон адаптивный мы внесли параметры для трех размеров экранов. Т.е. у нас будет возможность на каждом размере экрана задать какое количество столбцов нужно выводить.
Теперь посмотрим, как это реализовать в шаблоне?
<?
$largeup = ‘large-up-‘.$arParams[‘CELL-LARGE’];
$mediumup = ‘medium-up-‘.$arParams[‘CELL-MEDIUM’];
$smallup = ‘small-up-‘.$arParams[‘CELL-SMALL’];
$div_class = $smallup.’ ‘.$mediumup.’ ‘.$largeup;
Передача параметров между компонентами Битрикс
$APPLICATION->IncludeComponent(
«bitrix:news.list»,
«»,
Array(
«IBLOCK_TYPE» => $arParams[«IBLOCK_TYPE»],
«IBLOCK_ID» => $arParams[«IBLOCK_ID»],
«NEWS_COUNT» => $arParams[«NEWS_COUNT»],
«SORT_BY1» => $arParams[«SORT_BY1»],
«SORT_ORDER1» => $arParams[«SORT_ORDER1»],
«SORT_BY2» => $arParams[«SORT_BY2»],
«SORT_ORDER2» => $arParams[«SORT_ORDER2»],
«FIELD_CODE» => $arParams[«LIST_FIELD_CODE»],
«PROPERTY_CODE» => $arParams[«LIST_PROPERTY_CODE»],
«DETAIL_URL» => $arResult[«FOLDER»].$arResult[«URL_TEMPLATES»][«detail»],
«SECTION_URL» => $arResult[«FOLDER»].$arResult[«URL_TEMPLATES»][«section»],
«IBLOCK_URL» => $arResult[«FOLDER»].$arResult[«URL_TEMPLATES»][«news»],
«DISPLAY_PANEL» => $arParams[«DISPLAY_PANEL»],
«SET_TITLE» => $arParams[«SET_TITLE»],
«SET_LAST_MODIFIED» => $arParams[«SET_LAST_MODIFIED»],
«MESSAGE_404» => $arParams[«MESSAGE_404»],
«SET_STATUS_404» => $arParams[«SET_STATUS_404»],
«SHOW_404» => $arParams[«SHOW_404»],
«FILE_404» => $arParams[«FILE_404»],
«INCLUDE_IBLOCK_INTO_CHAIN» => $arParams[«INCLUDE_IBLOCK_INTO_CHAIN»],
«CACHE_TYPE» => $arParams[«CACHE_TYPE»],
«CACHE_TIME» => $arParams[«CACHE_TIME»],
«CACHE_FILTER» => $arParams[«CACHE_FILTER»],
«CACHE_GROUPS» => $arParams[«CACHE_GROUPS»],
«DISPLAY_TOP_PAGER» => $arParams[«DISPLAY_TOP_PAGER»],
«DISPLAY_BOTTOM_PAGER» => $arParams[«DISPLAY_BOTTOM_PAGER»],
«PAGER_TITLE» => $arParams[«PAGER_TITLE»],
«PAGER_TEMPLATE» => $arParams[«PAGER_TEMPLATE»],
«PAGER_SHOW_ALWAYS» => $arParams[«PAGER_SHOW_ALWAYS»],
«PAGER_DESC_NUMBERING» => $arParams[«PAGER_DESC_NUMBERING»],
«PAGER_DESC_NUMBERING_CACHE_TIME» => $arParams[«PAGER_DESC_NUMBERING_CACHE_TIME»],
«PAGER_SHOW_ALL» => $arParams[«PAGER_SHOW_ALL»],
«PAGER_BASE_LINK_ENABLE» => $arParams[«PAGER_BASE_LINK_ENABLE»],
«PAGER_BASE_LINK» => $arParams[«PAGER_BASE_LINK»],
«PAGER_PARAMS_NAME» => $arParams[«PAGER_PARAMS_NAME»],
«DISPLAY_DATE» => $arParams[«DISPLAY_DATE»],
«DISPLAY_NAME» => «Y»,
«DISPLAY_PICTURE» => $arParams[«DISPLAY_PICTURE»],
«DISPLAY_PREVIEW_TEXT» => $arParams[«DISPLAY_PREVIEW_TEXT»],
«PREVIEW_TRUNCATE_LEN» => $arParams[«PREVIEW_TRUNCATE_LEN»],
«ACTIVE_DATE_FORMAT» => $arParams[«LIST_ACTIVE_DATE_FORMAT»],
«USE_PERMISSIONS» => $arParams[«USE_PERMISSIONS»],
«GROUP_PERMISSIONS» => $arParams[«GROUP_PERMISSIONS»],
«FILTER_NAME» => $arParams[«FILTER_NAME»],
«HIDE_LINK_WHEN_NO_DETAIL» => $arParams[«HIDE_LINK_WHEN_NO_DETAIL»],
«CHECK_DATES» => $arParams[«CHECK_DATES»],
«CELL-LARGE» => $arParams[«CELL-LARGE»],
«CELL-MEDIUM» => $arParams[«CELL-MEDIUM»],
«CELL-SMALL» => $arParams[«CELL-SMALL»],
),
$component
);

Архив магазина StartShop на момент урока можно скачать отсюда.
От автора:
Ну вот, наконец-то мы доделали наш каталог для магазина Битрикс на редакции Старт StartShop. Теперь он выглядит вполне достойно, можно редактировать количество выводимых элементов, количество колонок. Он адаптивный — меняет количество колонок в зависимости от размера экрана. Конечно, над красотой каталога можно ещё работать и работать, но это уже выходит за рамки моего курса (по крайней мере пока). А в следующим уроке мы займемся выводом детальной страницы товара.
Давайте обратную связь и подписывайтесь, чтобы не пропустить новые статьи. До встречи.