web-dev-qa-db-ja.com

日付形式として「xx時間前」を使用するにはどうすればよいですか?

Drupal 8ノードの日付形式に「xx時間前」を使用するにはどうすればよいですか?

ノードの「xx時間前」を{{日付}}に置き換えたい。

Drupal 7では、このコードで動作しました:

<?php
 print format_interval(time()-$node->created);
?>
4
RobinSon

これに対処するには2つの方法があります。

1つは、フィールドフォーマッタを使用することです。 DateTimeフィールドがある場合は、Manage Displayに移動し、-FormatTime agoに変更します。次に、歯車をクリックして、いくつかのオプションを選択します。これらはページ全体でバブルアップするキャッシュを認識しますが、状況によってはキャッシュの寿命が短くなる可能性があります。

もう1つはtemplate_preprocess_node()を使用することです。これは、フィールドではないタイムスタンプがある場合に適しています。次に、日付フォーマッターサービスを使用して、タイムスタンプをtimeago形式でレンダリングします。 formatInterval()ではなく、formatDiff()バージョンを使用することをお勧めします(正式には非推奨ではありませんが、お勧めしません)。

_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,
  ]);
}
_

FormatDiff()関数で_'return_as_object' => TRUE_を指定すると、FormattedDateDiffオブジェクトが返されます。これには、フォーマットされた文字列と、これを行うためのレンダー配列の最も正確な_[#cache]['max-age']_エントリが含まれますDrupal 8の新しいキャッシングシステムで動作します。その後、Twigテンプレートで_{{ foo }}_を使用できます。レンダリングエンジンは、プレーンな文字列の代わりにレンダリング配列。

formatTimeDiffSince()formatTimeDiffUntil()のバリアント、および_$options you can pass in_については、DateFormatterInterfaceのドキュメントもご覧ください。

12
mpdonadio

最も簡単な方法は、それをmeourtheme_preprocess_node()で準備し、twigテンプレートで印刷することです。

ただし、D8のレンダーキャッシュでは、キャッシュを無効にしない限り、サーバー側で少し前の出力を行おうとしても機能しません。最初のリクエストで計算され、それ以降は変更されません。

代わりに、解析しやすいマークアップで時刻を送信し、JSを使用してそれを時刻前の形式で表示します。コメントの日付について、d.oがどのように行うかを確認してください: https://www.drupal.org/node/2704717 (ダブルクリックで相対日付と絶対日付を切り替える機能も含まれています)。

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

または

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

2
Taggart Jensen

Twigには、「Time Ago」フィルターを提供するネイティブのDate拡張機能があります

http://twig.sensiolabs.org/doc/extensions/date.html を参照してください

| time_diffが必要なものです。問題はDrupalにはデフォルトでこの拡張機能が含まれていないことです。

twigテンプレートでこれを取得するには、次のようにします

  • インストールTwig拡張機能Drupalモジュール(必ず指示に従ってください)- https://www.drupal.org/project
  • ターミナルのDrupalサイト
    • $ composer小枝/拡張が必要です
    • (しばらくお待ちください...しばらくかかりました)
  • モジュールを有効にする
  • Twigテンプレートでフィルターを使用します

    {{field_my_date | time_diff}}

「10か月前」のようなレンダリング

1
Aidan Foster

ここに答えがあります、

.themeファイルに、以下のコード関数を追加しますthemename_preprocess_comment(&$ variables){

$ date = $ variables ['comment']-> getCreatedTime(); $ variables ['created'] =\Drupal :: service( 'date.formatter')-> formatInterval(REQUEST_TIME-$ date); $ variables ['submitted'] = t( '@ author'、array( '@ author' => $ variables ['author']、 '!datetime' => ''。$ variables ['created']。 '前'));

}

そして、コードの下のcomment.html.twigファイルにレンダリングします

{{作成}} {{'前' | t}}

お役に立てば幸いです...

0
prashant