2013-03-24 13 views
13

में मैं एक टहनी टेम्पलेट जहाँ मैं अगर एक आइटम एक निश्चित मूल्य"शुरू होने वाले" टहनी टेम्पलेट

{% if item.ContentTypeId == '0x0120' %} 
    <td><a href='?parentId={{ item.Id }}'>{{ item.BaseName }}</a><br /></td> 
{% else %} 
    <td><a href='?{{ item.UrlPrefix }}'>{{ item.LinkFilename }}</a></td> 
{% endif %} 

0x0120 इस 0x0120D52000D430D2B0D8DD6F4BBB16123680E4F78700654036413B65C740B168E780DA0FB4BX की तरह है कि तरह लग रहे या अधिक जटिल हो सकता साथ शुरू होता है परीक्षण करने के लिए करना चाहते हैं। एकमात्र चीज जो मैं करना चाहता हूं वह यह सुनिश्चित करना है कि यह 0x0120 से शुरू हो।

आदर्श समाधान रेगेक्स का उपयोग करके इसे हल करना होगा, लेकिन मुझे पता नहीं है कि टिग इसका समर्थन करता है या नहीं?

धन्यवाद

उत्तर

18

हाँ, टहनी तुलना में नियमित अभिव्यक्ति का समर्थन करता है: http://twig.sensiolabs.org/doc/templates.html#comparisons

आपके मामले में यह होगा:

{% if item.ContentTypeId matches '/^0x0120.*/' %} 
    ... 
{% else %} 
    ... 
{% endif %} 
+0

कूल! क्या रेगेक्स से मेल खाने वाले सभी सरणी तत्वों को लाने का कोई तरीका है? सरणी {% सरणी% में तत्व के लिए%} ?? – juanmf

+6

यह गलत है; यह '/^0x0120 होना चाहिए। */'' या समान। स्ट्रिंग सीधे PHP के 'preg_match' को पास कर दी जाती है, जो उन अतिरिक्त डिलीमीटरों की अपेक्षा करता है। – Timwi

+0

अब आप 'साथ शुरू' का उपयोग कर सकते हैं, नीचे उत्तर देखें। – benske

1

आप हमेशा अपना खुद का फ़िल्टर बना सकते हैं जो आवश्यक तुलना करता है।

docs के अनुसार:

जब टहनी से बुलाया, पीएचपी प्रतिदेय फिल्टर के बाईं ओर प्राप्त करता है (पाइप से पहले |) (पहला तर्क और फिल्टर करने के लिए पारित कर दिया अतिरिक्त तर्कों के रूप में कोष्ठक()) अतिरिक्त तर्क के रूप में।

तो यहां एक संशोधित उदाहरण है।

एक फ़िल्टर बनाने का एक PHP प्रतिदेय के साथ एक नाम जोड़ के रूप में सरल है:

// an anonymous function 
$filter = new Twig_SimpleFilter('compareBeginning', function ($longString, $startsWith) { 
    /* do your work here */ 
}); 

फिर, अपने टहनी पर्यावरण के लिए फ़िल्टर जोड़ें:

$twig = new Twig_Environment($loader); 
$twig->addFilter($filter); 

और यहाँ कैसे एक टेम्पलेट में इसका इस्तेमाल करने के लिए है:

{% if item.ContentTypeId | compareBeginning('0x0120') == true %} 
{# not sure of the precedence of | and == above, may need parentheses #} 

मैं एक PHP पुरुष नहीं कर रहा हूँ, तो मैं कैसे पीएचपी regexes करता है पता नहीं है, लेकिन अगर $longString गुमनाम समारोह ऊपर बनाया गया है सच वापस जाने के लिए $startsWith से शुरू होता है। मुझे यकीन है कि आपको लागू करने के लिए यह छोटा लगेगा।

6

आप केवल slice फ़िल्टर का उपयोग कर सकते हैं।सीधे शब्दों में कार्य करें:

{% if item.ContentTypeId[:6] == '0x0120' %} 
{% endif %} 
66

अब आप ऐसा कर सकते हैं टहनी में सीधे:

{% if 'World' starts with 'F' %} 
{% endif %} 

"एंड्स के साथ" भी समर्थित है:

{% if 'Hello' ends with 'n' %} 
{% endif %} 

अन्य काम कीवर्ड भी मौजूद हैं:

परिसर स्ट्रिंग तुलना:

{% if phone matches '{^[\\d\\.]+$}' %} {% endif %} 

(नोट: डबल बैकस्लैश टहनी से एक बैकस्लैश करने के लिए परिवर्तित कर रहे हैं)

स्ट्रिंग इसमें शामिल हैं:

{{ 'cd' in 'abcde' }} 
{{ 1 in [1, 2, 3] }} 

यहाँ अधिक जानकारी देखें: http://twig.sensiolabs.org/doc/templates.html#comparisons

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