Configuration
Present → Settings, or config/present.php.
Show components in the cart
Default: on.
Whether craft.present.cartLineItems() includes the things inside a box. Present never hides a line
item from Commerce — the setting only tells your templates what to render. An order the merchant
cannot see in full is worse than a slightly noisy cart.
Enforce the stock rollup
Default: on.
Makes a bundle unavailable when its components cannot supply a single box. Off, the bundle stays purchasable and Commerce's own per-purchasable stock validation catches it at the line item instead — later, and with a worse message.
When a box in a cart comes apart
Default: put it back.
Boxes come apart in ordinary use: a cart template that lets a shopper delete any line item, an admin editing a quantity on the order screen, a component that has since been disabled. Present checks every group on every recalculation.
- Put it back the way it was — component quantities are reset from the container's, and a missing component is re-added from the stored selection.
- Remove the whole box and say why — the group goes, with an order notice explaining it.
Leaving it alone is not an option, because a half-priced half-box is the one outcome nobody wants.
Deleting the container always removes the whole box whatever this is set to: there is nothing left to repair the contents back into.
Register the builder's CSS and JS
Default: on.
Turn off if you are bundling present-builder.js through your own pipeline.
Money decimal places
Default: 2.
How finely a fixed bundle price is split across its components. Two is right for most currencies;
use 0 for yen or won, or the allocator produces prices with fractions no gateway will take.
Config file
<?php
return [
'showComponentsInCart' => true,
'enforceStockRollup' => true,
'brokenGroupBehavior' => 'repair', // or 'remove'
'registerBuilderAssets' => true,
'moneyDecimals' => 2,
];
Permissions
- Manage bundles — the bundles section and the element editor
- Use the configurator — the CP configurator (Pro)
Bundle types are admin-only and require allowAdminChanges, because they live in project config.