2013-01-23 129 views
11

我有一個想要在枝條模板中顯示的變量數組,每個變量可以是字符串或日期。檢查一個變量是否是帶枝條的日期

如果變量是日期,我想申請的date過濾器是這樣的:

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

而且如果它是一個字符串,我希望它顯示它通常的方式:

{{ my_var }} 

有什麼方法可以測試一個變量是否是一個日期(例如PHP DateTime對象的一個​​實例)?

+0

github上的相關問題:[考慮一個instanceof測試](https://github.com/fabpot/Twig/issues/553) –

+0

@DanLee謝謝,這很有趣,但我明白爲什麼PR沒有被合併關閉因爲這看起來像是PHP和Twig之間的一種混合。 –

+0

的確,這不是真正的觀點。如果你真的想實現'instanceof'操作符,可能會有所幫助。 –

回答

25

也許不是最好的辦法,但我找到了解決我的問題的辦法。

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

作爲DateTime PHP對象有一個公共getTimestamp方法,這是檢查是否變量是此屬性是否設置或沒有日期的方式。

+0

+1我會說這是一個完美的方式來做到這一點,除非你想創建一個樹枝的擴展,否則你需要某種條件語句 – Prisoner

+0

你可以嘗試調用'date()'如:'date( my_var)? my_var | date('d/m/Y'):my_var'。 – cheesemacfly

+3

'被定義'的部分在Twig中稱爲[Test](http://twig.sensiolabs.org/doc/templates.html#test-operator)。也許你可以[添加你自己的](http://twig.sensiolabs.org/doc/advanced.html#tests)叫做'a_date',並且做一些像'{%if my_var is a_date%} ...'的東西? – RikkusRukkus

4

邁克爾的解決方案在大多數情況下都能正常工作,但在您想要通用解決方案時,您應該考慮一些特殊情況。

首先,您測試具有getTimestamp()方法的對象不必是DateTime實例。當時間戳字段在對象中有用時,我可以處理很多情況,所以我會測試getTimezone()方法。

其次,如果my_var是一個定義了魔術__call方法的對象,那麼所有這樣的測試結果都是正的。這就是爲什麼我建議如下負測試:

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

第二個案例是一個我最近,因爲使用的Propel ORM對象的掙扎。基類有__call方法,可以捕獲所有Twig is defined測試。