Écrit par Laborouge le
Mis à jour le
feuilles d'almanach éparpillées

Drupal 9 : jouer avec les dates de publication

3 minutes

Par défaut, Drupal affiche la date de création du contenu dans un format donné (medium).

Cette date se retrouve en général dans le fichier node.html.twig du thème utilisé.

{% trans %}Submitted by {{ author_name }} on {{ date }}{% endtrans %}

Dans l'exemple ci dessus, on affiche deux variables twig : le nom de l'auteur (author_name) et la date de publication (date).

Le format de cette date ne correspond pas toujours à ce que l'on voudrait afficher.

Nous allons donc créer de nouvelles variables pour palier à ce problème.

Ajouter la date de création du contenu

Nous allons créer une nouvelle variable (created_date) à insérer dans notre template node.html.twig.

Pour cela, nous allons utiliser la fonction hook_preprocess_node() dans le fichier montheme.theme.

<?php

use Drupal\Core\Render\Markup;

/**
 * Implements hook_preprocess_node().
 */
function montheme_preprocess_node(&$variables, $hook) {
  $node = $variables['node'];

  $created_time = $node->getCreatedTime();
  $created_format_html_date = \Drupal::service('date.formatter')->format($created_time, 'html_date');
  $created_format_news = \Drupal::service('date.formatter')->format($created_time, 'news');
  $output_date = '<time datetime="' . $created_format_html_date . '">' . $created_format_news . '</time>';

  $variables['created_date'] = Markup::create($output_date);
}

En détail

Nous récupérons la date de création du contenu :

$created_created_time = $node->getCreatedTime();

Cette date est au format Unix Time Stamp. Il nous faut donc la convertir pour qu'elle soit lisible :

$created_format_html_date = \Drupal::service('date.formatter')->format($created_time, 'html_date');
$created_format_news = \Drupal::service('date.formatter')->format($created_time, 'news');

Dans cette exemple, nous convertissons la date de création du contenu en deux formats : html_date et news :

  • $created_format_html_date nous servira pour l'attribut datetime de la balise <time> (à des fins d'accessibilité par exemple)
  • $created_format_news sera utilisé pour afficher la date de création comme un texte lisible

Ces formats sont disponibles dans votre administration Drupal : Configuration > Régionalisation et langue > Formats de date et d'heure.

Vous pouvez utiliser les formats existants (ex : html_date) et / ou créer les vôtres (ex : news).

Ensuite, nous allons utiliser ces formats pour générer le html :

$output_date = '<time datetime="' . $created_format_html_date . '">' . $created_format_news . '</time>';

Dernière étape, il nous faut assigner le html généré à une variable twig que nous utiliserons dans le template node.html.twig.

$variables['created_date'] = Markup::create($output_date);

Utilisation de la fonction Markup::create()

Dans notre fichier montheme.theme, nous avons défini que nous utiliserions la classe Markup.

use Drupal\Core\Render\Markup;

Associé à sa fonction create(), nous allons pouvoir créer des éléments HTML qui ne seront pas filtrés par twig.

$variables['created_date'] = Markup::create($output_date);

Ne reste plus qu'à implanter notre nouvelle variable created_date dans le template node.html.twig.

{% trans %}Submitted by {{ author_name }} on {{ created_date }}{% endtrans %}

Ajouter la date de mise à jour du contenu

Même exercice que précédemment, mais cette fois nous allons utiliser la date de mise à jour du contenu.

<?php

use Drupal\Core\Render\Markup;

/**
 * Implements hook_preprocess_node().
 */
function montheme_preprocess_node(&$variables, $hook) {
  $node = $variables['node'];

  $changed_time = $node->getChangedTime();
  $changed_format_html_date = \Drupal::service('date.formatter')->format($changed_time, 'html_date');
  $changed_format_news = \Drupal::service('date.formatter')->format($changed_time, 'news');
  $output_date = '<time datetime="' . $changed_format_html_date . '">' . $changed_format_news . '</time>';

  $variables['changed_date'] = Markup::create($output_date);
}

Puis, nous implantons la nouvelle variable changed_date dans le template node.html.twig.

{% trans %}Submitted by {{ author_name }} on {{ changed_date }}{% endtrans %}

Et voilà !

Illustration par Claudio Schwarz sur Unsplash

À propos

Laborouge
Développeur basé sur la région de Rouen, je me suis spécialisé dans le développement de site web avec le C.M.S. Drupal.

Ajouter un commentaire

Le contenu de ce champ sera maintenu privé et ne sera pas affiché publiquement.