我有一個想要在枝條模板中顯示的變量數組,每個變量可以是字符串或日期。檢查一個變量是否是帶枝條的日期
如果變量是日期,我想申請的date
過濾器是這樣的:
{{ my_var|date('d/m/Y') }}
而且如果它是一個字符串,我希望它顯示它通常的方式:
{{ my_var }}
有什麼方法可以測試一個變量是否是一個日期(例如PHP DateTime對象的一個實例)?
我有一個想要在枝條模板中顯示的變量數組,每個變量可以是字符串或日期。檢查一個變量是否是帶枝條的日期
如果變量是日期,我想申請的date
過濾器是這樣的:
{{ my_var|date('d/m/Y') }}
而且如果它是一個字符串,我希望它顯示它通常的方式:
{{ my_var }}
有什麼方法可以測試一個變量是否是一個日期(例如PHP DateTime對象的一個實例)?
也許不是最好的辦法,但我找到了解決我的問題的辦法。
{% if my_var.timestamp is defined %}
{{ my_var|date('m/d/Y') }}
{% else %}
{{ my_var }}
{% endif %}
作爲DateTime
PHP對象有一個公共getTimestamp
方法,這是檢查是否變量是此屬性是否設置或沒有日期的方式。
+1我會說這是一個完美的方式來做到這一點,除非你想創建一個樹枝的擴展,否則你需要某種條件語句 – Prisoner
你可以嘗試調用'date()'如:'date( my_var)? my_var | date('d/m/Y'):my_var'。 – cheesemacfly
'被定義'的部分在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
邁克爾的解決方案在大多數情況下都能正常工作,但在您想要通用解決方案時,您應該考慮一些特殊情況。
首先,您測試具有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
測試。
github上的相關問題:[考慮一個instanceof測試](https://github.com/fabpot/Twig/issues/553) –
@DanLee謝謝,這很有趣,但我明白爲什麼PR沒有被合併關閉因爲這看起來像是PHP和Twig之間的一種混合。 –
的確,這不是真正的觀點。如果你真的想實現'instanceof'操作符,可能會有所幫助。 –