BlockBuilder Logo/
Документация/Поля форм
Быстрый стартAPIVueReactДемоИстория изменений
GitHub

Начало работы

Быстрый стартИстория изменений

Справочник API

Обзор APIМетодыСвойстваПоля формТемизация и локализацияУтилитыТипы

Vue 3

Быстрый стартКомпонентыСобытияNuxt (SSR)

React

Быстрый стартКомпонентыКолбэкиNext.js (SSR)
Следующая страница
Темизация и локализация
→

Поля форм

Типы полей и кастомные рендереры для форм редактирования и создания блоков

Обзор

В конфигурации типа блока задаёте массив fields — BlockBuilder строит форму создания и редактирования и сохраняет значения в props.

Валидация в UI

Ошибки показываются в футере модалки и обновляются при изменении полей после неуспешного сохранения. Для своей формы без BlockBuilderComponent — ReactiveFormValidationTracker в разделе «Утилиты». У кастомного рендерера setError вызывается только при смене текста ошибки.

Пример использования

Стандартные типы полей

Встроенные контролы для fields. Описание параметров — в разделе Параметры полей ниже.

text

Заголовки и короткие строки

textarea

Длинный текст, описания, контент

email

Контактный email с проверкой формата

url

Ссылка с проверкой формата

number

Размеры, счётчики, числовые настройки

select

Выбор из фиксированного списка options

checkbox

Включено / выключено, видимость, флаги

radio

Один вариант из options, все опции видны сразу

color

Цвет фона, текста, акцентов (HEX)

image

Картинка блока с preview и загрузкой на сервер

file

Документы и архивы — список файлов, без preview

file-import

Кнопка импорта: данные из файла попадают в другие поля формы

block-anchor

Ссылка на блок страницы (#id) или внешний URL

matrix-table

Таблица с заголовками, HTML и картинками в ячейках

custom

Произвольный UI — свой рендерер по rendererId

api-select

Справочники с бэкенда: поиск и подгрузка страниц

Параметры полей

Каждый объект в массиве fields описывает одно поле формы. При сохранении блока значения попадают в block.props под ключом field (кроме полей с persist: false).

Базовые

fieldобязательный

Имя свойства в props блока. По нему читаете значение в render-компоненте (props.title, props.cards). Должно быть уникальным в рамках типа блока.

labelобязательный

Подпись поля в форме редактирования. На сохранённые данные не влияет.

typeобязательный

Какой контрол показать и как хранить значение. От типа зависят допустимые параметры: для select нужен options, для image — fileUploadConfig и т.д. Список типов — в разделе Стандартные типы полей.

defaultValueопциональный

Значение сразу после создания нового блока. Без него — пустая строка, 0, false или [] в зависимости от типа. Для repeater — массив элементов; для select с multiple — массив value.

placeholderопциональный

Серая подсказка в пустом поле ввода. Работает для text, textarea, email, url.

Выбор значений

optionsselect, radio

Статический список вариантов. value пишется в props, label видит пользователь. disabled: true — опция отображается, но недоступна для выбора.

multipleselect, image, file

Несколько значений вместо одного: в select — массив value, в image/file — несколько загрузок. У Поле - выбор из API (api-select) множественный режим задаётся в apiSelectConfig.multiple, не здесь.

optionsFromselect

Опции строятся из значения другого поля — для зависимых списков (страна → город) без ручного дублирования options. source — имя поля-источника, when — условие, map(item, index, sourceArray, context?) — преобразование в options; context содержит formData, itemData (текущий item repeater), ownerItemData (родительский item). exclude: { from: 'ownerRepeaterItem', field: 'id' } — исключить значение из options (удобно в nested repeater). Статический options остаётся fallback.

Валидация и видимость

rulesопциональный

Проверки перед сохранением. Ошибки показываются в футере модалки. У каждого правила опциональный message — иначе используется текст по умолчанию.

  • required — поле не пустое
  • minLength / maxLength — длина строки (value — число)
  • min / max — диапазон для number
  • pattern — регулярное выражение (value — строка regex)
  • email / url — формат адреса
  • custom — validator: (value) => boolean

dependsOnопциональный

Поле видно только когда другое поле совпадает с условием. Скрытые поля не валидируются и не мешают сохранению. Подробнее — Поле - условное отображение (dependsOn).

persistопциональный, по умолчанию true

false — поле участвует в форме, но не попадает в block.props при save. Нужно для служебных UI: кнопка импорта, переключатели настройки формы. У file-import persist выключен по умолчанию. Работает и внутри repeater.

Конфиги по типам поля

Дополнительные объекты — только когда стандартных параметров недостаточно:

spacingConfig / spacingOptions

Отступы блока (padding/margin) по брекпоинтам. spacingOptions на уровне конфига типа блока добавляет поле автоматически; spacingConfig — при ручном type: "spacing". См. Поле - отступы (spacing).

repeaterConfig

Структура массива однотипных элементов: вложенные fields, лимиты min/max, подписи кнопок. См. Поле - повторитель (repeater).

fileUploadConfig

POST файла на ваш сервер (uploadUrl, responseMapper) вместо хранения base64 в props. Для Поле - изображение (image) и Поле - файл (file).

fileImportConfig

Загрузка файла как действие: ответ API сливается в другие поля формы через merge (append/replace, dedupe). Само поле в props не сохраняется.

blockAnchorConfig

Выбор якоря #block-id или произвольного URL в форме. Скролл и клик — в вашем компоненте блока. См. Поле - якорь (block-anchor).

matrixTableConfig

Настройки редактора таблицы (подписи вкладок, лимит размера картинок в ячейках). См. Поле - таблица (matrix-table).

apiSelectConfig

URL API, параметры поиска/пагинации, маппинг ответа. См. Поле - выбор из API (api-select).

customFieldConfig

rendererId — id зарегистрированного рендерера; options — произвольные настройки, доступные в context.options. См. Кастомные рендереры полей.

Поле - список (select)

  • Без multiple в props — одно value из options
  • С multiple: true — массив value; defaultValue тоже массив (или [])

Динамические options (optionsFrom)

Поле - отступы (spacing)

Отступы блока по брекпоинтам. Удобнее подключать через spacingOptions в конфиге типа блока, чем полем spacing в fields.

Явное поле type: "spacing" в fields игнорируется, если задано spacingOptions. Отступы в UI: margin на обёртку блока, padding — CSS-переменные --spacing-padding-* в вашем компоненте.

Поле - повторитель (repeater)

Массив однотипных элементов — карточки, слайды, строки списка. Вложенные репитеры поддерживаются (maxNestingDepth, по умолчанию 2). Элементы сворачиваются в accordion: chevron и клик по заголовку toggles (aria-expanded).

repeaterConfig.fields — любые типы кроме spacing. min без явного значения: 1 при required, иначе 0. countLabelVariants — склонение счётчика («1 элемент», «2 элемента»). defaultExpandFirstOnly (default true) — при открытии формы развёрнут только первый item; false — все развёрнуты, как раньше.

Вложенный repeater

Поле - изображение (image)

Загрузка с preview. В props — URL строкой или объект src, width, height, size после серверной загрузки. Base64 только для разработки; в продакшене — fileUploadConfig.uploadUrl.

Важно: при uploadUrl ответ сервера для image должен содержать src с URL. Другой формат API — responseMapper в fileUploadConfig. Поле - файл (file)

Поле - файл (file)

Загрузка документов и произвольных файлов. Список имён в форме, без превью как у image. В props — URL строкой или массив URL при multiple: true.

Поле - якорь (block-anchor)

Выбор блока страницы (#block-id) или произвольного URL. Скролл и поведение ссылки — в вашем компоненте блока; форма только сохраняет значение.

Пример скролла к блоку

Целевой блок должен иметь data-block-id (BlockBuilder выставляет при рендере):

Поле - таблица (matrix-table)

Редактор таблицы: колонки и строки, типы ячеек (default, HTML, image). Вкладки «Структура» и «Строки» поддерживают collapse (chevron / клик по заголовку). В props — { tableHead, tableBody }.

Поле - выбор из API (api-select)

Поиск и пагинация по внешнему API. «Загрузить ещё» — при hasMore: true в ответе.

Ожидаемый формат ответа:

Другой формат — responseMapper или dataPath. Множественный выбор — apiSelectConfig.multiple.

Поле - условное отображение (dependsOn)

Поле показывается, если другое поле совпадает с условием. Скрытые поля не валидируются.

Внутри repeater

dependsOn.field ссылается на поле того же элемента репитера.

Кастомные рендереры полей

Поле type: "custom" — когда стандартных типов из раздела Стандартные типы полей недостаточно: свой виджет, интеграция библиотеки, сложный интерактив. Это не отдельный тип блока и не замена компонента блока на канвасе — только UI поля в модалке create/edit.

Когда нужен custom

  • Рейтинг, color picker, карта координат, редактор кода
  • Данные из вашего API внутри одного поля (не путать с Поле - выбор из API (api-select))
  • Сначала проверьте select, repeater, matrix-table — часто хватает без custom

Цепочка: конфиг → регистрация → форма

  1. Класс с ICustomFieldRenderer (уникальный id)
  2. Регистрация в реестре до первого открытия формы
  3. В fields — type: "custom" и customFieldConfig.rendererId

ICustomFieldRenderer и контекст

formScope.setField — изменить другое поле формы (например, сбросить зависимое). В repeater доступны formScope.repeater.updateItemField и live-ссылка на item. setError на результате вызывается фреймворком при смене текста ошибки — не дублируйте лишние перерисовки.

Регистрация

Core / свой UI:

Vue / React — отдельный реестр, проп customFieldRendererRegistry у BlockBuilderComponent:

Важно: регистрируйте рендереры до первого открытия формы. При внешних библиотеках храните инстанс локально в render(), не в свойстве класса; инициализируйте синхронно — без setTimeout. Регистрация

Пример: star-rating

customFieldConfig

  • rendererId — совпадает с ICustomFieldRenderer.id
  • options — произвольный объект, доступен в context.options

API реестра: registerCustomFieldRenderer, registerCustomFieldRenderers, getCustomFieldRenderer, hasCustomFieldRenderer, unregisterCustomFieldRenderer, getAllCustomFieldRenderers — см. /docs/core/methods. В repeater храните DOM/инстанс виджета локально в render(), в destroy снимайте слушатели. Живые примеры — examples/vue3, examples/api-usage.