Qu'est ce qu'une "Page model"

Une page model est un fichier PHP permettant d'étendre un type de page, c'est à dire de soit redéfinir une des méthodes existantes soit de définir une nouvelle méthode. Le type de page est définie par rapport au template auquel la page est liée.

Pour rappel une méthode correspond à une fonction en language Objet, fonction qui est disponible qu'à travers un Objet lui même instancié à partir d'une Classe. Kirby est programmé en PHP sur le paradigme du language objet.

Vous pouvez définir une page model dans un plugin (je n'aborderai pas cette méthode dans cet article) ou directement dans votre système de fichier en créant un fichier PHP que vous placerez dans un dossier /site/models

Ce fichier PHP doit porter le même nom que le template auquel est rattaché la page que vous souhaitez étendre.

Nom de la page model Nom du template de la page à étendre
/site/models/project.php /site/templates/project.php

Comment créer une "Page model"

Une page model est un fichier PHP dans lequel on déclare une classe qui étend la classe "Page" de Kirby. Cette classe doit porter le nom du template de la page que l'on souhaite étendre suivi de "Page", le tout en un seul mot.

Exemple : pour une page rattachée au template project la classe de la page model devra s'appeler ProjectPage.

// /site/models/project.php

class ProjectPage extends Page {
  // mon code ici pour étendre une méthode de Page ou pour créer une nouvelle méthode.
}

A chaque fois que Kirby rencontrera une page de type "project", il chargera cette page model et vous aurez accès dans vos templates, blueprints, controllers et snippets aux méthodes que vous aurez définies dans cette page model.

Si le nom de votre template comporte un tiret (mon-template.php) ou un underscore (mon_template.php) il faudra nommer la classe de votre "Page model" de cette manière MonTemplatePage

Voici quelques cas d'usages des pages model :

- Modifier le comportement d'une méthode existante
- Ajouter une méthode dont vous avez besoin pour votre application
- Factoriser du code pour ne pas le répéter à plusieurs endroits
- Mettre en forme un contenu, le stocker dans une variable et renvoyer cette variable. On pourra l'utiliser pour afficher le contenu mis en forme dans un champ "infos" d'une blueprint par exemple.

Voici un exemple concret.

Nous allons créer une méthode getDateCreation() qui récupère la date de création de la page et la renvoie au format "dd.mm.yyyy"

// /site/models/project.php

<?php

class ProjectPage extends Page {
  public function getDateCreation() {
    return $this->dateCreation()->toDate('d.m.Y');
  }
}
On utilise $this dans notre classe projectPage pour faire référence à la classe Page étendue.

Dans mon template project.php je pourrais appeler cette date de cette manière :

// /site/templates/project.php

<?= $page->getDateCreation(); ?>

La vidéo YouTube