Дата последнего изменения: 18.04.2025
В качестве примера сделаем компонент Карточка пользователя. Компонент будет отображать имя, аватар и, при необходимости, email пользователя. При клике на аватар фотография откроется в новом окне.
Пользовательские компоненты размещают в папке /local/components/
. Это отделяет их от системных и упрощает обновление системы.
Имена компонентов строят иерархически в формате идентификатор1.идентификатор2...
. Начинают с общего понятия и заканчивают конкретным назначением компонента. Полное имя включает пространство имен: пространство_имен:имя_компонента
.
Компонент Карточка пользователя можно назвать my:user.card
. Для этого создайте папки:
my
в /local/components/
,user.card
в /local/components/my/
.Создайте следующие папки и файлы для компонента:
/local/components/my/user.card/ ├── .description.php // Описание компонента ├── .parameters.php // Параметры компонента ├── class.php // Логика компонента ├── templates/ │ ├── .default/ │ │ ├── template.php // Шаблон вывода │ │ ├── script.js // Логика для карточки │ │ └── style.css // Стили карточки └── lang/ └── ru/ └── messages.php // Локализация
*.php
содержит строку if (!defined('B_PROLOG_INCLUDED') || B_PROLOG_INCLUDED !== true) die();
. Это предотвращает прямой вызов файла из браузера.Файл .description.php
содержит массив $arComponentDescription
с основными характеристиками компонента. В массив передайте название компонента, описание и расположение в дереве компонентов.
<?php if (!defined('B_PROLOG_INCLUDED') || B_PROLOG_INCLUDED !== true) die(); $arComponentDescription = [ 'NAME' => 'Карточка пользователя', 'DESCRIPTION' => 'Выводит небольшую карточку с информацией об указанном пользователе', 'PATH' => [ 'ID' => 'my', 'NAME' => 'Мои компоненты', ], ]; ?>
Файл .parameters.php
содержит массив $arComponentParameters
, который описывает входные параметры компонента. Добавьте в массив группу USER_CARD
и два параметра:
USER_ID
— числовой параметр с идентификатором пользователя,SHOW_EMAIL
— чекбокс, который определяет, показывать ли email.<?php if (!defined('B_PROLOG_INCLUDED') || B_PROLOG_INCLUDED !== true) die(); $arComponentParameters = [ 'GROUPS' => [ 'USER_CARD' => [ 'NAME' => 'Параметры карточки пользователя', ], ], 'PARAMETERS' => [ 'USER_ID' => [ 'NAME' => 'Идентификатор пользователя', 'TYPE' => 'NUMBER', 'PARENT' => 'USER_CARD', ], 'SHOW_EMAIL' => [ 'NAME' => 'Показывать email', 'TYPE' => 'CHECKBOX', 'DEFAULT' => 'Y', 'PARENT' => 'USER_CARD', ], ], ]; ?>
Файл class.php
— основной файл логики компонента. Чтобы получить данные пользователя и передать их в шаблон, используйте методы:
initResult()
— получает данные из базы,executeComponent()
— выполняет компонент и кеширует результаты.<?php if (!defined('B_PROLOG_INCLUDED') || B_PROLOG_INCLUDED !== true) die(); class UserCardComponent extends CBitrixComponent { /** * Подготавливаем входные параметры * * @param array $arParams * * @return array */ public function onPrepareComponentParams($arParams) { $arParams['USER_ID'] ??= 0; $arParams['SHOW_EMAIL'] ??= 'Y'; return $arParams; } /** * Основной метод выполнения компонента * * @return void */ public function executeComponent() { // Кешируем результат, чтобы не делать постоянные запросы к базе if ($this->startResultCache()) { $this->initResult(); // Если ничего не найдено, отменяем кеширование if (empty($this->arResult)) { $this->abortResultCache(); ShowError('Пользователь не найден'); return; } $this->includeComponentTemplate(); } } /** * Инициализируем результат * * @return void */ private function initResult(): void { $userId = (int)$this->arParams['USER_ID']; if ($userId < 1) { return; } $user = \Bitrix\Main\UserTable::query() ->setSelect([ 'NAME', 'EMAIL', 'PERSONAL_PHOTO', ]) ->where('ID', $userId) ->fetch() ; if (empty($user)) { return; } $this->arResult = [ 'NAME' => $user['NAME'], 'EMAIL' => $user['EMAIL'], ]; // Получаем путь до аватара, если он указан if (!empty($user['PERSONAL_PHOTO'])) { $this->arResult['PERSONAL_PHOTO_SRC'] = \CFile::GetPath($user['PERSONAL_PHOTO']); } } } ?>
Файл templates/.default/template.php
содержит шаблон по умолчанию и определяет внешний вид карточки пользователя.
Используйте данные из $arResult
, чтобы отобразить имя, email пользователя и аватар при наличии.
<?= $arResult['NAME'] ?>
безопасен и не приведет к XSS или HTML-инъекциям. Данные в массивах $arParams
и $arResult
экранированы и подготовлены для вывода.
<?php if (!defined('B_PROLOG_INCLUDED') || B_PROLOG_INCLUDED !== true) die(); use Bitrix\Main\Localization\Loc; /** * @var array $arParams * @var array $arResult * @var CMain $APPLICATION * @var CBitrixComponent $component * @var CBitrixComponentTemplate $this */ ?> <div class="my-user-card"> <?php if (isset($arResult['PERSONAL_PHOTO_SRC'])): ?> <div class="my-user-card__avatar"> <img class="js-my-user-card-avatar-show-in-new-page" src="<?= $arResult['PERSONAL_PHOTO_SRC'] ?>" alt="<?= $arResult['NAME'] ?>" > </div> <?php endif; ?> <div class="my-user-card__info"> <h2 class="my-user-card__name"> <?= $arResult['NAME'] ?> </h2> <?php if ($arParams['SHOW_EMAIL'] === 'Y'): ?> <p class="my-user-card__email"> <span><?= Loc::getMessage('USER_CARD_EMAIL_LABEL') ?></span> <span><?= $arResult['EMAIL'] ?></span> </p> <?php endif; ?> </div> </div>
Файл templates/.default/script.js
содержит скрипт для обработки событий. Добавьте код, который будет открывать фотографию пользователя в новом окне при клике на аватар.
BX.ready(() => { document.querySelectorAll('.js-my-user-card-avatar-show-in-new-page').forEach((item) => { BX.Event.bind(item, 'click', (e) => { window.open(item.src, '_blank'); }); }); });
Файл templates/.default/style.css
содержит стили компонента. Добавьте стили для внешнего вида карточки.
.my-user-card { background: #cff9f2; padding: 15px; width: 230px; } .my-user-card__avatar { margin: 0 0 15px 0; } .my-user-card__avatar img { cursor: pointer; max-width: 200px; } .my-user-card__info { text-align: left; } .my-user-card__name { font-size: 1.5rem; margin: 0 0 10px 0; } .my-user-card__email { font-size: 1rem; }
Файл lang/ru/messages.php
содержит переводы текстов, которые используются в компоненте. Локализация нужна для поддержки разных языков.
<?php $MESS['USER_CARD_EMAIL_LABEL'] = 'E-mail:'; ?>
Сначала создайте страницу, например, /my-page/index.php
. Разместите на странице и настройте новый компонент.
/my-page/index.php
на редактирование в визуальном редакторе.В результате на странице /my-page/index.php
будет выведена карточка пользователя.
Страница /my-page/index.php
с размещенным на ней компонентом имеет следующий код:
<?php require($_SERVER['DOCUMENT_ROOT'] . '/bitrix/header.php'); $APPLICATION->SetTitle(""); ?><?$APPLICATION->IncludeComponent( "my:user.card", "", Array( "SHOW_EMAIL" => "Y", "USER_ID" => "1" ) );?><?php require($_SERVER['DOCUMENT_ROOT'] . '/bitrix/footer.php'); ?>