2015-03-24 3 views
8

तो, मेरे पास 3 टेम्पलेट्स हैं: 1. कुछ पैरा के साथ एम्बेड विजेट, 2. प्रत्येक पृष्ठ के लिए वैश्विक लेआउट, 3. एकल पृष्ठ।TWIG - एम्बेड एम्बेड के अंदर ब्लॉक को ओवरराइड कैसे करें, लेकिन बाल टेम्पलेट में?

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

file: Widget/awesome.html.twig (विजेट एम्बेड)

<div id="{{id|default('awesomeWidget')}}"> 
    {% block widget_body %} 
    {% endblock %} 
</div> 

file: Layout/layout.html.twig

{% block layout_body %} 
    {% embed 'AcmeFoobarBundle:Widget:awesome.html.twig' with 
      {'id':'myAwesomeWidget'} only %} 
     {% block widget_body %} 
      {% block I_WANT_TO_OVERRIDE_THIS %} 
      {% endblock %} 
     {% endblock %} 
    {% endembed %} 
{% endblock %} 

file: Portal/page.html.twig

{% extends 'AcmeFoobarBundle:Layout:layout.html.twig' %} 

{% block I_WANT_TO_OVERRIDE_THIS %} 
    Hello World 
{% endblock %} 

इस इस विचार किसी भी तरह ऐसा करना संभव है?

उत्तर

15

आप ऐसा नहीं कर सकते हैं। एम्बेड करें जैसे कार्यों को शामिल और विस्तारित करता है, ताकि ब्लॉक I_WANT_TO_OVERRIDE_THIS वास्तव में आपके 'विस्तारित' awesome.html.twig 'में हो। पृष्ठ layout.html.twig को विस्तारित नहीं कर रहा है, इसलिए पेज.html

के लिए कोई I_WANT_TO_OVERRIDE_THIS ब्लॉक नहीं है, आपको इसे अपने विजेट के लिए प्लेसहोल्डर रखने और पेज.html.twig स्तर पर एम्बेड करने पर विचार करना चाहिए।

तुम सच में इस तरह की जरूरत है, तो आप अंत में इसे इस तरह कर सकते हैं: layout.html.twig में:

{% set overrideWidgetPart %} 
    {% block I_WANT_TO_OVERRIDE_THIS %}{% endblock %} 
{% endset %} 

{% block layout_body %} 
    {% embed 'AcmeFoobarBundle:Widget:awesome.html.twig' with 
      {'id':'myAwesomeWidget', overrideWidgetPart: overrideWidgetPart } only %} 
     {% block widget_body %} 
      {{ overrideWidgetPart }} 
     {% endblock %} 
    {% endembed %} 
{% endblock %} 
+1

आप प्रतिभाशाली हैं! – user3383675

+1

क्या यह "ओवरराइड WidgetPart: ओवरराइड WidgetPart" वास्तव में ned है? मैंने इसे एक ही समस्या पर लागू किया और उस भाग को हटा दिया, और यह काम करता है। धन्यवाद :) – Diguin

+1

@ डिगुइन को अंतिम परिणाम के संदर्भ में इस स्निपेट में उनके लिए कोई आवश्यकता नहीं है लेकिन विचार आपके टेम्पलेट में दिखाई देने के लिए अवांछित चर को प्रतिबंधित करना है। विचार करें कि आपके पास अलग-अलग चर के गुच्छा हैं। नाम टकराव से बचने और डीबगिंग को सरल बनाने के लिए आप उन्हें अपने टेम्पलेट तक पहुंचने से रोक देंगे। '{{}} केवल 'का उपयोग करना हमेशा एक अच्छा अभ्यास है। – ivkremer

1

स्वीकार किए जाते हैं जवाब मुझे एक ऐसी ही मामले में जहां मैं एक का उपयोग कर रहा यह पता लगाने में मदद की एक एम्बेड के अंदर एम्बेड करें और मैं बच्चे एम्बेड ब्लॉक में एचटीएमएल इंजेक्ट करने में सक्षम होना चाहता था।

यदि आप users.html में देखते हैं तो आप देखेंगे कि मैं {% set footer %}{% endset %} का उपयोग करता हूं जो मुझे बच्चे को एम्बेड करने में मदद करता है {% block footer %} ब्लॉक।

users.html

{% embed 'user_widget.twig' 
    with { user: user } only %}   
    {% set footer %} 
     <div class='footer'>content here</div> 
    {% endset %} 
{% endembed %} 

user_widget.twig

{% embed 'user_widget.tpl' with { 
    open: true, 
    id: user.uid 
}%} 
    <div class='user_header'>{{ user.name }}</div>  
    {% block content %} 
     {% embed "user_info.twig" with { 
      id: user.id, 
      photo: user.picture, 
      footer_html: footer} only %} 
       {% block footer %}{{ footer_html }}{% endblock %} 
     {% endembed %} 
    {% endblock %} 
{% endembed %} 

user_info.twig

<div class='user_info' id='{{ id }}'> 
    <img class='user_photo' src='{{ photo }}'>  
    {% block footer %}{% endblock %} 
</div> 
संबंधित मुद्दे