Conditionals: @if, @else, @elseif, @endif
Show one block when a condition is true, optionally with else branches.
@if(condition)— Renders the following content only when the condition is truthy.@else— Optional; rendered when the@ifcondition is false.@elseif(condition)— Optional; additional condition; first matching branch is used.@endif— Ends the conditional block.
Conditions
You can use:- Word operators (safe in HTML):
eq,neq,lt,lte,gt,gte
Example:@if(orders.length gt 0) - Symbols (where allowed):
===,!==,==,!=,<=,>=,<,> - Logic:
and,or, unary! - Property checks:
@if(article.author_avatar),@if(related_articles && related_articles.length)
@elseif and array length:
Loops: @foreach … @endforeach
Repeat a block once per element in an array.
@foreach(item in array)—itemis the variable name for the current element;arrayis an expression that must evaluate to an array (e.g.posts,related_articles).@endforeach— Required; ends the loop.
{{ item.property }}, @if, nested @foreach, and filters.
Variables: @set
Define a variable for use later in the template.
Components: @component
Include a reusable component by name, with optional arguments.
Inheritance: @extends and @block
Use a base template and override only certain regions.
Base template (e.g. layout)
The base defines named blocks that child templates can override:Child template
The child declares which base it extends and redefines one or more blocks:@extends("pageSlug")— Must be at the top; use the base page’s slug.@block("name")…@endblock— Replaces the same-named block in the base. Only the blocks you define are overridden; the rest of the base layout is used as-is.
Session storage
You can store and read simple values in the visitor’s session from templates. Use this for things like remembering a choice across requests (e.g. a selected option, a flag) without using the frontend.| Call | Purpose |
|---|---|
@setSessionItem('key', value) | Store a value in the session. Use @setSessionItem('key', null) to clear that key. |
{{ getSessionItem('key') }} | Output the stored value, or empty if not set. |
@clearSessionItem('key') | Remove the key from the session (same as setting it to null). |
- Keys may only use letters, numbers, and underscores (
a–z,A–Z,0–9,_). Other characters are stripped. - Values are stored safely (encoded). You can pass strings or numbers; other types are JSON-serialized. There is a size limit per value (~64 KB).
- Clearing: Passing
null(or nothing) tosetSessionItemremoves the key, as does@clearSessionItem('key').
- Lifetime: Session data (including values you store with
setSessionItem) lasts 3 hours from when the session was first created. The timer does not reset on each page load—so after 3 hours the session expires and all stored values are gone. - When it resets: The session is tied to the visitor’s session cookie. It is cleared when:
- the 3-hour lifetime has passed,
- the visitor clears their cookies,
- or they use a different browser or device (new session).
- Use session storage for short-lived, per-visit state (e.g. “has seen this step”, “selected option for this visit”). For long-lived or cross-device data, use a different mechanism (e.g. customer account, database).
Summary
| Directive | Purpose |
|---|---|
@if(condition) … @endif | Conditional block |
@else / @elseif(condition) | Else branches |
@foreach(item in array) … @endforeach | Loop |
@set(variable = expression) | Set variable |
@setSessionItem('key', value) | Store (or clear with null) session value |
{{ getSessionItem('key') }} | Output session value |
@clearSessionItem('key') | Remove session value |
@component("name", args) | Include component |
@extends("pageSlug") | Extend base template |
@block("name") … @endblock | Define/override block |