Zmień format daty artykułu

21

Chciałbym zmienić format daty używany dla artykułów w Drupal 8. Wygląda na to, że Default medium datedomyślnie używa formatu. Dodałem własny format w admin/config/regional/date-time, ale nie mogę znaleźć, gdzie mogę edytować format, którego używają artykuły.

Czy istnieje sposób, aby to zrobić z poziomu CMS, czy też należy to zrobić w kodzie?

Chris
źródło

Odpowiedzi:

41

Więc po spędzeniu więcej czasu, niż chciałbym przyznać, patrząc na to, wymyśliłem dwa rozwiązania tego.

Rozwiązanie 1

Jednym ze sposobów, aby to zrobić, jest funkcja daty, o której darol100 wspomniał w swojej odpowiedzi. Zmieniając jego przykład dla mojej sprawy, w moim node--article.html.twigpliku zmieniłem:

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

do

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

Zaletą tego podejścia jest to, że jest łatwe i szybkie. Wadą jest to, że nie korzystam z wbudowanego systemu formatu daty Drupala.

Rozwiązanie 2

Aby skorzystać z systemu formatu daty Drupala, najpierw utworzyłem własny format w admin/config/regional/date-time. Następnie edytowałem node--article.html.twigw następujący sposób:

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

Zakłada się, że nazwa mojego niestandardowego formatu została nazwana „ Mój niestandardowy format ”, co skutkuje nazwą maszyny my_custom_format.

Chociaż to rozwiązanie wymaga dodatkowego kroku, wydaje mi się, że jest to bardziej Drupal.

Dowiedziałem się o tym na tej stronie o filtrach gałązek Drupala .

Chris
źródło
9

Jeśli chcesz zmienić format daty na podstawie typu zawartości artykułu. Możesz edytować / dodać następujący kod post.published_at|datei użyć filtra, aby zmienić format daty.

węzeł - 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 #}

Gałązka używa tego samego kodu nazewnictwa co format daty php . Aby uzyskać więcej informacji na temat formatów dat gałązek odwiedź - http://twig.sensiolabs.org/doc/filters/date.html

itsdarrylnorris
źródło
1
Kciuk w górę! darol100, Czy można to zrobić w plikach TPL w ten sam sposób dla kogoś, kto ma witrynę Drupal 7?
JohnDoea,
1
Tak, ale używa szablonu PHP zamiast składni gałązki. To też powinno wyglądać coś takiego <?php print format_date($node->created, 'custom', 'm/d/y'); ?>.
itsdarrylnorris
Dzięki darol100, było to bardzo przydatne w pomaganiu mi w nauce filtrów Twig. Ostatecznie jednak zdecydowałem się na użycie filtru format_date, który zapewnia Drupal (jak pokazuję w mojej odpowiedzi).
Chris
8

Jestem bardziej za rozwiązaniem Chrisa 2. Jak mówi, jest to bardziej drupaliczny sposób ... ale nie jest to jeszcze najlepsza opcja.

format_date () został uznany za przestarzały i zostanie usunięty przed Drupalem 9 ... co oznacza, że ​​pewnego dnia dokonasz aktualizacji Drupala i to się zepsuje.

Zamiast tego lepiej jest to zrobić w pliku .theme w funkcji wstępnego przetwarzania.

function [theme_name]_preprocess_node(&$variables) {
  $variables['date'] = \Drupal::service('date.formatter')->format($variables['node']->getCreatedTime(), 'my_custom_format');
}
Książę
źródło
2

Spostrzeżenie na temat tego, co powiedział Duke:

format_date () został uznany za przestarzały i zostanie usunięty przed Drupal 9 ...

Tak, funkcja Drupal format_date () zdefiniowana w core / include / common.inc jest w rzeczywistości przestarzała. Ale kiedy używasz filtra gałązkowego format_date () , NIE wywołujesz tej funkcji Drupal, zamiast tego używasz filtra gałązkowego zdefiniowanego przez Drupal w TwigExtension :: getFilters () , a ten filtr wywołuje DateFormatter :: format () .

Dlatego użycie filtru gałązkowego format_date () jest bezpieczne, a rozwiązanie Chrisa 2 jest w porządku.

camilo.escobar
źródło
2

Możliwe jest również poprawienie używanego formatu daty i zmiana tego w interfejsie użytkownika. Po prostu porównaj to, co widzisz na stronie, z formatami dat wadmin/config/regional/date-time/

Jeśli zmienisz np. „Domyślną średnią datę”, zmieni daty w tym formacie bez dotykania żadnych plików szablonów / gałązek.

Formaty daty można również ustawić / przetłumaczyć na język dla konfiguracji wielojęzycznej.

cud oka
źródło
To najlepsza odpowiedź!
sudoman
1

Możesz utworzyć własne pole przesłane przez, używając Display Suite do utworzenia pola tokena.

W Drupal 8 / structure / ds / fields

Następnie dodaj pole używając html i tokenów takich jak ...

By [node:author] on [node:created:custom:F j, Y]
Daniel Schiavone
źródło
1

Możesz dostosować format w node.html.twig w następujący sposób:

{{ node.createdtime|date(format="Y-m-d") }}
Henz
źródło
0

Możesz mieć wszystkie formaty PHP dla daty i godziny

// 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>
Wasim Khan
źródło
0

Aby mieć pewność, że zmieniam tylko znaki daty, ale żadnych otaczających elementów HTML, używam następującego haka:

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

Zamień [theme_name]na nazwę swojego motywu i html_dateżądany format czasu, jeden z tych, które znajdziesz pod /admin/config/regional/date-time.

Philipp Zedler
źródło
-1

Użyłem następującego kodu dla węzła - artykuł - 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>
Damir Dimić
źródło