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

Разработчик

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

Справочники

ТемаСтраницы
Поля инспектораОбзор, справочник 62 типов
Встроенные секцииКаталог секций
Стили и 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

В диалоге типа (CMP Blocks) вкладка Доступность. Пустые списки значат «везде». Ограничение действует на каталог кнопки Создать. Уже поставленная секция не скрывается.

Поля: Шаблоны, Родительские ресурсы, Ресурсы, Контексты.

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.

Категории, JSON и кеш

У типа может быть несколько категорий: массив categories и совместимое поле category. Фильтры CMP показывают тип в каждом выбранном slug.

Во вкладке JSON редактора типа правят definition, включая nested fields у repeater, и применяют правку перед сохранением. В repeater кнопка Копировать элемент делает глубокую копию строки с новым _rowId.

Флаг типа cacheable по умолчанию true. Если на странице есть включённый тип с cacheable: false, HTML-кеш документа не пишется. Кнопка MODX Очистить кеш сбрасывает partition pagebuilder (OnSiteRefresh).

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

Таблицы

ТаблицаНазначение
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_section_events, pb_page_templates. Таблица pb_revisions может присутствовать в схеме Pro, но page-level UI версий страницы нет. Журнал секции: pb_section_events + mgr/sectionevents/*.

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. У провайдера должны быть serverContributions() и cmpContributions(). Free и Pro этой линии ставьте вместе.

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

В pbOnBeforeSave расширения могут заменить документ до записи черновика или публикации через PageDocumentBag. DocumentChangeSet отдельно фиксирует enable/disable секции (без ложного «update» при чистом тумблере).

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}}. Подробнее: обзор полей.

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