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

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