Атрибуты
Выберите инструмент для разработки с AI-агентом:
- используйте Битрикс24 Вайбкод, чтобы создать приложение для Битрикс24 по описанию задачи без знания языков программирования. Агент напишет код и разместит приложение на сервере без ручной настройки хостинга
- используйте MCP-сервер, чтобы разрабатывать интеграцию через REST API в своем проекте. Агент будет обращаться к официальной REST-документации
Атрибуты — это дополнительные значения, которые сохраняются в элементах блока и используются в настройках, JS-логике и условной стилизации. Например, через атрибуты можно хранить параметры карты, ссылок, режимов отображения и других сценариев блока.
Атрибуты регистрируются в ключе attrs манифеста блока. Ключ attrs связывает атрибуты с нодами и карточками.
Где можно описывать ключ attrs
Ключ attrs можно задавать в нескольких местах манифеста:
- В корне манифеста:
'attrs' => [
'.landing-block-node-text' => [
[
'name' => 'Настройка текст',
'type' => 'dropdown',
'attribute' => 'data-copy',
],
],
]
- В
style.nodes, в этом случае поле выводится в форме дизайна:
'style' => [
'nodes' => [
'.landing-block-node-card-button' => [
'name' => 'Button',
'type' => ['border-color', 'button', 'animation'],
'additional' => [
'attrs' => [
[
'type' => 'text',
'name' => 'Text field',
'attribute' => 'data-test-card-attr',
],
],
],
],
],
]
- В
cards, атрибут применяется отдельно к каждой карточке:
'cards' => [
'.landing-block-node-card-button' => [
'name' => 'Card',
'additional' => [
'attrs' => [
[
'type' => 'text',
'name' => 'Text field',
'attribute' => 'data-test-card-attr',
],
],
],
],
]
Группировка атрибутов
Если нужно сгруппировать часть атрибутов, используется групповой контейнер attrs:
'attrs' => [
'' => [
[
'name' => 'Test group',
'attrs' => [
[
'type' => 'checkbox',
'selector' => 'bitrix:catalog.section',
'name' => '',
'items' => [
['name' => 'Отображение товаров', 'value' => '1'],
['name' => 'Отображение товаров 2', 'value' => '2'],
],
'attribute' => 'data-checkbox',
],
[
'type' => 'checkbox',
'name' => '',
'items' => [
['name' => 'Отображение товаров 22', 'value' => '1'],
],
'compact' => true,
'attribute' => 'data-checkbox2',
],
],
],
[
'type' => 'checkbox',
'name' => '',
'items' => [
['name' => 'Отображение товаров 33', 'value' => '1'],
],
'attribute' => 'data-checkbox3',
],
],
]
В блоке style.nodes поддерживается либо размещение без групп, либо группировка в рамках одного селектора:
'style' => [
'nodes' => [
'.landing-block-node-card-button' => [
'additional' => [
'attrs' => [
[
'name' => 'Test group',
'attrs' => [
[
'type' => 'text',
'name' => 'Test',
'attribute' => 'data-text',
],
[
'type' => 'text',
'name' => 'Test 2',
'attribute' => 'data-text2',
],
],
],
],
],
],
],
]
Переопределение селектора
Если значение должно сохраняться не в исходный селектор, укажите selector у конкретного атрибута:
[
'name' => 'Текстовое поле',
'type' => 'text',
'attribute' => 'data-text-field',
'selector' => '.demo-another-selector',
]
Поля атрибута
У атрибута есть общие поля, которые используются у разных типов и задают базовую настройку поля в редакторе. Отдельно от них есть типозависимые поля, которые работают только для конкретных типов.
Общие поля:
name— название поля в интерфейсеattribute— имя DOM-атрибута, куда сохраняется значениеtype— тип поляitems— список вариантовvalue— значение по умолчанию, например строка, объект или массивselector— переопределение селектора сохраненияhidden— регистрация без вывода в интерфейс редактированияattrs— группа вложенных атрибутовplaceholder— подсказка для вводаcompact— компактный режим отображения поля
Поля для отдельных типов:
textOnly— режим простого текстового ввода без визуального редактора, дляtextdisableLink— отключение редактирования ссылки, дляiconиimagedisableBlocks— отключение выбора блоков в селекторе ссылки, дляurldisableCustomURL— отключение ручного ввода произвольного URL, дляurltime— включение выбора времени, дляdateformat— формат сохранения даты и времени, дляdatedimensions— ограничения размеров изображения, дляimageproperty— целевое CSS-свойство, дляpalette,color,position,sortable-list,catalog-view,filterhtml— HTML-разметка фильтра, дляfilterfilterId— идентификатор фильтра, дляfilterhideSort— скрытие сортировки источников, дляdynamic_sourcesources— список доступных источников, дляdynamic_sourcetitle— заголовок поля, дляdynamic_sourcestubText— текст-заглушка, дляdynamic_sourceuseLink— включение режима ссылки, дляdynamic_sourcelinkType— тип ссылки, дляdynamic_source
Обязательность полей зависит от type и сценария. В общем случае требуется attribute, для списочных типов требуется items. Поле name рекомендуется указывать для корректного отображения в интерфейсе.
Если type не указан, используется text по умолчанию.
Типы атрибутов
Тип атрибута определяет, какой элемент управления будет в редакторе и в каком формате сохранится значение в атрибуте элемента.
Типы атрибутов:
text— однострочное текстовое полеdate— выбор даты и времениhtml— многострочное текстовое полеdropdown— выпадающий списокcheckbox— чекбокс или группа чекбоксовradio— выбор одного варианта из спискаmultiselect— множественный выборimage— выбор изображенияicon— выбор иконкиlink— ссылка с расширенными настройкамиurl— упрощенное поле URLslider— слайдер одного значенияrange-slider— слайдер диапазона значенийpalette— выбор из палитрыcolor— выбор цветаsortable-list— сортируемый список значенийposition— выбор позиции/направления элементаcatalog-view— настройки отображения каталожных данныхfilter— настройки фильтраuser-select— выбор пользователяdynamic_source— выбор динамического источника данных
Пример с разными типами атрибутов
$attrs = [
// text: текстовое поле
'.landing-block-node-text' => [
[
'name' => 'Подпись',
'type' => 'text',
'attribute' => 'data-caption',
'placeholder' => 'Введите подпись',
'textOnly' => true,
],
// dropdown: списочный тип
[
'name' => 'Режим отображения',
'type' => 'dropdown',
'attribute' => 'data-view',
'items' => [
['name' => 'Короткий', 'value' => 'short'],
['name' => 'Полный', 'value' => 'full'],
],
'value' => 'short',
],
],
// image: поле изображения с ограничениями
'.landing-block-node-image' => [
[
'name' => 'Изображение',
'type' => 'image',
'attribute' => 'data-card-image',
'dimensions' => [
'maxWidth' => 1200,
'maxHeight' => 1200,
],
],
],
// icon: выбор иконки
'.landing-block-node-icon' => [
[
'name' => 'Иконка',
'type' => 'icon',
'attribute' => 'data-card-icon',
'value' => [
'classList' => ['fa', 'fa-address-card'],
],
],
],
// link: поле ссылки с текстом, href и target
'.landing-block-node-link' => [
[
'name' => 'Ссылка',
'type' => 'link',
'attribute' => 'data-card-link',
'value' => [
'text' => 'Подробнее',
'href' => '/about',
'target' => '_self',
],
],
],
// multiselect: множественный выбор, включая вложенные пункты
'.landing-block-node-options' => [
[
'name' => 'Опции',
'type' => 'multiselect',
'attribute' => 'data-options',
'items' => [
['name' => 'Опция 1', 'value' => '1', 'selected' => true],
['name' => 'Опция 2', 'value' => '2'],
[
'name' => 'Группа',
'value' => 'group',
'items' => [
['name' => 'Подопция 1', 'value' => 'group-1', 'selected' => true],
['name' => 'Подопция 2', 'value' => 'group-2'],
],
],
],
],
],
// slider: выбор одного значения из шкалы
'.landing-block-node-slider' => [
[
'name' => 'Количество карточек',
'type' => 'slider',
'attribute' => 'data-cards-count',
'items' => [
['name' => '1', 'value' => 1],
['name' => '2', 'value' => 2],
['name' => '3', 'value' => 3],
['name' => '4', 'value' => 4],
],
'value' => 2,
],
],
// range-slider: выбор диапазона
'.landing-block-node-range' => [
[
'name' => 'Диапазон значений',
'type' => 'range-slider',
'attribute' => 'data-range',
'items' => [
['name' => '1', 'value' => 1],
['name' => '2', 'value' => 2],
['name' => '3', 'value' => 3],
['name' => '4', 'value' => 4],
['name' => '5', 'value' => 5],
],
'value' => [
'from' => 2,
'to' => 4,
],
],
],
// sortable-list: сортируемый список
'.landing-block-node-sortable' => [
[
'name' => 'Порядок блоков',
'type' => 'sortable-list',
'attribute' => 'data-sort-order',
'items' => [
['name' => 'Заголовок', 'value' => 'head'],
['name' => 'Свойства', 'value' => 'props'],
['name' => 'Действия', 'value' => 'action'],
],
'value' => ['head', 'props', 'action'],
],
],
// url: ссылка с ограничениями выбора
'.landing-block-node-button' => [
[
'name' => 'Ссылка кнопки',
'type' => 'url',
'attribute' => 'data-button-url',
'value' => '#landing166',
'disableBlocks' => true,
'disableCustomURL' => false,
],
],
// date: дата и время с форматом хранения
'.landing-block-node-date' => [
[
'name' => 'Дата публикации',
'type' => 'date',
'attribute' => 'data-publish-date',
'time' => true,
'format' => 'ms',
'value' => 1621584180000,
],
],
// palette: палитра с чтением цвета из CSS
'.landing-block-node-palette' => [
[
'name' => 'Цвет подложки',
'type' => 'palette',
'attribute' => 'data-bg-color',
'property' => 'background-color',
// Если нужно читать цвет не из стандартных стилей
'stylePath' => '/bitrix/templates/my-site/styles.css',
// Если цвет задается через псевдоэлемент
'pseudo-element' => '::after',
// Если цвет зависит от состояния элемента
'pseudo-class' => ':hover',
'items' => [
['name' => 'g-bg-lightblue', 'value' => 'g-bg-lightblue'],
['name' => 'g-bg-darkblue', 'value' => 'g-bg-darkblue'],
],
],
],
// position: выбор позиции
'.landing-block-node-badge' => [
[
'name' => 'Позиция бейджа',
'type' => 'position',
'attribute' => 'data-badge-position',
'items' => [
'top-left' => ['content' => '', 'value' => 'top-left'],
'top-center' => ['content' => '', 'value' => 'top-center'],
'top-right' => ['content' => '', 'value' => 'top-right'],
],
'value' => 'top-right',
],
],
];