Skip to content

Nested Boxes

For more complex layouts, it can be useful to nest Boxes in each other.

Enable nested Boxes

To allow nested Boxes, add the children: true value to the Box config.

yaml
handle: container-with-nesting
name: Container
children: true # add this

An "Add child to this Box" action will now appear in the Boxes editor if you use this Box.

Allow only specific Boxes to be added as children

In certain use-cases, you don't want a Box to have any other Box as a child.

You can set the children property to an array of Contexts. The Boxes Editor will only show partials with this context in the selection Modal now when adding a child.

yaml
# parent.yaml
handle: only-allow-special-children
children:
- special-children

The configuration above would only allow Boxes as children that are configured like this:

yaml
# child.yaml
handle: special-child-partial
contexts:
- special-children # this matches the "children" from the parent

Render nested Boxes

Call the box.renderChildren(context) method in your partial to render all child Boxes.

twig
{# container.htm #}
<div class="container">
    {{ box.renderChildren(context) | raw }}
</div>

Controlling the loop output

If you need to add special markup around each Box, it is also possible to render the children manually. The renderMergeContext method has to be used to pass in the new loop variable to the rendered child Box.

twig
<div class="container">
    {% for child in box.children %}
        <div class="child">
            {{ child.renderMergeContext(context, { loop: loop }) | raw }}
        </div>
    {% endfor %}
</div>

Rendering a single child

Using the box.renderChild() method, you can render a single child Box. The second argument is the index of the Box (0 = the first child Box).

twig
<div class="container">
    <div class="first-box">
        {{ box.renderChild(context, 0) | raw }}
    </div>
    <div class="second-box">
        {{ box.renderChild(context, 1) | raw }}
    </div>
</div>