Templating in Craft using Twig can, at first, be a little confusing. If you, like me, come from other systems that have a proprietary template tag system, then it might take a little time to wrap your head around how Craft and Twig work.
Templating in Craft using Twig can, at first, be a little confusing. If you, like me, come from other systems that have a proprietary template tag system, then it might take a little time to wrap your head around how Craft and Twig work.
But once we learn about the different types of tags things will be clearer and you’ll discover the power of using Twig in Craft. This tutorial will give you the direction and guidance you need to get started.
Let’s jump right in.
There are three tag types in Twig and Craft:
You will always use the first two in your Craft templates. The third, comment tags, are optional but a handy way of documenting anything that isn’t obvious by reading the code.
Statement or logic tags use the curly brace plus percent sign delimiter. In Twig and Craft they can come in multiple forms.
Some are just a single tag, like this Craft-specific Twig tag:
{% requireLogin %}
which you would put at the top of a template in Craft to require a logged-in state. If a visitor is not logged in than Craft will automatically redirect them to the log-in page.
Other logic tags take parameters, like the redirect
tag in Craft:
{% redirect "about/tos" %}
The redirect
tag takes one parameter, which is the URL or path to where you want to redirect the visitor. This is a tag specific to Craft but there are some Twig tags you should know, too.
Another type of tag is one that has an opening and closing tag, like the for
tag in Craft.
{% for %}
{% endfor %}
The tag pairs have an opening tag and a closing tag. The closing tag will typically have an “end” prefix, like endfor
, endpaginate
, and endblock
.
Even the set
tag we use to set a variable can be used as a tag pair. The simple version looks like this:
{% set author = "Ryan Irelan" %}
But using a tag pair for set
, you can assign a block of text to a variable. Here we’re setting the variable socialLinks
to an unordered list of social network links:
{% set socialLinks %}
<ul class="social">
<li class="twitter"><a href="">Twitter</a></li>
<li class="facebook"><a href="">Facebook</a></li>
<li class="googleplus"><a href="">Google+</a></li>
</ul>
{% endset %}
Another example of a tag pair — and by far your most used tag while writing Twig template code for Craft — is the for
-loop. It’s how you will loop through and display section entries in your templates and output other lists, like categories.
This is a for
-loop to display content from an array of blog posts:
{% for entry in craft.entries.section('blog') %}
{{ entry.body }}
{% endfor %}
It uses the curly brace plus percent sign delimiter for both the opening and closing tags of the for
-loop. This delimiter tells Twig that what’s between needs to be executed as a statement (in this case a for
-loop).
The code with the double curly braces are output tags. They print variable contents to the screen (i.e. output content in your template).
{{ author }}
The author variable would output my name (because we set it in the previous example).
If you want to use an output tag to pass in data to another tag, like when we set a variable in Twig, then you don’t need to use the double curly braces.
{% set name = author %}
If we printed out the value of the name
variable we just set than it would render:
Ryan Irelan
But output tags can generate the output on the fly and then print it to the screen. How about a little math?
{{ 4 * 4 }}
This output tag will do the multiplication of 4 and 4 and print out the product. I’m unsure how practical it is to do math like this in the template but there you have it.
The Twig documentation calls out that the curly braces are not part of the variable itself but instead an indicator that the value of the variable contained within should printed to the screen.
This tag type is straight-forward but perfect for adding comments to your templates but not have those comments render in the page source like HTML comments would.
{# Begin logic for sidebar #}
Using a single opening curly brace paired with a pound sign, we can create the un-rendered comments. They’ll always be available in your template file but never rendered by Twig.
Any code that is inside the comment tag will not be executed by Twig.
{# removing this for now to debug
{% for entry in entries %}
{{ entry.body }}
{% endfor %}
#}
There’s a lot more to templating with Twig in Craft but this introduction to three different tags will get you set off in the right direction.