web-dev-qa-db-fra.com

Comment puis-je utiliser 'xx time ago' comme format de date?

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);
?>
4
RobinSon

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.

12
mpdonadio

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).

2
Berdir

https://api.drupal.org/api/drupal/core%21lib%21Drupal%21Core%21Datetime%21DateFormatter.php/function/DateFormatter%3A%3AformatTimeDiffSince/8.2.x

$ this-> date-> formatTimeDiffSince ($ time_stamp);

ou

\ Drupal :: service ('date.formatter') -> formatTimeDiffSince ($ time_stamp);

2
Taggart Jensen

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

  • Installer Twig Extensions Drupal Module (Assurez-vous de suivre les instructions) - https://www.drupal.org/project
  • Dans le terminal de votre site Drupal
    • $ composer nécessite une brindille/des extensions
    • (soyez patient ... cela a pris du temps)
  • Activer le module
  • Utilisez le filtre dans vos modèles Twig

    {{field_my_date | time_diff}}

Des rendus comme "il y a 10 mois"

1
Aidan Foster

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 ...

0
prashant