
- MODX 3
- PHP 8.2
- Vue 3


Result: one page with a first screen, a row of subcategories, a product grid, a list of posts, two questions, and a form. The draft is not public. The resource Save button publishes the page. The Sections tab has no separate Publish button.
A page without a shop uses Free sections: Landing.
[[!PageBuilder]].requires: ["pro", "minishop3"]). The list needs capability datasources.hero, categories_row, products_grid, dynamic_list, faq, contact_form.published_json.Hero. Title Catalog. Button label Browse categories, Button URL pointing at the category page. Alignment left. The button renders only when both the label and the URL are set.
categories_row. Parent category 101 (example). Children must be msCategory resources. Limit 6. An empty limit becomes 8 in the chunk. No subcategories: lexicon pagebuilder_fe_listing_empty_category ("No subcategories in this category.").
products_grid. Catalog root 101 (example). The field is required. Limit 6. An empty limit becomes 12 in the chunk. Sort price_asc or popular. An unknown value sorts as menuindex. An empty category: pagebuilder_fe_listing_empty_products ("No products in this category yet."). The section has "cacheable": false.
dynamic_list. Provider modx-resources. Filter parent, operator eq, value 5 (parent id, an example). Sort by publishedon, direction desc. Query limit is at most 100. The chunk receives items and total. An empty result: pagebuilder_fe_list_empty.
FAQ. Title Delivery. Two repeater rows: question and answer.
contact_form. Form key shop_question. In Form fields, two rows: email of type email and phone of type phone. Field name: [a-z][a-z0-9_]*.
Subcategories are msCategory children of the parent you picked. Product cards show a photo, a price, and an Add to cart button. A newly published child resource shows up in the list without editing the section JSON. The form submits through FetchIt. Without FetchIt the section prints pagebuilder_fe_form_unavailable.
Move the section to the page trash. The draft stays.