How do I display content blocks on the storefront?

The structure of the views for the block items is shown below. If you are creating your own theme or custom storefront, you must ensure these files are present in order for the content blocks to display correctly.

└─ resources
    └─ views
        └─ blocks
            └─ html.twig
            └─ image.twig
            └─ link.twig
            └─ menu.twig
            └─ text.twig

 

A single block item

To show a single block item, use the block's key:

{{ block_item('product-page.confidence-builder') }}

This will show the first available block item in the block. To show a different block item, provide the position as the second parameter:

{% if block_exists('homepage.brand-heroes') %}
    <div class="flex w-full flex-wrap">
        <div class="w-full md:w-1/2">
            {{ block_item('homepage.brand-heroes', 0) }}
        </div>
        <div class="w-full md:w-1/2">
            {{ block_item('homepage.brand-heroes', 1) }}
        </div>
    </div>
{% endif %}

 

Passing data to block items

In some cases, a block item may need data to be passed from the theme. This is especially useful for themes, which dictate the image dimensions.

{{ block_item('listings.loyalty-banner', 0, {
    sizes: {
        small: { width: 400, height: 200 },
        medium: { width: 600, height: 260 },
        large: { width: 1024, height: 300 },
    },
    options: ['contain', {quality: 90}],
}) }}

 

A collection of block items

To show all block items in a content block:

{{ block_items('product-page.confidence-builders') }}

Should you need to limit the number of items returned in the collection, pass a limit as the second parameter:

{{ block_items('product-page.confidence-builders', 3) }}

If the block items need to be wrapped in elements to style their position, the following approach can be used:

{% if block_exists('homepage.main-hero') %}
    {% set main_hero = block_items('homepage.main-hero', null, {
        sizes: {
            small: { width: 360, height: 360 },
            medium: { width: 660, height: 560 },
            large: { width: 1280, height: 600 }
        }
    }) %}
    <div class="flex w-full flex-wrap">
        {% for hero in main_hero %}
            <div class="w-full">{{ hero | raw }}</div>
        {% endfor %}
    </div>
{% endif %}

 

Remember to use the raw filter to ensure the block item HTML isn't escaped.

Articles in this section

Was this article helpful?
0 out of 0 found this helpful