меню
- -
4 способа расширить стандартные компоненты 1С-Битрикс

4 способа расширить стандартные компоненты 1С-Битрикс

5 минут
🙈 ∞
4 способа расширить стандартные компоненты Bitrix
Часто в своей работе сталкиваюсь с сайтами, написанными целиком на самодельных компонентах, без использования стандартных. Поддержка таких сайтов со временем превращается в сущий ад: каждое изменение в логике/структуре/выводе информации требует доработку всего компонента. А это не правильно.

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

Механизм компонентов Bitrix имеет ряд инструментов, позволяющих расширять стандартный функционал, изменяя их под свои нужды.

Кроме этого, существует пара приемов, облегчающих работу с шаблонами: они позволяют вынести css и js код в файлы шаблона и вызывать только на страницах, где они действительно нужны.

1. Добавляем пользовательские настройки

Файл .parameters.php в шаблоне компонента

При создании шаблона компонента, часто возникает необходимость ввести какие-то дополнительные настройки. Для примера представим, что необходимо сделать слайдер последних новостей. Мы, как опытные разработчики, решили использовать компонент списка новостей (bitrix:news.list) и подключить в шаблоне JS библиотеку. Но вот незадача, для нашего любимого скрипта необходимо проставить скорость смены слайда и эффект перехода.

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

Слава богу, этого можно легко избежать. Скопируем для начала шаблон компонента.

Копирование шаблона компонента Если сейчас заглянуть в структуру, можно заметить, что у нас уже есть файлы .parameters.php и style.css. Они скопировались из дефолтного шаблона, для чистоты эксперимента давайте представим, что их не было (тем более, в большинстве случаев, стандартные шаблоны содержат только template.php и папку с lang файлами).

Дальше создадим файл .parameters.php, его структура схожа с параметры компонента. Подробнее про настройки параметров компонента я писал здесь.

Структура шаблона компонента А теперь опишем необходимые свойства: SLIDER_EFFECT со списком возможных переходов и SLIDER_TIME, куда мы будем вводить время смены слайдов
<?
 if (!defined("B_PROLOG_INCLUDED") || B_PROLOG_INCLUDED!==true) die();

 $arTemplateParameters = array(
     'SLIDER_EFFECT' =>  array(
         'NAME'      =>  'Эффект смены слайдов',
         'TYPE'      =>  'LIST',
         'SORT'      =>  '10',
         'VALUES'    =>  array(
             'sliding'   =>  'Скольжение',
             'fading'    =>  'Затухание',
         ),
         'MULTIPLE'  =>  'N',
     ),
     'SLIDER_TIME'   =>  array(
         'NAME'      =>  'Скорочть смены слайдов (мс)',
         'TYPE'      =>  'STRING',
         'SORT'      =>  '20',
         'DEFAULT'   =>  '5000',
     ),
 );
 ?>
Теперь наши свойства можно найти в настройках компонента в разделе "Дополнительные настройки" и использовать в шаблоне, как и другие параметры $arParams.
Дополнительные настройки

2. Расширяем функциональность

Файлы result_modifier.php и component_epilog.php

Давайте представим другую ситуацию. В инфоблоке новостей есть свойство "Привязка к пользователю", нам необходимо вывести всё те же последние записи, но кроме стандартных полей надо показать имя пользователя, создавшего новость. Стандартные компоненты такое делать не умеют.

Опять же, мы с вами крутые разработчики, мы не кидаемся в бой не обдумав возможные решения. Первый и самый очевидный: создать свой компонент с блэкджеком и шлюхами куртизанками и преферансом. Второй и самый дурацкий: взять стандартный компонент bitrix и внести в него изменения. Третий и оптимальный: не разрабатывать все с нуля, а взять за основу готовый компонент.

Как раз для таких случаев используются файлы result_modifier.php и component_epilog.php.

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

Схема работы компонентов bitrix Как видно из схемы, result_modifier.php подключается сразу после component.php. В нем можно, например, получить дополнительные данные и, записав их в $arResult, передать дальше в шаблон компонента. Подробнее про файл result_modifier в официальной документации.

Файл component_epilog.php нужен для изменения закешированных данных. Код, помещенный в файл, будет выполняться в любом случае, независимо от того, отдается информация из кэша или получается в ходе работы component.php. Официальная документация.

Давайте создадим файл result_modifier.php и получим необходимые данные. 
<?php
 if(!defined("B_PROLOG_INCLUDED") || B_PROLOG_INCLUDED!==true)die();

 //  Массив идентификаторов пользователей
 $usersID = array();

 //  Собираем все id пользователей
 foreach ($arResult['ITEMS'] as $item) {
     $usersID[] = $item['PROPERTIES']['TEST']['VALUE'];
 }
 
 //  Получение списка пользователей по их ID
 $dbUsers = CUser::GetList(
     ($by = 'id'),
     ($order = 'asc'),
     array(
         'SELECT'    =>  array(
             'ID'    =>  implode(' ! ', $usersID),
         )
     )
 );

 while ($arUsers = $dbUsers->Fetch()) {
     //    Передаем новые данные в шаблон, записав их в $arResult
     $arResult['USERS'][$arUsers['ID']] = $arUsers['NAME'];
 }
Готово. Теперь в шаблоне мы можем по ключу вывести имена пользователей.

3. Добавляем много JS кода

Файл script.js

Давайте вернемся к примеру про слайдер. Для его реализации нам нужно написать js скрипт. Тут также возможны несколько вариантов:
  1. Вызывать скрипт в шаблоне сайта. Но тогда он будет подключаться на каждой странице, вне зависимости есть там компонент или нет
  2. Вызывать скрипт вне компонента на странице. Чуть лучше, но есть большая вероятность, что контент редактор случайно сотрет ваш код, и слайдер перестанет работать.
  3. Написать код в шаблоне компонента. Не самое изящное решение, js код большой, он перемешается с кодом шаблона, работать будет неудобно.
  4. Создать файл script.js, который подключится к шаблону автоматически. Идеально.
Тут мне добавить нечего. Как я уже говорил, файл подключается автоматически. Ничего дополнительно делать не надо.

4. Добавляем стили компонента

Файл style.css

Такая же ситуация и с CSS. Если вы не хотите, чтоб template_styles.css шаблона сайта неимоверно разрастался и тянул за собой всё оформление (используется оно на странице или нет) можно вынести специфичные стили в style.css шаблона компонента. 

После создания, файл подключится автоматически везде, где используется компонент с данным шаблоном. 
Статья из подборки 1С-Битрикс Разработка сайтов
Обсудим проект? Напиши в Телеграм, Whatsapp или ВК

Комментарии (11)

Чтобы оставить комментарий, авторизуйтесь. Войти или зарегистрироваться
Алексей Симак 14:16 21.01.2020

Добрый день, Дмитрий
Второй и самый дурацкий: взять стандартный компонент bitrix и внести в него изменения. Третий и оптимальный: не разрабатывать все с нуля, а взять за основу готовый компонент
Не вижу разницы между этими двумя вариантами, и там и там придется за основу взять готовый компонент... откройте мне глаза пожалуйста

0 #
Yazykov Dmitry 14:42 21.01.2020

Разница принципиальна:
В случае внисения изменений в стандартные компоненты (например, bitrix:news.list), мы рискуем потерять их (изменения) при обновлении.
В случае копирования стандартного компонента в своё пространство имен (например, best_company:news.list), мы не потерям изменения.

0 #
Алексей Симак 15:24 21.01.2020

Вот теперь понятно, что вы имели в виду, добавьте хоть слова «свое пространство имен» в то предложение)
Спасибо)

0 #
Ник И 11:29 27.06.2018

Пожалуйста расскажите как сменить шаблон компонента в зависимости от условия?
Например жестко прописав папку при открытии которой компонент должен запускаться с нужным шаблоном.

Где в коде компонента можно добавить такое условие и прописать имя шаблона?

0 #
Yazykov Dmitry 12:03 27.06.2018

Откройте нужную страницу в режиме кода (лучше используйте какой-нибудь IDE).

На этой странице вы найдете функцию подключения вашего компонента:
$APPLICATION->IncludeComponent(
'название компонента',
'название шаблона',
array()
);

Второй параметр - как раз строка названия шаблона. Туда можно передать переменную. Ваша задача решается примерно так:
$templateName = '';
if (true) {
$templateName = 'template1';
} else {
$templateName - 'template2';
}
$APPLICATION->IncludeComponent(
'название компонента',
$templateName,
array()
);

У такого решения есть ряд минусов, например, если вы решите изменить настройки компонента в визуальном редакторе, шаблон выставится исходя из настроек (переменную придется прописывать заново). В зависимости от ситуации можно обернуть компонент в еще один компонент, либо запретить редактирование настроек компонента, передав пятым параметром функции массив с 'HIDE_ICONS' => 'Y':

$APPLICATION->IncludeComponent(
'название компонента',
$templateName,
array(),
false,
array('HIDE_ICONS' => 'Y')
);

0 #
Ник И 03:21 28.06.2018

Не понял насчет обернуть компонент. У меня компонент меню, обернуть меню в меню?

К сожалению, редактировать шаблон сайта в моем случае нельзя.
Доступен лишь компонент. Мне подсказали, что нужно смотреть в сторону объекта CBitrixComponent в переменной $component, но как это сделать так и не сообразил.

0 #
Yazykov Dmitry 12:59 28.06.2018

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

dev.1c-bitrix.ru

0 #
Ник И 08:39 27.07.2018

В общем, просто продублировал код вызова компонента внутри условия, без использования переменных. В таком варианте можно редактировать из фронт офиса, ничего не слетает...

0 #
sudo root 09:34 07.06.2016

4 способа расширить стандартные компоненты Bitrix... а на скрине статьи - wordpress :DDDD

А вообще хорошая статья, но есть и другой подход, когда стили/скрипты, относящийся к компоненту, хранят в одной месте, и подключают их уже через API в шаблоне, не используя script.js/style.css, довольно разумно, когда много компонентов + всё в этом месте.

0 #
Yazykov Dmitry 09:41 07.06.2016

Согласен.
У меня было в мыслях замерить производительность нескольких подходов к разработке, но, к сожалению, руки еще не дошли.

0 #
Альфред Иванов 08:54 04.05.2016

Полезная вещь при кастомизации

0 #
Telegram
+
tg
Мы в Telegram Читай первым уникальный контент
+
Подпишись на наш Телеграм канал