2013-01-23 10 views
11

Mam tablicę zmiennych, które chcę wyświetlić w szablonie Twig, a każda zmienna może być ciągiem lub datą.Sprawdź, czy zmienna jest datą z Twig

Jeśli zmienna jest data, chcę zastosować filtr date takiego:

{{ my_var|date('d/m/Y') }} 

A jeśli jest to ciąg chcę, aby wyświetlić ją w zwykły sposób:

{{ my_var }} 

Czy istnieje sposób sprawdzenia, czy zmienna jest datą (np. Instancją obiektu PHP DateTime)?

+0

problem związany na github: [rozważyć testu instanceof] (https://github.com/fabpot/Twig/issues/553) –

+0

@DanLee Dzięki, że to interesujące, ale rozumiem dlaczego PR został zamknięty bez scalone ponieważ będzie to wyglądać jak mieszanka PHP i Twig. –

+0

Tak, rzeczywiście, to nie jest tak naprawdę sprawa z widokiem. Pomyślałem, że może to pomóc, jeśli naprawdę chcesz zaimplementować operatora 'instanceof'. –

Odpowiedz

25

Może nie jest to najlepszy sposób, ale znalazłem rozwiązanie mojego problemu.

{% if my_var.timestamp is defined %} 
    {{ my_var|date('m/d/Y') }} 
{% else %} 
    {{ my_var }} 
{% endif %} 

Jako DateTime PHP obiekt ma publiczną metodę getTimestamp, jest to sposób, by sprawdzić, czy zmienna jest data czy ta właściwość jest ustawiona czy nie.

+0

+1 Powiedziałbym, że jest to świetny sposób, aby gdzieś to zrobić, potrzebowałbyś jakiegoś warunkowego oświadczenia gdzieś, gdybyś nie chciał utworzyć rozszerzenia z gałązkami. – Prisoner

+0

Możesz spróbować wywołać 'date()' like: 'date (my_var)? my_var | date ('d/m/Y'): my_var'. – cheesemacfly

+3

Część "jest zdefiniowana" nazywana jest [Test] (http://twig.sensiolabs.org/doc/templates.html#test-operator) w Twig. Być może mógłbyś [dodać własne] (http://twig.sensiolabs.org/doc/advanced.html#tests) o nazwie 'a_date', i zrobić coś takiego:' {% if my_var is a_date%} ... '? – RikkusRukkus

4

Rozwiązanie Michaela działa w większości przypadków, ale są pewne szczególne przypadki, które należy wziąć pod uwagę, gdy chcemy mieć uniwersalne rozwiązanie.

Po pierwsze, obiekt, który testuje się przy użyciu metody getTimestamp(), nie musi być instancją DateTime. Potrafię w wielu przypadkach, gdy pole znacznika czasu byłoby użyteczne w obiekcie, więc zamiast tego przetestowałbym metodę getTimezone().

Po drugie, jeśli my_var jest obiektem o zdefiniowanej metodzie magicznej __call, wszystkie takie testy wypadłyby pozytywnie. Dlatego proponuję następujące ujemny wynik testu:

{% if my_var.timezone is defined and my_var.nonExistingProperty is not defined %} 
    {{ my_var|date('m/d/Y') }} 
{% else %} 
    {{ my_var }} 
{% endif %} 

Drugi przypadek był jednym niedawno zmagał się z powodu użycia obiektów Propel ORM. Klasa bazowa ma metodę __call, która przechwytuje wszystkie testy Twig is defined.

Powiązane problemy