Изменить формат даты статьи

21

Я хотел бы изменить формат даты, который используется для статей в Drupal 8. Похоже, он использует Default medium dateформат по умолчанию. Я добавил свой собственный формат в admin/config/regional/date-time, но я не могу найти, где редактировать формат, который используют статьи.

Есть ли способ сделать это из CMS или это нужно сделать в коде?

Крис
источник

Ответы:

41

Поэтому, потратив больше времени, чем мне хотелось бы признаться, изучая это, я нашел два решения для этого.

Решение 1

Один из способов сделать это - использовать функцию даты, о которой darol100 упомянул в своем ответе. Модифицируя его пример для моего случая, в моем node--article.html.twigфайле я изменил:

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

в

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

Преимущество такого подхода в том, что он прост и быстр. Недостатком является то, что я не использую встроенную систему форматирования даты в Drupal.

Решение 2

Чтобы использовать систему форматирования даты в Drupal, я сначала создал свой собственный формат в admin/config/regional/date-time. Затем я отредактировал node--article.html.twigследующим образом:

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

Предполагается, что я назвал свой пользовательский формат « Мой пользовательский формат », что приводит к имени машины my_custom_format.

Хотя это решение требует дополнительного шага, я чувствую, что это более Drupal способ сделать это.

Я узнал об этом на этой странице о Drupal's Twig Filters .

Крис
источник
9

Если вы хотите изменить формат даты на основе типа содержимого статьи. Вы можете отредактировать / добавить следующий код post.published_at|dateи использовать фильтр для изменения формата даты.

узел - 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 использует тот же код именования, что и формат даты php . Для получения дополнительной информации о форматах даты ветки посетите - http://twig.sensiolabs.org/doc/filters/date.html

itsdarrylnorris
источник
1
Большой палец вверх! darol100, можно ли это сделать в файлах TPL таким же образом для кого-то с сайта Drupal 7?
JohnDoea
1
Да, но использует шаблон PHP вместо синтаксиса веток. Это должно выглядеть тоже так <?php print format_date($node->created, 'custom', 'm/d/y'); ?>.
itdarrylnorris
Спасибо darol100, это очень помогло мне узнать о фильтрах Twig. В конечном итоге, однако, я использовал фильтр format_date, который предоставляет Drupal (как я покажу в своем ответе).
Крис
8

Я больше за решение Криса 2. Поскольку он говорит, что это больше друпал ... но это еще не лучший вариант.

format_date () устарела и будет удалена до Drupal 9 ... это означает, что однажды вы сделаете обновление drupal, и это сломается.

Вместо этого лучше сделать это в своем файле .theme в функции предварительной обработки.

function [theme_name]_preprocess_node(&$variables) {
  $variables['date'] = \Drupal::service('date.formatter')->format($variables['node']->getCreatedTime(), 'my_custom_format');
}
герцог
источник
2

Наблюдение за тем, что сказал герцог:

format_date () устарела и будет удалена до Drupal 9 ...

Да, функция Drupal format_date (), определенная в core / includes / common.inc , фактически устарела. Но когда вы используете фильтр веток format_date (), вы НЕ вызываете эту функцию Drupal, вместо этого вы используете фильтр веток, определенный Drupal в TwigExtension :: getFilters () , и этот фильтр вызывает DateFormatter :: format () .

Следовательно, использование фильтра веток format_date () безопасно, и решение Криса 2 в порядке.

camilo.escobar
источник
2

Также можно отформатировать уже используемый формат даты и просто изменить его в пользовательском интерфейсе. Просто сравните то, что вы видите на странице с форматами даты вadmin/config/regional/date-time/

Если вы измените, например, «Средняя дата по умолчанию», это изменит даты, используя этот формат, не касаясь файлов шаблонов / веток.

Форматы даты также могут быть установлены / переведены для каждого языка для настройки нескольких языков.

глаза чудо
источник
Это лучший ответ!
Судоман
1

Вы можете создать собственное поле Submitted By, используя Display Suite, для создания поля Token.

В Drupal 8 / структура / DS / поля

Затем добавьте поле, используя HTML и токены, как ...

By [node:author] on [node:created:custom:F j, Y]
Даниэль Скьявоне
источник
1

Вы можете настроить формат в node.html.twig следующим образом:

{{ node.createdtime|date(format="Y-m-d") }}
Генри
источник
0

Вы можете иметь все форматы PHP для даты и времени

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

Чтобы быть уверенным, что я изменяю только символы даты, но не окружающие элементы HTML, я использую следующий хук:

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

Замените [theme_name]на название вашей темы и html_dateжелаемый формат времени, один из тех, которые вы найдете под /admin/config/regional/date-time.

Филипп Зедлер
источник
-1

Я использовал следующий код для node - article - 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>
Дамир Димич
источник