
- MODX 3
- PHP 8.2
- Vue 3


Страница для тех, кто добавляет свои секции, расширяет Pro или вызывает connector из своего кода.
| Тема | Страницы |
|---|---|
| Поля инспектора | Обзор, справочник 62 типов |
| Встроенные секции | Каталог секций |
| Стили и BEM | Дизайн-система |
| Headless JSON | Public API |
| Артефакт | Путь / имя |
|---|---|
| JSON | core/components/pagebuilder/sections/{key}.json |
| Chunk | core/components/pagebuilder/elements/chunks/pagebuilder_{key}.tpl |
| BEM-блок | pb-{key} |
Минимальный JSON:
{
"key": "promo",
"version": 1,
"label": "Promo",
"category": "conversion",
"chunk": "pagebuilder_promo",
"fields": [
{"name": "title", "type": "text", "label": "Title", "required": true}
]
}Секции с category: dev или ключом с _ не попадают в production-каталог.
JSON: pagebuilderpro/sections/. Chunk: pagebuilderpro_{key}. По умолчанию "requires": ["pro"]. Commerce: "requires": ["pro", "minishop3"].
Таблица pb_section_types. Processors mgr/sectiontype/*. Определения из кода пакета при upgrade не перезаписываются.
В диалоге типа (CMP Blocks) вкладка Доступность. Пустые списки значат «везде». Ограничение действует на каталог кнопки Создать. Уже поставленная секция не скрывается.
Поля: Шаблоны, Родительские ресурсы, Ресурсы, Контексты.
"availability": {
"templates": [4, 7],
"parents": [10],
"resources": [100],
"contexts": ["web", "en"]
}"requires": ["pro", "minishop3"]Проверка: SectionRequirementChecker и событие pbOnCheckSectionRequirement.
Регистрация из plugin:
<?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.
У типа может быть несколько категорий: массив 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_types | UI-определения типов (definition_json) |
pb_data_tables / pb_data_table_rows | Табличные данные ресурса |
pb_utm_params | Реестр UTM в панели управления |
pb_collections / pb_collection_tabs | Collections |
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/*.
Формат документа страницы:
{
"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 и при ошибках рендера.
/** @var \PageBuilder\PageBuilder $pb */
$pb = $modx->services->get('pagebuilder');
// или: $modx->services->get(\PageBuilder\PageBuilder::class);
$pageService = $pb->pages();
// PageService: load/save/publish через тот же слой, что и connectorPlugin на pbOnRegisterFeatureProviders регистрирует свой FeatureProvider рядом с ProFeatureProvider. У провайдера должны быть serverContributions() и cmpContributions(). Free и Pro этой линии ставьте вместе.
События boot, save и render: Менеджер и события.
В pbOnBeforeSave расширения могут заменить документ до записи черновика или публикации через PageDocumentBag. DocumentChangeSet отдельно фиксирует enable/disable секции (без ложного «update» при чистом тумблере).
Read-only JSON для внешнего фронта. Точка входа assets/components/pagebuilder/api.php. Включение и ключи: Public API и настройки.
Запись и черновики: Agent API (Pro) или вкладка Секции в менеджере.
| Файл | Назначение |
|---|---|
pagebuilder-api.js | PageBuilderApi: POST к connector из своего UI менеджера |
pb-fetch-lite.js | Минимальный POST без Vue |
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}}. Подробнее: обзор полей.