L'objectif de ce tuto est d'attacher un gabarit (template) à une route pour gérer le html finement.
Principes
On déclare des gabarits et des variables dans le fichier nom_module.module. Une route renvoie vers un contrôleur qui permet de valoriser les variables et qui fait appel à un template au format Twig pour les afficher.
Créer un fichier nommodule.module
Créer un fichier nommodule.module à la racine du répertoire du module et rajouter le code suivant pour déclarer un gabarit et des variables :
<?php
function premiermo_theme($existing, $type, $theme, $path) {
return [
'unpremiergabarit' => [
'variables' => ['livres' => NULL, 'mavariable'=>NULL],
'template' => 'monpremiertemplate',
],
'unsecondgabarit' => [
'variables' => ['auteurs' => NULL, 'mavariable'=>NULL],
'template' => 'monsecondtemplate',
],
];
}
La valeur de la clé template correspond au nom du fichier twig sans les extentions
Créer le contrôleur
Si vous n’avez pas encore de contrôleur, créer un fichier NomDuControleurController.php dans le repertoire module/src/controllers
Attention la classe doit porter le nom du fichier. Dans l'exemple ci-dessous, il y a deux fonctions : getLivre et GetAuteur qui permettent de récupérer des types de nœuds différents. Si vous voulez utiliser ce code, vous devez avoir créé ces deux types de contenus.
La méthode getLivre() renvoie le gabarit « unpremiergabarit » qui a été déclaré dans le fichier nommodule.module
La méthode getAuteur() renvoie le gabarit « unsecondgabarit » qui a été déclaré dans le même fichier
<?php
/**
* Nom du fichier PremierControllerController.php
*/
namespace Drupal\premiermo\Controller;
use Drupal\Core\Controller\ControllerBase;
/**
* Returns responses for premiermo routes.
*/
class PremierController extends ControllerBase {
Public function getLivre(){
$term = \Drupal::entityTypeManager()
->getStorage('node')
->loadByProperties([
'status' => '1',
'type' => 'livre',
]);
return [
'#theme' => 'unpremiergabarit',
'#livres' => $term,
'#mavariable' => "toto",
];
}
Public function getAuteur(){
$term = \Drupal::entityTypeManager()
->getStorage('node')
->loadByProperties([
'status' => '1',
'type' => auteur,
]);
return [
'#theme' => 'unsecondgabarit',
'#auteurs' => $term,
'#mavariable' => "toto",
];
}
}
Construire les routes
Il ne reste plus qu'à créer les routes dans le fichier nommodule.routing.yml comme on l'a vu dans le tuto précédent.
premiermo.getLivre:
path: '/getlivre'
defaults:
_controller: '\Drupal\premiermo\Controller\PremierController::getLivre'
requirements:
_permission: 'access content'
premiermo.getAuteur:
path: '/getauteur'
defaults:
_controller: '\Drupal\premiermo\Controller\PremierController::getAuteur'
requirements:
_permission: 'access content'
On voit que la clé _controller appelle le fichier PremierController et les méthodes getLivre ou getUser.
Créer les gabarits
Dans un répertoire « templates » situé à la racine du module, créer les gabarits déclarés dans le fichier nommodule.module
Les templates ont pour extension ".html.twig"
Par exemple le fichier suivant affiche la liste des livres
<h1>Liste des livres</h1>
{% for livre in livres %}
<p>{{ livre.title.value }}</p>
{% for auteur in livre.field_auteur %}
<p>{{ auteur.entity.title.value }}</p>
{% endfor %}
{% endfor %}
La variable livres qui a été déclarée dans le fichier nommodule.module, puis valorisée dans le contrôleur est accessible dans le gabarit dans les accolades. Nous verrons par la suite comment afficher les différents types de champs.