2013-01-23 25 views
11

के साथ एक दिनांक है, मेरे पास एक चरम टेम्पलेट में प्रदर्शित करने के लिए वेरिएबल्स की एक सरणी है और प्रत्येक चर या तो एक स्ट्रिंग या दिनांक हो सकता है।जांचें कि कोई चर Twig

चर एक तारीख है, तो मैं date फिल्टर इस तरह लागू करना चाहते हैं:

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

और अगर यह एक स्ट्रिंग है मैं इसे यह हमेशा की तरह प्रदर्शित करना चाहते हैं:

{{ my_var }} 

क्या कोई वैरिएबल एक तारीख है (यानी PHP दिनांक समय वस्तु का एक उदाहरण) परीक्षण करने का कोई तरीका है?

+0

जिथब पर संबंधित समस्या: [परीक्षण के उदाहरण पर विचार करें] (https://github.com/fabpot/Twig/issues/553) –

+0

@ डैनली धन्यवाद, यह दिलचस्प है लेकिन मुझे समझ में आता है कि पीआर को बिना विलय किए बंद क्यों किया गया है क्योंकि यह PHP और Twig के बीच एक तरह का मिश्रण की तरह दिखता है। –

+0

हां वास्तव में, यह वास्तव में दृश्य का व्यवसाय नहीं है। सोचा कि अगर आप वास्तव में 'exampleof' ऑपरेटर को कार्यान्वित करना चाहते हैं तो इससे मदद मिल सकती है। –

उत्तर

25

शायद ऐसा करने का सबसे अच्छा तरीका नहीं है, लेकिन मुझे मेरी समस्या का समाधान मिला।

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

एक DateTime पीएचपी वस्तु एक सार्वजनिक getTimestamp विधि है, यह अगर चर एक तारीख इस संपत्ति या सेट नहीं है कि क्या है की जाँच करने के लिए एक तरीका है।

+0

+1 मैं कहूंगा कि ऐसा करने का एक बिल्कुल बढ़िया तरीका है, आपको किसी प्रकार का सशर्त कथन की आवश्यकता होगी जब तक कि आप एक टवीग एक्सटेंशन बनाना नहीं चाहते – Prisoner

+0

आप 'date()' जैसे कॉल करने की कोशिश कर सकते हैं: 'date (my_var)? my_var | तिथि ('डी/एम/वाई'): my_var'। – cheesemacfly

+3

'परिभाषित' भाग को टिग में एक [टेस्ट] (http://twig.sensiolabs.org/doc/templates.html#test-operator) कहा जाता है। शायद आप [अपना खुद का] जोड़ सकते हैं (http://twig.sensiolabs.org/doc/advanced.html#tests) को 'a_date' कहा जाता है, और कुछ ऐसा करें जैसे {my% अगर my_var 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 %} 

दूसरे मामले एक मैं हाल ही में क्योंकि प्रोपेल ORM वस्तुओं का उपयोग करने के साथ संघर्ष किया था। बेस क्लास में __call विधि है जो सभी Twig is defined परीक्षणों को पकड़ती है।

संबंधित मुद्दे