Templates
Les templates contiennent la structure HTML de chaque type de page, augmentée de PHP pour en afficher le contenu. Ils sont stockés dans le dossier /site/templates/
.
Pour créer un nouveau template pour une page type, créer un fichier .php
dont le nom soit équivalent à celui du fichier .txt
dans le dossier /content/
. Par exemple :
content : /content/mes-projets/mon-super-projet/project.txt
blueprint : /site/blueprints/project.yml
template : /site/templates/project.php
La relation entre les fichiers se fait grâce à leur nom (c’est aussi le cas pour les models et les controllers – qui dépassent le cadre de cette introduction).
Quelques notes sur PHP
Le langage PHP est un des plus répandus pour développer des sites web (à sa naissance, son acronyme était Personal Home Page).
Important
Le code PHP est toujours encapsulé entre les balises <?php
et ?>
.
Chaque ligne doit se terminer par;
.
<?php
// affiche "Hello World"
echo "Hello World";
?>
Les variables
Le nom des variables en PHP commence toujours par un $
. Différents types de variables existent :
$machin = "bidule"; // une chaîne de caractères (String)
$truc = 0; // un nombre entier (Int)
$chose = 3.14; // un nombre décimal (Float)
$bazar = true; // un booléen : true/vrai ou false/faux (Bool)
$zero = NULL; // la variable existe, mais sa valeur est nulle (NULL).
$choses = ["un", "deux", "trois"]; // une liste (Array) d’éléments – ici, de chaînes
// Ci-dessous, un objet (Object)
// On n’en créera pas dans le contexte de Kirby,
// mais on en affichera les propriétés et on en utilisera les méthodes
class Cat { public function miaule() { return "Maaaow"; } }
$garfield = new Cat();
echo $garfield->miaule();
Afficher du contenu
En PHP, et particulièrement dans le contexte de Kirby, l’affichage des valeurs de variables est l’opération la plus fréquente.
Il existe une notation raccourcie pour faire appel à la méthode echo
:
<?= $machin ?>
// est équivalent à :
<?php
echo $machin;
?>
Pour aller plus loin avec PHP (pas forcément en contexte Kirby), parcourir l’introduction à PHP.
PHP & Kirby
Dans le contexte des templates de Kirby, seules quelques bases de PHP sont nécessaires.
Les conditions
Pour tester si une page a des enfants (des sous-pages), pour savoir si une variable a une valeur et pour faire autre chose dans cas contraire…
if ($machin == "bidule") {
echo "Ouaip";
} else {
echo "Nope";
}
Peut aussi s’écrire (syntaxe préférable dans les templates) :
<?php if ($machin == "bidule") : ?>
Ouaip
<?php else : ?>
Nope
<?php endif ?>
Les boucles
La fonction foreach
permet de parcourir les éléments d’une liste (Array) ou d’un objet. Dans le cas de Kirby, pour les listes de pages, fichiers et utilisateurs, on parle de collections.
foreach ($pages as $page) {
echo "<h1>" . $page->title() . "</h1>";
}
Peut aussi s’écrire (syntaxe préférable dans les templates) :
<?php foreach ($pages as $page) : ?>
<h1><?= $page->title() ?></h1>
<?php endforeach ?>
Au sein de la boucle (entre foreach
et endforeach
), chaque élément de la liste est nommé selon la valeur définie par le mot-clé as
– ici, $page
.
Les collections peuvent être triées, filtrées ou limitées.
// filtrer des projets par catégorie
$projects = $page->children()->listed()->filterBy('category', 'webdesign');
// trier les livres (enfants de la page dont l’id est "books") par auteur
$books = page("books")->children()->listed()->sortBy('author', 'asc');
// limiter les pages du même parent à 3
$frangines = $page->siblings()->listed()->limit(3);
Voir la documentation pour des exemples avancés de logiques de filtre : Filtering compendium.
Les variables prédéfinies
Dans chaque page, Kirby met à dispostion les variables $page
et $site
qui permettent d’accéder au contenu de la page en cours ou du site.
/site/templates/project.php
<html>
<head>
<meta charset="UTF-8">
<meta name="description" content="<?= $site->description() ?>">
<meta name="keywords" content="<?= $site->keywords() ?>">
<title>
<?= $page->title()->html() ?> | <?= $site->title()->html() ?>
</title>
</head>
<body>
<header>
<h1>
<a href="<?= $site->url() ?>">
<?= $site->title()->html() ?>
</a>
</h1>
</header>
<main>
<h1><?= $page->title()->html() ?></h1>
<?= $page->text()->kirbytext() ?>
</main>
</body>
</html>
Les snippets
Les snippets sont des petits morceaux de code réutilisables.
Ils permettent de conserver un code le plus DRY possible, ce qui facilite sa maintenance.
Ils sont stockés dans le dossier /site/snippets/
.
L’exemple de code ci-dessus gagnera à être découpé en :
/site/snippets/header.php
<html>
<head>
<meta charset="UTF-8">
<meta name="description" content="<?= $site->description() ?>">
<meta name="keywords" content="<?= $site->keywords() ?>">
<title>
<?= $page->title()->html() ?> | <?= $site->title()->html() ?>
</title>
</head>
<body>
<?php // le header principal, tout comme un menu, peut être inclus dans toutes les pages ?>
<header>
<h1>
<a href="<?= $site->url() ?>">
<?= $site->title()->html() ?>
</a>
</h1>
</header>
/site/templates/project.php
<?php snippet("header") ?>
<main>
<h1><?= $page->title()->html() ?></h1>
<?= $page->text()->kirbytext() ?>
</main>
<?php snippet("footer") ?>
/site/snippets/footer.php
</body>
</html>
Transmettre une variable à un snippet
Il est parfois utile de transmettre une variable à un snippet. Ci-dessous, on parcours les enfants de la page de type “project”,
et on transmet la variable $project
au snippet project.php
qui peut alors utiliser et afficher les propriétés de l’enfant.
/site/templates/projects.php
<?php snippet('header') ?>
<main>
<h1>Projets</h1>
<?php foreach($page->children() as $project): ?>
<?php snippet('project', ['project' => $project]); ?>
<?php endforeach ?>
</main>
<?php snippet('footer') ?>
/site/snippets/project.php
<article>
<h1><?= $project->title()->html() ?></h1>
<time><?= $project->date()->toDate('d/m/Y') ?></time>
<?= $project->intro()->kirbytext() ?>
<a href="<?= $project->url() ?>">Lire</a>
</article>