Attacher un gabarit à une route qui pointe vers un contrôleur dans Drupal

Drupal 8

Attacher un gabarit à une route qui pointe vers un contrôleur dans Drupal

Soumis par Antoine le mar 17/03/2020 - 23:55

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.

Version