2013-01-23 16 views
11

Ho una matrice di variabili che voglio visualizzare in un modello Twig e ogni variabile può essere una stringa o una data.Verificare se una variabile è una data con Twig

Se la variabile è una data, voglio applicare il filtro date in questo modo:

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

E se è una stringa che deve essere visualizzato nel modo consueto:

{{ my_var }} 

C'è un modo per verificare se una variabile è una data (ad esempio un'istanza dell'oggetto DateTime di PHP)?

+0

problema correlato su github: [Si consideri un'istanza di prova] (https://github.com/fabpot/Twig/issues/553) –

+0

@DanLee Grazie, è interessante ma capisco perché il PR è stato chiuso senza essere unito in questo modo sembrerebbe una sorta di mix tra PHP e Twig. –

+0

Sì, certo, non è proprio il business della vista. Ho pensato che potrebbe essere d'aiuto se volessi davvero implementare l'operatore 'instanceof'. –

risposta

25

Forse non è il modo migliore per farlo, ma ho trovato una soluzione al mio problema.

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

Come un oggetto PHP DateTime ha un metodo pubblico getTimestamp, si tratta di un modo per verificare se la variabile è una data se questa proprietà è impostata oppure no.

+0

+1 Direi che è un modo perfetto per farlo, avresti bisogno di qualche tipo di istruzione condizionale da qualche parte a meno che tu non voglia creare un'estensione di ramoscello – Prisoner

+0

Puoi provare a chiamare 'date()' come: 'date (my_var)? my_var | date ('d/m/Y'): my_var'. – cheesemacfly

+3

La parte 'è definita' è denominata [Test] (http://twig.sensiolabs.org/doc/templates.html#test-operator) in Twig. Forse potresti [aggiungere il tuo] (http://twig.sensiolabs.org/doc/advanced.html#tests) chiamato 'a_date', e fare qualcosa come' {% se my_var è un_date%} ... '? – RikkusRukkus

4

La soluzione di Michael funziona nella maggior parte dei casi, ma ci sono alcuni casi speciali da considerare quando si vuole avere una soluzione universale.

In primo luogo, un oggetto testato per il metodo getTimestamp() non deve essere un'istanza DateTime. Posso fare molti casi in cui il campo data/ora sarebbe utile in un oggetto, quindi testerei il metodo getTimezone().

In secondo luogo, se my_var è un oggetto con un metodo magico __call definito, tutti i test di questo tipo risulterebbero positivi. Ecco perché suggerisco il seguente test negativo:

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

Il secondo caso è stata quella di recente ho lottato con a causa dell'utilizzo di oggetti Propel. La classe base ha il metodo __call che cattura tutti i test Twig is defined.

Problemi correlati