Skip to content
PageBuilder
Визуальный конструктор секций для MODX 3: черновик и публикация без перезаписи content ресурса
  1. Компоненты
  2. PageBuilder
  3. Разработчик

Разработчик

Страница для тех, кто добавляет свои секции, расширяет Pro или вызывает connector из своего кода.

Справочники

ТемаСтраницы
Поля инспектораОбзор, справочник 50 типов
Встроенные секцииКаталог секций
Стили и BEMДизайн-система
Headless JSONPublic API

Определение секции

Секции в коде (Free)

АртефактПуть / имя
JSONcore/components/pagebuilder/sections/{key}.json
Chunkcore/components/pagebuilder/elements/chunks/pagebuilder_{key}.tpl
BEM-блокpb-{key}

Минимальный JSON:

json
{
  "key": "promo",
  "version": 1,
  "label": "Promo",
  "category": "conversion",
  "chunk": "pagebuilder_promo",
  "fields": [
    {"name": "title", "type": "text", "label": "Title", "required": true}
  ]
}

Секции с category: dev или ключом с _ не попадают в production-каталог.

Pro-секции

JSON: pagebuilderpro/sections/. Chunk: pagebuilderpro_{key}. По умолчанию "requires": ["pro"]. Commerce: "requires": ["pro", "minishop3"].

UI-типы в панели управления

Таблица pb_section_types. Processors mgr/sectiontype/*. Определения из кода пакета при upgrade не перезаписываются.

Доступность и requires

json
"availability": {
  "templates": [4, 7],
  "parents": [10],
  "resources": [100],
  "contexts": ["web", "en"]
}
json
"requires": ["pro", "minishop3"]

Проверка: SectionRequirementChecker и событие pbOnCheckSectionRequirement.

Регистрация из plugin:

php
<?php
switch ($modx->event->name) {
    case 'pbOnRegisterSectionDefinitions':
        /** @var \PageBuilder\Section\SectionRegistry $registry */
        $registry = $modx->event->params['registry'];
        $registry->registerFromFile($modx->getOption('core_path') . 'components/mypackage/sections/custom.json');
        break;
}

Chunk стройте по дизайн-системе: оболочка pb-section, escape текста, partial pagebuilder_partial_image.

Модель данных

Таблицы

ТаблицаНазначение
pb_pagesОтдельная запись: черновик и опубликованный JSON по resource_id (revision, published_revision, метаданные публикации)
pb_section_typesUI-определения типов (definition_json)
pb_data_tables / pb_data_table_rowsТабличные данные ресурса
pb_utm_paramsРеестр UTM в панели управления
pb_collections / pb_collection_tabsCollections
pb_basket_itemsИндекс глобальной корзины
pb_user_statesЗарезервировано: схема есть, в runtime пока не используется

Pro: pb_library_items, pb_revisions, pb_section_events.

JSON документа

Формат документа страницы:

json
{
  "schemaVersion": 1,
  "sections": [
    {
      "id": "uuid",
      "type": "hero",
      "enabled": true,
      "data": { "title": "Hello" },
      "settings": { "contexts": ["web"] }
    }
  ],
  "trash": []
}

revision задаёт оптимистичную блокировку: клиент передаёт текущий номер, сервер сравнивает. При расхождении ответ revision_conflict.

Кеш рендера

Раздел кеша: pagebuilder/{resourceId}. Сбрасывается при publish и unpublish. Кеш не используется при проверке видимости по UTM во время запроса, при use_cache=0 и при ошибках рендера.

PHP-сервис

php
/** @var \PageBuilder\PageBuilder $pb */
$pb = $modx->services->get('pagebuilder');
// или: $modx->services->get(\PageBuilder\PageBuilder::class);

$pageService = $pb->pages();
// PageService: load/save/publish через тот же слой, что и connector

Расширения Pro

Plugin на pbOnRegisterFeatureProviders регистрирует свой FeatureProvider рядом с ProFeatureProvider.

События boot, save и render: Менеджер и события.

Public API (Headless)

Read-only JSON для внешнего фронта. Точка входа assets/components/pagebuilder/api.php. Включение и ключи: Public API и настройки.

Запись и черновики: Agent API (Pro) или вкладка Секции в менеджере.

JavaScript API

ФайлНазначение
pagebuilder-api.jsPageBuilderApi: POST к connector из своего UI менеджера
pb-fetch-lite.jsМинимальный POST без Vue
js
import { PageBuilderApi } from '/assets/components/pagebuilder/js/pagebuilder-api.js'

const api = new PageBuilderApi({
  baseUrl: '/assets/components/pagebuilder/connector.php',
  modAuth: MODx.siteId,
})
await api.post('mgr/catalog/list', { resource_id: 42 })

Для агентов и массовой записи секций используйте Agent API.

Таблицы данных ресурса

Процессоры:

ProcessorНазначение
mgr/datatable/listТаблицы ресурса
mgr/datatable/rows/listСтроки: search, page, limit, filters
mgr/datatable/rows/save / removeСоздание, изменение и удаление строк

Фильтры JSON: { "price": { "op": "gte", "value": "10" } }. Операторы: eq, contains, in, gte, lte, between, empty, not_empty.

Вкладка «Таблицы» или тип вкладки table в Collections. На сайте выводят строки через сниппет PageBuilderTableRows.

Инспектор

Поля data берутся из JSON типа. Settings: contexts, utm, в Pro ещё conditions. В полях url и button работают плейсхолдеры {{utm:key}}. Подробнее: обзор полей.

Связанные страницы