Drupal 9 : jouer avec les dates de publication
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