Структура простого компонента
Компонент хранит все, что ему нужно для работы, в своей папке. Поэтому их можно легко переносить между проектами. Файлы компонента нельзя использовать по отдельности. Компонент — это единое целое, он обладает свойством неделимости. Папка компонента может содержать следующие папки и файлы:
- Папка
langв которой расположены файлы языковых сообщений переводов компонента. С версии 11.0 в ней также могут размещаться папка помощиhelp - Папка
templatesв которой расположены шаблоны вывода (отображения) компонента. Эта подпапка может отсутствовать, если у компонента нет шаблонов вывода- Папка
.default- Файл
template.phpшаблон компонента, отвечает за показ элемента инфоблока - Файл
component_epilog.phpподключается после файла шаблона template.php и никогда не кешируется - Файл
result_modifier.phpпозволяет внести изменения в результаты работы компонента, т.е. модифицировать массив$arResult - Файл
script.jsсодержит скрипты необходимые для работы компонента, подключается автоматически - Файл
style.cssсодержит стили необходимые для работы компонента, подключается автоматически
- Файл
- Папка
- Файл
class.phpдля поддержки ООП-компонентов - Файл
component.phpсодержит код компонента. Задача этого файла, сформировать из полученных параметров$arParamsмассив$arResult, который впоследствии попадет в шаблон компонента. Этот файл должен всегда присутствовать в папке компонента - Файл
.description.phpсодержит название, описание компонента и его положение в дереве логического размещения (для редактора). Этот файл должен всегда присутствовать в папке компонента. Его отсутствие не скажется на работе компонента, но размещение компонента через визуальный редактор станет невозможным - Файл
.parameters.phpкоторый содержит описание входных параметров компонента для редактора. Если у компонента есть входные параметры, то этот файл должен присутствовать в папке компонента - Любые другие папки и файлы с ресурсами, необходимыми компоненту, например папка
images
Порядок подключения файлов
- component.php или class.php
- result_modifier.php
- template.php
- component_epilog.php
Общая структура компонента
if ( ! \Bitrix\Main\Loader::includeModule('iblock')) {
ShowError('Модуль «Информационные блоки» не установлен');
return;
}
/*
* Подготовка входных параметров компонента
*/
// время кеширования
if (!isset($arParams['CACHE_TIME'])) {
$arParams['CACHE_TIME'] = 3600;
} else {
$arParams['CACHE_TIME'] = intval($arParams['CACHE_TIME']);
}
// идентификатор элемента инфоблока
$arParams['ELEMENT_ID'] = empty($arParams['ELEMENT_ID']) ? 0 : intval($arParams['ELEMENT_ID']);
// типичный алгоритм кеширования
if ($this->StartResultCache()) {
// если нет валидного кеша — получаем данные из БД
if ($arParams['ELEMENT_ID']) {
// выполняем запрос к базе данных
$rsElement = CIBlockElement::GetList(/*...*/);
if ($arResult = $rsElement->GetNext()) {
// добавляем в массив arResult дополнительные элементы, которые могут потребоваться в шаблоне
}
}
// если данные получены успешно
if (isset($arResult['ID'])) {
// ключи $arResult, перечисленные при вызове этого метода, будут доступны в component_epilog.php и ниже по коду. Обратите внимание, там уже будет другой $arResult
$this->SetResultCacheKeys(
array(
'ID',
'NAME'
)
);
// подключаем шаблон и сохраняем кеш
$this->IncludeComponentTemplate();
// что-то пошло не так
} else {
$this->AbortResultCache();
\Bitrix\Iblock\Component\Tools::process404(
'Страница не найдена',
true,
true
);
}
}
// кэш не затронет весь код ниже, он будут выполняться на каждом хите, но здесь работаем уже с другим $arResult — будут доступны только те ключи массива, которые перечислены в вызове SetResultCacheKeys()
if (isset($arResult['ID'])) {
// счетчик просмотров элемента
CIBlockElement::CounterInc($arResult['ID']);
// устанавливаем заголовок страницы
$APPLICATION->SetTitle($arResult['NAME']);
}
Кеширование
bool CBitrixComponent::StartResultCache(
int cacheTime,
string additionalCacheID,
string cachePath
)
Метод поддержки внутреннего кеширования компонента. Возвращает true в случае, если кеш недействителен, или false в противном случае.
Если кеш действителен, метод отправляет на экран его содержимое, заполняет $arResult и возвращает false. Если кеш недействителен, метод возвращает true, кеширование завершается и кеш сохраняется при вызове методов сразу после подключения шаблона компонента:
CBitrixComponent::IncludeComponentTemplate()CBitrixComponent::ShowComponentTemplate()
Параметры кеширования
cacheTimeвремя кеширования в секундах. Если этот параметр равенfalse, то время кеширования берется из входного параметра$arParams['CACHE_TIME']. Необязательный.additionalCacheIDкеш зависит от текущего сайта (SITE_ID), имени компонента, имени шаблона, входных параметров$arParams. Если кеш должен зависеть от каких-либо дополнительных параметров, то их необходимо передать сюда в виде строки. По умолчанию параметр равенfalse, т.е. кеш зависит только от текущего сайтаSITE_ID, имени компонента, имени шаблона и входных параметров$arParams. Необязательный.cachePathпуть к файлу кеша относительно папки кешей. Необязательный.
Массивы $arParams и $arResult
Массив $arParams — это предопределенная для компонента переменная, представляющая собой массив входных параметров компонента. Ключами в этом массиве являются названия параметров, а значениями — их значения.
Перед подключением компонента ко всем значениям параметров применяется функция htmlspecialcharsEx(). Исходные значения параметров сохраняются в этом же массиве с теми же ключами, но с префиксом ~. Например, $arParams["NAME"] — входной параметр, к которому применена функция htmlspecialcharsEx(), а $arParams["~NAME"] — исходный входной параметр.
Переменная $arParams является псевдонимом для члена класса компонента, поэтому все изменения этой переменной отражаются и на этом члене класса. В начале кода компонента должна быть произведена проверка входных параметров, инициализация не установленных параметров, приведение к нужному типу. Все эти изменения входных параметров будут доступны и в шаблоне. То есть параметры будут там уже проверенными и максимально безопасными. Дублирование подготовки параметров в шаблоне компонента не требуется.
Массив $arResult — это предопределенная для компонента переменная, в которую собирается результат работы компонента для передачи в шаблон. Перед подключением файла компонента эта переменная инициализируется пустым массивом array().
Переменная $arResult является псевдонимом для члена класса компонента, поэтому все изменения этой переменной отражаются и на этом члене класса. Значит явно передавать в шаблон эту переменную не нужно, это сделают внутренние механизмы класса компонента.
Файл component_epilog.php
Файл component_epilog.php подключается после файла шаблона template.php и никогда не кешируется, т.е. он отработает независимо от того, был показан только что созданный html-код или вывод из кеша. Соответственно, можно использовать этот файл для выполнения каких-то действий на каждом хите — например, выводить html-код выше на странице, используя отложенные функции.
Но в нативных компонентах данные, доступные в component_epilog.php, как правило, весьма ограничены — доступны лишь ключи $arResult, перечисленные при вызове SetResultCacheKeys(). Однако, можно расширить перечень этих ключей, не затрагивая код компонента. Для этого копируем шаблон компонента, создаем файл result_modifier.php и добавляем в него код:
if (!defined('B_PROLOG_INCLUDED') || B_PROLOG_INCLUDED!==true) die();
// добавляем ключ SECTION в массив $arResult
$this->__component->SetResultCacheKeys(array('SECTION'));
Файл result_modifier.php
Файл result_modifier.php позволяет внести изменения в результаты работы компонента, т.е. модифицировать массив $arResult. Файл необходимо разместить в директории, куда был скопирован шаблон компонента. Типичные решаемые задачи:
- Удалить лишние данные из массива результата
- Преобразовать данные перед выводом в шаблоне
- Получить дополнительные данные из инфоблока
- Добавить ключи в кеш, для использования в
component_epilog.php
Файл component.php
Самый главный файл, присутствующий в компоненте — это component.php. Без него работать компонент не будет. В нем идет обработка входящих параметров, используя АПИ Битрикс, производится выборка из базы данных, формируется основной массив $arResult, и затем, при помощи метода includeComponentTemplate(), результат работы передается в шаблон компонента.
То есть, в данном файле описана вся логика работы компонента, поэтому он обязательный и должен присутствовать в любом из компонентов.
Код у него достаточно сложный, и большинство все из него вы сразу не будете использовать. Это все написано для того, что бы компонент был более универсальный и мог выполнять различные задачи.
Файл .parameters.php
Следующий файл — это .parameters.php, в нем описаны параметры компонента, которые задаются в форме его настроек. В данном файле содержится основной массив $arComponentParameters, в массиве PARAMETERS собираются все настройки, которые отображаются в настройках компонента.
Все эти параметры передаются в файл component.php в массиве $arParams, который на основе их в дальнейшем обрабатывает и формирует массив $arResult.
Если у компонента есть входные параметры, то данный файл должен присутствовать, но бывает, когда компонент выполняет некую логику без входных параметров, тогда этот файл может отсутствовать.
Файл .description.php
Файл description.php, в нем содержится описание компонента и порядок его отображения в виртуальном дереве редактора.
Он необязательный и его отсутствие не скажется на работе компонента, но в таком случае, размещение компонента через редактор станет невозможным.
Папка lang
Обратите внимание на часто повторяющуюся функцию GetMessage(). Она выводит текстовое содержание по ключу из файлов, расположенных в папке lang.
В ней содержатся языковые файлы с переводом компонента на различные языки. Под каждый языковой файл создана своя отдельная директория. В каждой директории размещаются файлы с теми же названиями, в которых находятся языковые сообщения, переведенные на различные языки.
В файлах находятся простые массивы, их ключами являются идентификаторы констант, а значениями — сами константы, переведенные на соответствующий язык.
В папке help, располагается файл с такими же массивами, только для них дополнительно прописывается приставка _TIP, для вывода подсказок в настройках компонента.
Папки images
В папке images располагается иконка компонента, которая выводятся в визуальном редакторе, точнее отображалась в предыдущей версии редактора, а так же выводится в форме при копировании компонента.
Папке templates
В папке templates содержатся шаблоны компонентов, определяющие формат вывода данных на странице сайта.
Внутри видим различные папки, каждая папка — это отдельный шаблон. Название папки является названием шаблона компонента. Все эти шаблоны отображаются в настройках компонента. Папка .default должна присутствовать, в ней располагается шаблон по умолчанию, который подключается, если не указать наименование шаблона в настройках компонента.
Логика работы компонента
Компонент — логически завершенный код — состоит из ряда папок и файлов. Часть из них обязательна, без которых он работать не будет, часть может отсутствовать.
Компонент получает входящие параметры из массива $arParams, затем обрабатывает полученную информацию и формирует итог работы в массив $arResult. Если у компонента имеется визуальное представление, то подключается шаблон, и в него передается данные из массива $arParams и $arResult, на основании которых строится вывод всей информации на странице сайта.
