2012-12-08 21 views
35

कल्पना कीजिए मैं अपने टहनी टेम्पलेटएक ब्लॉक एक टहनी टेम्पलेट में मौजूद रहने पर कैसे जांच करने के लिए - Symfony2

{% block posLeft %} 
    ----- 
{%endblock%} 

में कुछ इस तरह की है वहाँ बुला बिना posLeft ब्लॉक के अस्तित्व के लिए जाँच करने के लिए कोई तरीका है:

block("posLeft") 

और अस्तित्व को विविधता देने के लिए posBlock के वापसी मूल्य की जांच करें। मैं Symfony2 + Twig में एक नौसिखिया हूँ।

+3

आप ऐसा क्यों करना चाहते हैं? मुझे लगता है कि आप अपने विचारों में तर्क जोड़ रहे हैं जो शायद आपके नियंत्रक में है। यदि आप कुछ चर के आधार पर कुछ सामग्री प्रदर्शित करना चाहते हैं तो बस उस चर को अपने दृश्य में इंजेक्ट करें और फिर आवश्यकतानुसार विभिन्न ब्लॉक प्रदर्शित करें। – lifo

उत्तर

69

यदि आप सामग्री चाहते हैं तो केवल एक निश्चित ब्लॉक प्रदर्शित करना चाहते हैं, तो आप इसे इस तरह हल कर सकते हैं। आशा है, यह वही है जो आप खोज रहे हैं।

उदाहरण

{% set _block = block('dynamic') %} 
{% if _block is not empty %} 
    {{ _block|raw }} 
{% endif %} 

उदाहरण part.html.twig

{% extends "index.html.twig" %} 

{% block dynamic %} 
    Block content goes here. 
{% endblock %} 
+1

क्या इस के लिए टैग में कोई निर्मित नहीं है? ब्लॉक मान प्राप्त करना और इसे फिर से जांचना एक खाली स्ट्रिंग के लिए बहुत सारे कोड की आवश्यकता होती है। यह वास्तव में बदसूरत लग रहा है। –

+3

मुझे नहीं लगता कि एक और तरीका है। और जैसा कि @ लिफो ने कहा, आप शायद अपने टेम्पलेट्स में ज्यादा तर्क डाल रहे हैं। इस 2-पंक्ति विवरण को एक-पंक्ति जांच में न रखने के लिए सावधान रहें, क्योंकि इससे नए उप-अनुरोध हो सकते हैं। ट्विग Google समूह पर एक समान चर्चा यहां दी गई है: https://groups.google.com/forum/?fromgroups=#!topic/twig-users/FHDTknu5n2M – insertusernamehere

16

आप इसे इस तरह से कर सकते हैं index.html.twig:

{% if block('posLeft') %} 
    ... 
{% endif %} 

लेकिन ये यहां है यदि आप rendered ब्लॉक के आउटपुट की आवश्यकता है तो कुशल। तो आप ब्लॉक उत्पादन आप पहली जगह में चर के लिए असाइन करें और फिर दावे

+1

मुझे लगता है कि यह सबसे साफ तरीका है! – Dandy

+2

डाउनवॉटेड। टिप्पणी में लिंक देखें http://stackoverflow.com/questions/13774384/how-to-check-if-a-block-exist-in-twig-template-symfony2#comment19015938_13806784 – Im0rtality

+0

मेरे लिए वहां कभी-कभी "रिक्त स्थान" "ब्लॉक (बनाने के कारण)। इसलिए मैंने इसे उपयोग करके धीमा कर दिया: यदि ब्लॉक ('posLeft') | ट्रिम करें! = ' –

0

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

<body 
{% if block('ngapp') is not empty %}ng-app="{% block ngapp %}{% endblock %}"{% endif %} 
> 

यह मैं हूँ की अनुमति देता है बच्चे टेम्पलेट्स {% block ngapp 'myApp' %} घोषित करने और उसे अपने जनक रुप से प्रदर्शित होता है में।

इसकी आवश्यकता थी क्योंकि कुछ पृष्ठों पर मैं कोणीय को मैन्युअल रूप से बूटस्ट्रैपिंग कर रहा था (angular.bootstrap('moduleName', rootElement)) और कोणीय को खाली ng-app='' निर्देश पसंद नहीं है और अजीब तरीके से तोड़ता है।

2

पहले जांच कर लें, जो टहनी संस्करण आप अपने सिम्फोनी परियोजना के अंदर उपयोग कर रहे हैं, क्योंकि यहाँ जवाब केवल टहनी 1.

लिए कर रहे हैं आप टहनी 2 का उपयोग कर तुम भाग्यशाली हो रहे हैं। ट्विग प्रलेखन के अनुसार आप परिभाषित परीक्षण का उपयोग यह जांचने के लिए कर सकते हैं कि वर्तमान टेम्पलेट संदर्भ में ब्लॉक मौजूद है या नहीं।

{% if block("dynamic") is defined %} 
    ... 
{% endif %} 

मैं ब्लॉक अगर बयान के अंदर बुलाया जाता है, तो जाँच करने के लिए एक छोटे से TwigExtension लिखा है और यह टहनी अगर ब्लॉक exsists वास्तव में केवल चेकों की तरह लगता है और यह फोन नहीं करता है।

डॉक्स के लिए लिंक: http://twig.sensiolabs.org/doc/2.x/functions/block.html

अपने टहनी 1 का उपयोग कर रहे हैं, तो https://stackoverflow.com/a/13806784/6458657 पर वर्ष जवाब अभी भी सही है।

5

अन्य उत्तरों यहां twig 2.1 के लिए काम नहीं करते हैं (मैंने ~ 2 पर परीक्षण नहीं किया है।0), तो यहाँ एक छोटा सा अद्यतन है:

{% if block('dynamic') is defined %} 
    {{ block('dynamic')|raw }} 
{% endif %} 

नोट लाइन रेंडर करने के लिए है कि ब्लॉक है नहीं:

{% block dynamic %} 
    {# this wont work #} 
{% endblock %} 

यह अभ्यस्त काम क्योंकि ब्लॉक संकलन के दौरान रेंडर किया जाएगा, और इसलिए परीक्षण सच हो जाएगा कि यह मौजूद है (जैसा कि रनटाइम पर परीक्षण किया गया है)। इसलिए आपको ब्लॉक को {{ block('dynamic')|raw }} के साथ प्रस्तुत करना होगा क्योंकि यह वास्तव में टेम्पलेट में ब्लॉक को परिभाषित नहीं करता है।

+0

' कच्चे 'यहां अधूरा है, क्योंकि' ब्लॉक ('गतिशील') का उपयोग करने से पहले से ही बच निकलता है और इसे प्रदर्शित होने से पहले पहले एक चर पर सेट नहीं किया जा रहा है। – lookbadgers

5

टहनी 2.x

{{ (block("posLeft")) ?? '' }} 

आप एक ब्लॉक प्रदर्शित करने के लिए अगर यह एक पंक्ति में या परिभाषित नहीं कर रहा है चाहते हैं। थोड़ा सा झुकाव हो सकता है लेकिन अगर मैं तर्क के बिना किसी भी गुच्छा के बिना मेरी जरूरतों को पूरा करता हूं।

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