Доработка компонентов

Урок 2 из 8

40 мин

Нормально

Немного теории

При первом знакомстве может показаться, что у стандартных компонентов «1С-Битрикс: Управление Сайтом» настроек даже слишком много. Например, у компонента, выводящего список элементов инфоблока bitrix:news.list 49 параметров! При этом, в большинстве случаев, разработчик задает только ID инфоблока, количество на странице, список полей и свойств для вывода.

Но если речь идет про серьезную разработку с нестандартным поведением, даже этого количества параметров может не хватить. Например, для каждой новости в списке вывести список привязанных к ней событий в календаре компаний (другой инфоблок). Ни один стандартный шаблон компонента такую функцию выполнить не сможет. А значит, требуется его доработать.

В данном уроке вы узнаете о кастомизации шаблонов компонентов. Более серьезные способы доработки самого компонента будут рассмотрены дальше в курсе.

Напомним структуру шаблона компонента. Основные php-файлы:

  1. Обязательный файл шаблона. Для простых компонентов называется template.php, для комплексных название может быть иным (например, news.php или detail.php). В этом файле запрещено обращение к БД и сторонним сервисам, ответственность этого файла: вывести на экран html-шаблон на основе данных из $arResult и $arParams
  2. result_modifier.php. Главный друг разработчика, когда речь идет про доработку компонента в шаблоне. Если в $arResult нет нужных для template.php данных, именно тут нужно эти данные получить. В этом файле запрещен вывод html. Файл обрабатывается до template.php
  3. component_epilog.php. Похож на result_modifier.php, но обрабатывается после template.php и после завершения кеширования. Поэтому в этом файле допустимо манипулировать свойствами страниц или хлебными крошками.
  4. .parameters.php. Если новую логику result_modifier.php требуется параметризовать, то в этом файле должны быть описаны эти параметры для Эрмитажа компонента.

Обычная последовательность действий при доработке компонентов:

  1. Скопировать самый подходящий шаблон компонента в свой шаблон сайта (через Эрмитаж)
  2. Удалить из шаблона компонента все ненужное. Файлы стилей, сценарии JS, изображения и т.д.
  3. В result_modifier.php добавить все нужные для шаблона данные в $arResult
  4. Если требуется параметризация логики — объявить новые настройки в .parameters.php
  5. Доработать вывод html в template.php
  6. Если компонент должен не только выводить html — передать данные из result_modifier.php в component_epilog.php

Последовательность действий усложняется, если требуется изменить шаблон компонента, входящего в состав комплексного. Напомним, что в шаблонах таких компонентов, как bitrix:catalog и bitrix:news создана папка bitrix, в которой находятся шаблоны простых компонентов (например, bitrix:news.list или bitrix:catalog.section.list).

Таким образом, чтобы модифицировать вложенный шаблон простого компонента потребуется скопировать весь шаблон родительского комплексного компонента.

Примеры

// Для компонента bitrix:menu отметить внешние ссылки

foreach ($arResult as $i => $arItem) {
	if (substr_count($arItem["LINK"], "https://")) {
		$arResult[$i]["PARAMS"]["TARGET"]="_blank";
	}
}

// Для компонента bitrix:catalog.section подготовка json
foreach ($arResult['ITEMS'] as $index => $arItem) {
    $jsData = [];

	$jsData['NAME'] = $arItem['NAME'];
    $jsData['ID'] = $arItem['ID'];

    if($arItem['PRODUCT']) {
        $jsData['PRODUCT'] = [
            'TYPE' => $arItem['PRODUCT']['TYPE'],
            'AVAILABLE' => $arItem['PRODUCT']['AVAILABLE'],
            'QUANTITY' => $arItem['PRODUCT']['QUANTITY']
        ];
	}
	$jsData['OFFERS'] = count($arItem['OFFERS']);
	$arResult['JS_DATA'][] = $jsData;
}

Практика

В первом примере добавим на страницу новости ссылки на предыдущую и следующую новость. В стандартном news.detail информации для построения таких ссылок нет, получим её в result_modifier.php.

Доработка компонентов, пример 1

19 мин

Во втором примере заменим стандартный шаблон компонента на свой, сохраним функции "эрмитажа".

Доработка компонентов, пример 2

14 мин