
- MODX 3
- PHP 8.2
- Vue 3


Components → PageBuilder (SectionTypesManager.vue). The CMP has no resource list. The editor opens on the resource Sections tab.
The Section models tab (id blocks) needs pagebuilder_manage_types. Pro tabs appear only with their own capability (utm, collections, basket, and others). Processors usually require pagebuilder_view. The permission is not granted to every manager automatically.
| Tab | Layer | Purpose |
|---|---|---|
| Section models | Free | UI builder for section types (pb_section_types), id blocks |
| Visibility rules | Pro | Global UTM parameter registry (pb_utm_params), capability utm, id utm |
| Workspaces | Pro | Resource form tab sets by template (pb_collections), capability collections |
| Archive | Pro | Global basket for deleted sections and table rows, id basket |
| Page templates | Pro | Empty section skeletons (pb_page_templates), capability page-templates |
| Forms | Pro | Schemas for form builder, capability forms |
| Bundle | Pro | Export and import of UI section types. Hidden in the current release (BUNDLE_ENABLED = false) |
| API tokens | Pro | Bearer tokens for REST API v1 |

Change section types in the CMP. You do not upload PHP. Built-in JSON from core/components/pagebuilder/sections/*.json can be edited, hidden, and restored in the catalog.
Filter by source (chips, choice persists in the browser):
| Chip | Shows |
|---|---|
| All | Package and custom types |
| From package | Types from package JSON (and their DB UI overrides) |
| Mine | Types created in the control panel |
Hide presets bulk-hides package types (published = 0 for UI overrides and custom; for code types hide still goes through lifecycle). Custom types remain. Sections on already built pages are unchanged.
On the type card, Catalog preview: upload a layout screenshot. In + Create on the resource it replaces the package schematic image.
With capability presets (Pro), the Blocks tab has Show examples in catalog toggle that writes pagebuilder_catalog_examples_enabled via mgr/config/save. Same value in system settings.
| Action | What happens |
|---|---|
| Override | Row in pb_section_types, flag overridesCode. DB wins at runtime |
| Hide | Type hidden in resource catalog, stays in control panel with "Hidden" badge |
| Delete (code type) | Tombstone removedCode in DB. Package JSON is not deleted |
| Restore | Enable "Show hidden" → Restore |
On package upgrade, pb_section_types rows are not overwritten: DB wins. User system settings are not reset either (update.settings = false). Sections on already published pages keep rendering.
Connector mgr/sectiontype/remove accepts POST parameter lifecycle: hide, remove, restore (not the connector action). Bulk hide passes array keys.
JSON schema details: Developer → Section definition.
Requires capability utm. Parameters for {{utm:key}} placeholders and default values.
Section visibility rules are set in the Visibility dialog on the resource inspector (settings.utm) when pagebuilder_inspector_visibility_enabled is on. Not on this tab. Already published visibility rules still run in Free.
Frontend UTM session: PageBuilderUtmSession before PageBuilder. Links: Snippets.
The control panel tab is labeled Workspaces. Requires PageBuilder Pro and capability collections. Without the capability the tabs are absent even when pagebuilder_collections_enabled = 1.
A collection binds to template_ids (empty list means all templates). When collections are on, the Tables tab is hidden. The Sections tab stays when the template has no row in pb_collections.
tab_type) | Type | Behavior on resource |
|---|---|
sections | Sections tab (Vue pagebuilder-resource) |
table | Resource table data (table_key optional) |
resources | Child resources |
empty | Placeholder (config.message) |
modx_collections | MODX Collections integration (pagebuilder_collections_modx_bridge_enabled) |
iframe | URL in <iframe> |
Collection CRUD and tab resolution for a template: mgr/collection/list, save, remove, resolve.
Settings: System settings → Collections.
Flag basket. Page basket in the resource draft remains in Free.
Index of sections from draft.trash[] and table rows on delete. Sync on pbOnAfterSave. On resource OnEmptyTrash, index rows for that resource_id are removed.
| Action | Purpose |
|---|---|
mgr/basket/list | List (item_type, pagination) |
mgr/basket/restore | Restore section or table row |
mgr/basket/purge | Remove the section from draft.trash and the index row. published_json is unchanged |
mgr/basket/restoreall / purgeall | Bulk ops on array ids |
| Where | What it does |
|---|---|
| Resource editor → Basket | On page: restore and permanent delete in draft (Free) |
| Control panel → Basket | Cross-resource: list, restore to source resource, permanent delete (Pro) |
Restore from the control panel inserts the section at settings._trashIndex, same as the page basket. After purge the section leaves the site only when you press Save on the resource.
Capability forms. On this tab you create a schema with a key and fields. For select and radio, fill Options: one line per choice, Label|value or value only. On the page, form builder selects that key. Submit goes through FetchIt and the PageBuilderFormBuilder snippet.
The server checks CSRF and the nospam honeypot. Email and webhook leave synchronously after commit, in the same HTTP request. Submissions are not stored. Form v1 does not accept a file. Processors: mgr/form/*.
The CMP tab is not shown (BUNDLE_ENABLED = false). mgr/bundle/* routes are not registered. A manager call returns Invalid action.
When the flag is turned on, export, dry-run, and import run in one transaction through UiSectionTypeService.
create, update, or conflict. A conflict is not imported.Bundle v1 does not include secrets, tokens, page content, table rows, forms, or datasources. Processors: mgr/bundle/*.
Capability api. A new token gets a name and scopes pages.read and catalog.read. The secret is shown once. System setting pagebuilder_rest_tokens keeps prefix and the hash.
A revoked token returns 401. Enable the transport with pagebuilder_rest_api_enabled. Routes: REST API v1. Processors: mgr/resttoken/*.