
PageBuilder
Visual section builder for MODX 3: draft and publish without overwriting resource content
- MODX 3
- PHP 8.2
- Vue 3


Same data as Products grid, in a carousel. Fits narrow layouts with many SKUs.

Информация
Requires PageBuilder Pro and miniShop3.
Category and limit like the grid. Autoplay and section JS on the front end. The type is marked "cacheable": false.
| Parameter | Value |
|---|---|
| key | products_carousel |
| Layer | Pro |
| Category | Commerce (commerce) |
| Chunk | pagebuilderpro_products_carousel |
| Requires | pro, minishop3 |
Field types: field types reference.
title) Type text. Optional.
parent) Type relation. Required. Pick one MODX resource in a search modal.
limit) Type number. Optional.
autoplay) Type yesno. Optional. Yes/no toggle. When autoplay is on, the site shows a pause button. Labels: pagebuilder_fe_carousel_pause and pagebuilder_fe_carousel_play.
sortby) Type select. Optional. Dropdown with predefined options.
pb-products-carousel via msProducts.
Example payload after save:
{
"title": "Section title",
"parent": 101,
"limit": 6,
"autoplay": false,
"sortby": "menuindex"
}Fenom chunk pagebuilderpro_products_carousel:
{set $catalogParent = $parent.id|default:($parent_id|default:0)}
{set $listing = ''}
{if $catalogParent}
{set $listing = $modx->runSnippet('msProducts', [
'parents' => $catalogParent,
'depth' => 10,
'limit' => $limit|default:8,
'tpl' => 'pagebuilderpro_ms3_product_carousel_slide',
'includeVendorFields' => '*',
'includeOptions' => 'color,size',
'withCurrency' => 1,
'showZeroPrice' => 1,
'sortby' => $ms_sortby|default:'msProduct.menuindex',
'sortdir' => $ms_sortdir|default:'ASC'
])}
{/if}
<section
class="pb-section pb-section--products-carousel pb-products-carousel pb-listing pb-listing--carousel{if $cssClass} {$cssClass|escape}{/if}"
data-pb-section="products_carousel"
data-pb-carousel
data-pb-autoplay="{$autoplay|default:0}"
{if $id} id="pb-{$id|escape}"{/if}
>
<div class="pb-section__inner">
{if $title}
<h2 class="pb-heading">{$title|escape}</h2>
{/if}
{if $listing}
<div class="pb-carousel__viewport" tabindex="0" role="region" aria-roledescription="carousel" aria-label="{$title|default:('pagebuilder_fe_carousel_products' | lexicon)|escape}">
<div class="pb-carousel__track">
{$listing}
</div>
<div class="pb-carousel__controls">
<button type="button" class="pb-carousel__btn" data-pb-carousel-prev aria-label="{'pagebuilder_fe_carousel_prev' | lexicon}">‹</button>
<button type="button" class="pb-carousel__btn" data-pb-carousel-next aria-label="{'pagebuilder_fe_carousel_next' | lexicon}">›</button>
</div>
<button
type="button"
class="pb-carousel__pause"
data-pb-carousel-pause
hidden
aria-pressed="false"
data-label-pause="{'pagebuilder_fe_carousel_pause' | lexicon}"
data-label-play="{'pagebuilder_fe_carousel_play' | lexicon}"
>{'pagebuilder_fe_carousel_pause' | lexicon}</button>
</div>
{else}
<p class="pb-listing__empty">{'pagebuilder_fe_listing_empty_carousel' | lexicon}</p>
{/if}
</div>
</section>