Thay đổi định dạng ngày bài viết


21

Tôi muốn thay đổi định dạng ngày được sử dụng cho các bài viết trong Drupal 8. Có vẻ như nó sử dụng Default medium dateđịnh dạng theo mặc định. Tôi đã thêm định dạng của riêng mình tại admin/config/regional/date-time, nhưng tôi không thể tìm thấy nơi để chỉnh sửa định dạng mà bài viết sử dụng.

Có cách nào để làm điều này từ CMS hay điều này cần phải được thực hiện trong mã?

Câu trả lời:


41

Vì vậy, sau khi dành nhiều thời gian hơn tôi quan tâm để thừa nhận việc này, tôi đã đưa ra hai giải pháp cho việc này.

Giải pháp 1

Một cách để làm điều đó là với chức năng ngày mà darol100 đã đề cập trong câu trả lời của mình. Sửa đổi ví dụ của anh ấy cho trường hợp của tôi, trong node--article.html.twigtập tin của tôi , tôi đã thay đổi:

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

đến

{% set createdDate = node.getCreatedTime|date('j F Y') %}
{% trans %}Submitted by {{ author_name }} on {{ createdDate }} {% endtrans %}

Ưu điểm của phương pháp này là dễ dàng và nhanh chóng. Nhược điểm là tôi không sử dụng hệ thống định dạng ngày tích hợp sẵn của Drupal.

Giải pháp 2

Để sử dụng hệ thống định dạng ngày của Drupal, trước tiên tôi đã tạo định dạng tùy chỉnh của mình tại admin/config/regional/date-time. Sau đó tôi chỉnh sửa node--article.html.twignhư sau:

{% set createdDate = node.getCreatedTime|format_date('my_custom_format') %}
{% trans %}Submitted by {{ author_name }} on {{ createdDate }} {% endtrans %}

Giả định này tôi đặt tên định dạng tùy chỉnh của mình là " Định dạng tùy chỉnh của tôi ", dẫn đến tên máy my_custom_format.

Mặc dù giải pháp này đòi hỏi một bước bổ sung, tôi cảm thấy đó là cách Drupal nhiều hơn để làm điều đó.

Tôi đã tìm hiểu về nó trên trang này về Bộ lọc Twig của Drupal .


9

Nếu bạn muốn thay đổi định dạng ngày dựa trên cấp độ nội dung bài viết. Bạn có thể chỉnh sửa / thêm mã sau đây post.published_at|datevà sử dụng bộ lọc để thay đổi định dạng ngày.

nút - article.html.twig

{# Here are few example #}
{{ post.published_at|date(format='j  F  Y') }} {# Output = 10 March 2001#}
{{ post.published_at|date(format="F j, Y, g:i a") }} {# Output = March 10, 2001, 5:16 pm#}
{{ post.published_at|date(format='m/d/Y') }} {# Output 10/3/2001 #}

Twig sử dụng mã đặt tên giống như định dạng ngày php . Để biết thêm thông tin về các định dạng ngày twig, hãy truy cập - http://twig.sensiolabs.org/doc/filters/date.html


1
Thumbed up! darol100, Điều này có thể được thực hiện trong các tệp TPL theo cách tương tự đối với người có trang web Drupal 7 không?
JohnDoea

1
Có, nhưng sử dụng mẫu PHP thay vì cú pháp twig. Nó sẽ trông một cái gì đó quá này <?php print format_date($node->created, 'custom', 'm/d/y'); ?>.
itdarrylnorris

Cảm ơn darol100, điều này khá hữu ích trong việc giúp tôi tìm hiểu về các bộ lọc Twig. Cuối cùng, tuy nhiên, tôi đã sử dụng bộ lọc format_date mà Drupal cung cấp (như tôi thể hiện trong câu trả lời của mình).
Chris

8

Tôi ủng hộ giải pháp của Chris hơn 2. Như anh ấy nói đó là cách thức tuyệt vời hơn ... nhưng đó chưa phải là lựa chọn tốt nhất.

format_date () đã không được chấp nhận và sẽ bị xóa trước Drupal 9 ... có nghĩa là một ngày nào đó, bạn sẽ thực hiện cập nhật drupal và điều này sẽ bị hỏng.

Thay vào đó, tốt hơn là làm điều này trong tệp .theme của bạn trong một hàm tiền xử lý.

function [theme_name]_preprocess_node(&$variables) {
  $variables['date'] = \Drupal::service('date.formatter')->format($variables['node']->getCreatedTime(), 'my_custom_format');
}

2

Một quan sát về những gì Duke nói:

format_date () đã không được chấp nhận và sẽ bị xóa trước Drupal 9 ...

Có, hàm Drupal format_date () được xác định trong lõi / gồm / common.inc , trên thực tế, không dùng nữa. Nhưng, khi bạn sử dụng bộ lọc twig format_date (), bạn KHÔNG gọi hàm Drupal đó, thay vào đó bạn đang sử dụng bộ lọc twig được xác định bởi Drupal trong TwigExtension :: getFilters () và bộ lọc này gọi DateFormatter :: format () .

Do đó, sử dụng bộ lọc twig format_date () là an toàn và giải pháp 2 của Chris là ổn.


2

Cũng có thể định dạng định dạng ngày đã được sử dụng và chỉ cần thay đổi định dạng đó trong Giao diện người dùng. Chỉ cần so sánh những gì bạn thấy trên trang với các định dạng ngày trongadmin/config/regional/date-time/

Nếu bạn thay đổi, ví dụ: "Ngày trung bình mặc định", nó sẽ thay đổi ngày bằng định dạng này mà không cần chạm vào bất kỳ tệp mẫu / twig nào.

Định dạng ngày cũng có thể được đặt / dịch cho mỗi ngôn ngữ để thiết lập đa ngôn ngữ.


Đây là câu trả lời tốt nhất!
sudoman

1

Bạn có thể tạo trường Gửi theo của riêng mình bằng cách sử dụng Bộ hiển thị để tạo Trường mã thông báo.

Trong Drupal 8 / cấu trúc / DS / trường

Sau đó, thêm một trường bằng cách sử dụng html và mã thông báo như ...

By [node:author] on [node:created:custom:F j, Y]

1

Bạn có thể tùy chỉnh định dạng trong node.html.twig như thế này:

{{ node.createdtime|date(format="Y-m-d") }}

0

Bạn có thể có tất cả các định dạng PHP cho Ngày và Giờ

// Assuming today is March 10th, 2001, 5:16:18 pm, and that we are in the
// Mountain Standard Time (MST) Time Zone

date("F j, Y, g:i a");                 // March 10, 2001, 5:16 pm
date("m.d.y");                         // 03.10.01
date("j, n, Y");                       // 10, 3, 2001
date("Ymd");                           // 20010310
date('h-i-s, j-m-y, it is w Day');     // 05-16-18, 10-03-01, 1631 1618 6 Satpm01
date('\i\t \i\s \t\h\e jS \d\a\y.');   // it is the 10th day.
$today = date("D M j G:i:s T Y");               // Sat Mar 10 17:16:18 MST 2001
date('H:m:s \m \i\s\ \m\o\n\t\h');     // 17:03:18 m is month
date("H:i:s");                         // 17:16:18
date("Y-m-d H:i:s");                   // 2001-03-10 17:16:18 (the MySQL DATETIME format)


{% set createdDate = node.getCreatedTime|date('F j, Y, g:i a') %}
<div class="newsSingleAuthorDate">
      {% trans %}Submitted by <span>{{ author_name }}</span>  on {{ createdDate }} {% endtrans %}
</div>

0

Để chắc chắn rằng tôi chỉ thay đổi các ký tự của ngày chứ không thay đổi bất kỳ thành phần HTML nào xung quanh, tôi sử dụng móc sau:

function [theme_name]_preprocess_field(array &$variables) {
  if ($variables['field_name'] === 'created') {
    $timestamp = $variables['element']['#items']->value;
    $markup = \Drupal::service('date.formatter')->format($timestamp, 'html_date');
    $variables['items'][0]['content']['#markup'] = $markup;
  }
}

Thay thế [theme_name]bằng tên của chủ đề của bạn và html_datevới định dạng thời gian bạn muốn, một trong những người bạn tìm thấy dưới đây /admin/config/regional/date-time.


-1

Tôi đã sử dụng mã sau đây cho nút - bài viết - full.html.twig:

<li class="post-date">
    {% set day = node.createdtime|date("d") %}
      <span class="day">{{ day }}</span>
    {% set month = node.createdtime|date("M") %}
        <span class="month">{{ month }}</span>
 </li>


{% set date = node.createdtime|date("M d, Y") %}
   <span>{{ date }}</span>
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.