
- MODX 3
- PHP 8.2
- Vue 3



Компонент в менеджере: Компоненты → PageBuilder (namespace pagebuilder, controller index).
В панели управления:
pagebuilder_manage_types): UI-типы, скрытие и восстановление встроенных JSON-типовbasket): глобальная корзина удалённых секций и строк таблицpagebuilder_collections_*Редактор на форме ресурса и в панели управления использует один Vue-бандл через VueTools. Точка входа API менеджера:
assets/components/pagebuilder/connector.php
Основная запись страницы: таблица pb_pages (префикс modx_pb_).
| Поле | Назначение |
|---|---|
resource_id | Связь с modResource |
draft_json | Черновик документа секций |
published_json | Опубликованная версия |
revision | Номер ревизии черновика (optimistic locking) |
published_revision | Ревизия последней публикации |
publishedon / publishedby | Время и пользователь публикации |
editedon / editedby | Последнее изменение черновика |
modResource.content PageBuilder не перезаписывает. SEO-поля ресурса (pagetitle, description) используются как обычно.
Корзина на странице хранит удалённые секции в document.trash. При сохранении черновика плагин синхронизирует индекс pb_basket_items. Отдельного события pbOn* для корзины нет: плагин на pbOnAfterSave может читать record.draft.trash. Глобальное восстановление и окончательное удаление выполняют действия connector Pro (mgr/basket/*).
Табличные данные ресурса хранятся в отдельных таблицах pb_* (вкладка «Таблицы»).
Дополнение pagebuilderpro добавляет общие блоки, версии, примеры в каталоге, поля по breakpoints, 27 расширенных типов полей, глобальную корзину в панели управления и Agent API.
Подробно: PageBuilder Pro. Секции витрины требуют miniShop3.
При установке дополнение регистрирует 20 событий pbOn* в MODX. Подпишите плагин в Система → События или используйте статический плагин из состава пакета.
Исключение: pbOnBeforeTableGetList и pbOnTableRowSave установщик не создаёт. Если нужны хуки табличных данных, добавьте события вручную и подпишите плагин.
| Событие | Данные |
|---|---|
pbOnRegisterSectionDefinitions | registry: SectionRegistry, добавление своих типов |
pbOnRegisterFeatureProviders | registry: FeatureProviderRegistry |
| Событие | Когда | Данные |
|---|---|---|
pbOnBeforeSave | Перед записью черновика | resourceId, document, documentBag, revision, userId, mode=draft, changes |
pbOnAfterSave | После записи черновика | resourceId, record, userId, mode=draft, changes |
pbOnBeforePublish | Перед публикацией | resourceId, document, revision, userId |
pbOnAfterPublish | После публикации | resourceId, record, userId |
pbOnBeforeUnpublish | Перед снятием | resourceId, record, revision, userId |
pbOnAfterUnpublish | После снятия | resourceId, record, userId |
pbOnBeforeTrash | Перед корзиной, только если есть удалённые секции | resourceId, sectionIds, document, userId |
pbOnAfterTrash | После записи черновика с теми же id | resourceId, sectionIds, record, userId |
documentBag это PageDocumentBag. Слушатель подменяет документ до saveDraft. changes это массив DocumentChangeSet: addedSectionIds, removedSectionIds, trashedSectionIds, restoredSectionIds, updatedSectionIds, enabledSectionIds, disabledSectionIds. События trash идут из того же saveDraft, отдельного действия корзины нет.
| Событие | Данные |
|---|---|
pbOnBeforeCopySections | sourceResourceId, targetResourceId, userId |
pbOnAfterCopySections | + record |
| Событие | Данные |
|---|---|
pbOnBeforeGetList | resourceContext |
pbOnAfterGetList | resourceContext, items, result (FieldValuesBag, ключ items) |
pbOnFieldValues | В каталоге: resourceContext, fieldValues. В mgr/field/options: field, fieldValues |
pbOnCheckSectionRequirement | requirement, result (FieldValuesBag, ключ satisfied) |
pbOnCheckSectionVisibility | section, conditions, result (FieldValuesBag, ключ visible) |
Ручная регистрация
События ниже не регистрируются при установке. Добавьте их в Система → События, если плагин должен на них реагировать.
| Событие | Данные |
|---|---|
pbOnBeforeTableGetList | table, query, criteria по ссылке |
pbOnTableRowSave | table, data по ссылке, row_id |
| Событие | Данные |
|---|---|
pbOnBeforeRenderDocument | resourceId, document, pipeline, options |
pbOnBeforeRenderSection | resourceId, pipeline с одной секцией, index, options |
pbOnGetValues | resourceId, document, values (SectionValuesBag). Сниппет при return_values=1 и Public API, если в include есть values |
Пример регистрации секции в плагине:
<?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;
}Свои JSON-определения должны соответствовать схеме встроенных секций: поля, chunk, category.
Редактор пишет черновик через connector, публикация копирует snapshot в published_json, сниппет на сайте читает только опубликованную версию.