Le istruzioni extends
e import
, consentono di strutturare il template in modo da scrivere una volta sola del codice per poi richiamarlo in diverse parti del template.
L'istruzione extends
consente ad una pagina, che definisce del contenuto, di estendere un file che ne definisce invece la struttura. Quest'ultimo è detto "di layout" proprio perché definisce il layout di una o più pagine. In genere, per convenzione, i file di layout stanno tutti in una cartella del template chiamata "layouts".
Il seguente è un esempio di file di layout:
<!DOCTYPE html>
<html>
<head>
<title>{{ Title() }}</title>
</head>
<body>
{{ Header() }}
{{ Body() }}
</body>
</head>
Contiene delle istruzioni show
che mostrano le macro Title
, Header
e Body
. Si noti che la chiamata di una macro sembra una chiamata di funzione, e questo perché le macro sono funzioni. Solo la sintassi con cui vengono dichiarate è diversa.
Le tre macro non sono dichiarate nel file stesso, ma verranno dichiarate nelle pagine che estendono questo file di layout:
{% extends "/layouts/standard.html" %}
{% macro Title %}Fantastico prodotto{% end %}
{% macro Header %}
<header>Un fantastico prodotto</header>
{% end %}
{% macro Body %}
Questo fantastico prodotto è...
{% end %}
<!DOCTYPE html>
<html>
<head>
<title>Fantastico prodotto</title>
</head>
<body>
<header>Un fantastico prodotto</header>
Questo fantastico prodotto è...
</body>
</head>
L'istruzione extends
deve trovarsi all'inizio della pagina, prima di qualsiasi altra cosa, e la pagina dovrà dichiarare le macro chiamate e non dichiarate nel file di layout. Queste macro devono avere la prima lettera del nome in maiuscolo per poter essere visibili, e quindi chiamate, dal file di layout.
La pagina può avere anche altre dichiarazioni, come di variabili e di macro, usate internamente alla pagina stessa ma non potrà avere altro contenuto al di fuori di quello presente all'interno delle macro.
Nel precedente esempio si sono usate solo macro senza parametri ma nulla vieta di usare anche macro con parametri.
L'istruzione import
importa nel file corrente le dichiarazioni presenti in un altro file in modo da poter accedere alle sue variabili o chiamare le sue macro. Solo le dichiarazioni con la prima lettera del nome in maiuscolo vengono importate.
I file importati possono avere solo dichiarazioni e non possono avere contenuto, a parte quello all'interno delle macro. Essi quindi definiscono macro e variabili che possono essere richiamate in altre parti del template semplicemente importandone il file. In genere i file importati, per convenzione, sono messi in una cartella del template chiamata "imports".
Se ad esempio il file "/imports/images.html" definisce la seguente macro:
{% macro Image(url string, width, height int) %}
<img src="{{ url }}" width="{{ width }}" height="{{ height }}">
{% end %}
importandolo è poi possibile chiamare la macro:
{% import "/imports/images.html" %}
{{ Image("offer.png", 200, 200) }}
<img src="offer.png" width="200" height="200">
Le istruzioni import
devono trovarsi all'inizio del file, prima di qualsiasi altra cosa, ma dopo una istruzione extends
qualora fosse presente.
L'istruzione import
consente di indicare un identificatore da usare per accedere alle dichiarazioni nel file importato:
{% import images "/imports/images.html" %}
{{ images.Image("offer.png", 200, 200) }}
<img src="offer.png" width="200" height="200">