Created
April 22, 2015 17:35
-
-
Save alexroper/29f11880e0b31536caf5 to your computer and use it in GitHub Desktop.
Slideshow with mixed matrix blocks in Craft CMS
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
{# | |
# Example of building a slideshow in Craft from adjacent matrix blocks. | |
# | |
# This is a technique for getting around the problem of not being able to nest | |
# matrix fields. Say you're using a matrix field for your 'article-body' | |
# that has rich-text fields, headings, photos with captions, and slideshows | |
# all mixed together as different blocks. The slideshow is created by just placing | |
# single slideshow images (with captions) next to each other in the matrix. | |
# | |
# For example: | |
# | |
# - heading | |
# - text | |
# - slideshowImage | |
# - slideshowImage | |
# - slideshowImage | |
# - text | |
# | |
# It works by testing for the previous and next matrix block type. | |
# Adjacent blocks with the same type of 'slideshowImage' get combined into | |
# a single slideshow wrapper (with the class 'bxslider' since I'm using | |
# the bxSlider jQuery plugin). | |
# | |
# The idea for prevType and nextType variables is taken from the Happy Lager | |
# demo site created by Pixel and Tonic: | |
# https://github.com/pixelandtonic/HappyLager/blob/master/craft/templates/_includes/article_body.html | |
# | |
# I know that you _could_ accomplish this by creating a single slideshow block as a list | |
# of related assets and each asset entry could have a "caption" field. But, this is | |
# more flexible because the caption can be specific to the context it's placed in (the article), | |
# not just side wide. | |
# | |
-#} | |
{% set prevType = null %} | |
{% set nextType = null %} | |
{% for block in entry.articleBody %} | |
{% set type = (nextType ?: block.type.handle) %} | |
{% set nextType = (not loop.last ? block.next().type.handle) %} | |
{% switch type %} | |
{% case 'text' %} | |
{{ block.text }} | |
{% case 'slideshowImage' %} | |
{% if prevType != 'slideshowImage' %} | |
<div class="bxslider"> | |
{% endif %} | |
{% set asset = block.image.first() %} | |
{% if asset %} | |
<figure class="bxslider-item"> | |
<img src="{{ asset.url }}"> | |
<figcaption> | |
{% if block.caption %} | |
{{ block.caption }}<br> | |
{% endif %} | |
</figcaption> | |
</figure> | |
{% endif %} | |
{% if nextType != 'slideshowImage' %} | |
</div> | |
{% endif %} | |
{% endswitch %} | |
{% set prevType = type %} | |
{% endfor %} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment