2011-06-30 10 views
5

Chcę utworzyć dynamiczny format daty php. Przykład: pokaż czas węzła, jeśli został opublikowany dzisiaj i tylko dzień/miesiąc, gdy jest starszy niż dziś. Chcę, aby ten format był dostępny w Drupalu, podobnie jak inne predefiniowane formaty daty w Drupal (nie tylko na poziomie motywu).Niestandardowy format daty (wywołanie zwrotne z logiką php)

Znalazłem hak (tylko D7) dla hook_date_format_types, ale nawet ten nie wydaje się pozwalać na wywołanie zwrotne, w którym mógłbym zdefiniować tę logikę PHP.

Czy ktoś wie, który haczyk to umożliwi? Lub moduł, który to robi?

+0

Jeśli pokazujemy tę datę jako pole w widoku, a następnie można użyć szablonu pola plik rzutem do obsługi logiki PHP potrzebne, aby otrzymać Żądana wydajność: Po drugiej stronie, jeśli nie jest to pole daty w widoku i po prostu używasz utworzonego czasu dla węzła, możesz użyć pliku szablonu węzła do sformatowania daty: Jestem nie znając żadnych funkcji wywołania zwrotnego, które mogą być używane w formatach daty, jest to ciekawy pomysł i zdecydowanie widzę niektóre aplikacje na to. –

+0

Tak, wiem, że mógłbym to zrobić na poziomie szablonu/preprocesu, ale byłby to dużo czystych er gdybyś mógł stworzyć prawdziwy globalny niestandardowy format daty ... –

Odpowiedz

1

W Drupal6, format_date() ma daty i godziny na stałe. Ponadto, format_date() nie zezwala na oddzwanianie, ale zezwala na niestandardowy ciąg znaków. Tam można zastosować sztuczkę: zamiast kodowania ciągiem tam, wywołujesz funkcję, która zwraca ciąg znaków.

function mydate_format($timestamp) { 
    $now = time(); 
    if (($now - $timestamp) < (60*60*24)) { 
    return "H:i"; 
    } 
    else { 
    return "d:m:Y"; 
    } 
} 

print format_date($timestamp, 'custom', mydate_format($timestamp)); 

Drugą opcją jest ponowne zdefiniowanie datownika, ale jest to jednocześnie hack i ograniczone. Formaty daty są definiowane za pomocą zmiennej zmienna_get(), ale nie przechodzą znacznika czasu wzdłuż; więc Twój przykład przełączania formatów na podstawie wartości znacznika czasu nie jest możliwy w ten sposób.

W settings.php:

$conf['date_format_long'] = $conf['debug'] ? 'r' : 'l, F j, Y - H:i'; 

Spowoduje to przejście z jednej wartości do drugiej, na podstawie tego, czy settings.php ma flagę "debug" ustawiony na TRUE, czy nie. Jak już wspomniano: użycie tego jest ograniczone, ponieważ nie można uzyskać żadnego kontekstu.

Trzecią opcją jest użycie Date API, która oferuje konfigurowalne formaty czasu w onlinle. Ale jest to zarówno niezgrabne, jak i niezabezpieczone (wprowadzanie wykonywalnego PHP w bazie danych). Zależy to również od bardzo dużego zestawu modułów. I ma tę wadę, co pierwsze rozwiązanie: nie można używać formatu data_date, ale musi użyć zmodyfikowanego wywołania funkcji, zamiast format_date(). Zobacz wszystkie opcje na The Drupal.org date themeing handbook.

GOTCHA We wszystkich przypadkach Drupal nie wywoła tej funkcji dla treści z pamięci podręcznej. Jeśli chcesz, aby daty były naprawdę dynamiczne, musisz albo całkowicie pominąć buforowanie, albo zaimplementować formatowanie daty w javascriptie klienta.

TL; DR: Nie można mieć dynamicznych formatów daty bez zmiany niektórych kodu na poziomie kompozycji. Użycie funkcji wywołania zwrotnego w celu wygenerowania "niestandardowego" formatu daty jest najprostszym, działającym rozwiązaniem.

0

Możesz użyć modułu Data API, aby dodać własne niestandardowe formatowanie daty. Moduł API Data znajduje się w module Data. Po włączeniu modułu API Data możesz przejść ścieżką "admin/settings/date-time/formats/add", aby dodać swój niestandardowy format.

"admin/settings/data-time/formats/configure" to ścieżka do konfigurowania formatów daty.

Spójrz na te. Szczęśliwe kodowanie.

Dzięki RT

+0

Jestem świadomy daty modułu API, ale nie jest to tym, czego szukam. Proszę przejrzeć pytanie: Chcę dodać format, który używa wywołania zwrotnego z pewną logiką php. NIE jest to prosty format wykorzystujący składnię php date(). –

0

Możesz przejść do node.tpl.php (ewentualnie w sites/all/themes/THEME_NAME/node.tpl.php). Tutaj możesz znaleźć $ utworzoną zmienną, aby ponownie sformatować datę możesz użyć swojej niestandardowej funkcji i zmienić $ utworzony zgodnie z twoimi potrzebami. Po tym wszystkim wszystkie węzły będą używać sformatowanych dat.

Regaty, Chintan.

+0

Jestem tego świadomy, ale to wciąż nie jest to, o co proszę. Chcę utworzyć dynamiczny niestandardowy format php, który może być używany przez drupala. Twoje rozwiązanie znajduje się na poziomie szablonu i tylko w określonym tpl. –

+0

Hej! powinieneś zmodyfikować swoje pytanie, nieco mylące. Chcesz zmienić format daty dla węzłów w całej witrynie, spójrz na część pogrubioną, która jest myląca. – Chintan

+0

Dzięki, trochę zmodyfikowałem. Mam nadzieję, że teraz jest bardziej przejrzyste. –

0

Skorzystaj z modułu funkcji. Utwórz funkcję.

W wynikowym module funkcyjnym, w pliku [feature] .module, utwórz funkcję hook_nodeapi i sformatuj pole za pomocą instrukcji warunkowej uwzględniającej bieżącą datę() określającą sposób wyświetlania daty i podawania jej. do $ node-> content var.

I to jest droga rockstars zrobi to (-;

+0

Proszę się różnić – stefgosselin