Comment puis-je utiliser 'xx time ago' pour le format de date dans Drupal 8 nœuds?
Je veux remplacer "il y a xx fois" par {{date}} dans le nœud.
Dans Drupal 7 cela a fonctionné avec ce code:
<?php
print format_interval(time()-$node->created);
?>
Il existe deux façons de résoudre ce problème.
La première consiste à utiliser simplement les formateurs de champ. Si vous avez un champ DateTime, passez simplement à Gérer l'affichage, et changez Format en Il y a temps. Cliquez ensuite sur l'engrenage et choisissez quelques options. Celles-ci sont conscientes du cache et remonteront à travers la page, mais vous pouvez vous retrouver avec des durées de vie de cache courtes dans certaines situations.
L'autre consiste à utiliser une template_preprocess_node()
. Ceci est préférable lorsque vous avez un horodatage qui n'est pas un champ. Ensuite, vous utilisez le service de formatage de date pour restituer l'horodatage au format timeago. Il est préférable d'utiliser les versions formatDiff () plutôt que formatInterval () (bien que non formellement déconseillé, il est déconseillé).
function MYTHEME_preprocess_node(&$variables) {
/** @var \Drupal\Core\Datetime\DateFormatterInterface $formatter */
$date_formatter = \Drupal::service('date.formatter');
$variables['foo'] = $date_formatter->formatDiff(REQUEST_TIME - 12345, REQUEST_TIME, [
'granularity' => 3,
'return_as_object' => TRUE,
]);
}
Lorsque vous spécifiez 'return_as_object' => TRUE
Avec les fonctions formatDiff (), un objet FormattedDateDiff
est renvoyé, qui contient la chaîne formatée ainsi qu'une entrée [#cache]['max-age']
Généralement précise dans un tableau de rendu pour faire fonctionner cela avec Drupal 8 nouveau système de mise en cache. Ensuite, vous pouvez simplement utiliser {{ foo }}
dans votre modèle Twig; le moteur de rendu fera le bonne chose avec le tableau de rendu au lieu d'une chaîne simple.
Lisez également les documents sur DateFormatterInterface
pour les variantes formatTimeDiffSince()
et formatTimeDiffUntil()
, et pour $options you can pass in
.
L'approche la plus simple consiste à le préparer dans ỳourtheme_preprocess_node (), puis à l'imprimer dans le modèle twig.
Cependant, avec la mise en cache de rendu de D8, essayer de faire il y a longtemps la sortie côté serveur ne peut pas fonctionner, sauf si vous désactivez la mise en cache. Il sera calculé à la première demande et ne changera plus jamais.
Au lieu de cela, vous souhaitez envoyer l'heure dans un balisage facile à analyser, puis utiliser JS pour l'afficher en tant que format d'heure antérieure. Voyez comment d.o fait cela pour les dates de commentaire: https://www.drupal.org/node/2704717 (il inclut également une fonctionnalité pour basculer entre les dates relatives et absolues avec un double clic).
$ this-> date-> formatTimeDiffSince ($ time_stamp);
ou
\ Drupal :: service ('date.formatter') -> formatTimeDiffSince ($ time_stamp);
Twig a une extension Date native qui fournit un filtre "Time Ago"
Voir http://twig.sensiolabs.org/doc/extensions/date.html
| time_diff est celui que vous voulez. Le problème est Drupal n'inclut pas cette extension par défaut.
Donc, pour obtenir cela dans vos modèles twig, procédez comme suit
Utilisez le filtre dans vos modèles Twig
{{field_my_date | time_diff}}
Des rendus comme "il y a 10 mois"
Voici la réponse,
dans votre fichier .theme, ajoutez ci-dessous la fonction de code themename_preprocess_comment (& $ variables) {
$ date = $ variables ['comment'] -> getCreatedTime (); $ variables ['created'] =\Drupal :: service ('date.formatter') -> formatInterval (REQUEST_TIME - $ date); $ variables ['submit'] = t ('@ author', array ('@ author' => $ variables ['author'], '! datetime' => ''. $ variables ['created']. 'ago '));
}
et restituez dans votre fichier comment.html.twig sous le code
{{créé}} {{'il y a' | t}}
j'espère que cela vous sera utile merci ...