Создание пользовательского блока отображения
В NocoBase блок — это область содержимого на странице. Этот пример показывает, как с помощью BlockModel создать простейший пользовательский блок — поддерживающий редактирование HTML-содержимого в интерфейсе. Пользователь может через панель конфигурации изменять отображаемое содержимое блока.
Это первый пример, затрагивающий FlowEngine — будут использованы BlockModel, renderComponent, registerFlow и uiSchema.
Рекомендуется сначала ознакомиться со следующим — это упростит разработку:
- Написание первого плагина — создание плагина и структура каталогов
- Plugin (Плагин) — точка входа плагина и жизненный цикл
load() - Обзор FlowEngine — FlowModel, renderComponent, базовое использование registerFlow
- i18n Интернационализация — формат файлов перевода и использование
tExpr()для отложенного перевода
Конечный результат
Мы делаем блок «Simple block»:
- Появляется в меню «Добавить блок»
- Рендерит сконфигурированное пользователем HTML-содержимое
- Через панель конфигурации (registerFlow + uiSchema) позволяет пользователю редактировать HTML
Полный исходный код см. в @nocobase-example/plugin-simple-block. Если хотите запустить и посмотреть локально:
Ниже шаг за шагом построим этот плагин с нуля.
Шаг 1: создать каркас плагина
Выполните в корне репозитория:
Это сгенерирует базовую файловую структуру в packages/plugins/@my-project/plugin-simple-block. Подробное описание см. в Написание первого плагина.
Затем запустите режим разработки, чтобы изменения кода подхватывались горячей перезагрузкой: для проекта, созданного командой nb init, выполните nb source dev в корне проекта (<app-path>); для самостоятельно склонированного репозитория с исходным кодом NocoBase выполните yarn dev в корне исходников.
Шаг 2: создать модель блока
Создайте src/client-v2/models/SimpleBlockModel.tsx. Это ядро плагина — здесь определяется, как блок рендерится и как настраивается.
Несколько ключевых моментов:
renderComponent()— рендеринг UI блока, чтение HTML-содержимого черезthis.props.htmldefine()— установка отображаемого имени блока в меню «Добавить блок».tExpr()используется для отложенного перевода, потому чтоdefine()выполняется на этапе загрузки модуля, и в этот момент i18n ещё не инициализированregisterFlow()— добавление панели конфигурации.uiSchemaопределяет форму через JSON Schema (синтаксис см. в UI Schema),handlerзаписывает значения, заполненные пользователем, вctx.model.props, аrenderComponent()их читает
Шаг 3: добавить файлы локализации
Отредактируйте файлы перевода в src/locale/ плагина, добавьте переводы для всех ключей, использованных в tExpr():

