2015-03-24 22 views
8

Yani, 3 şablonum var: 1. Bazı paramlarla Embed Widget, 2. Her sayfa için genel düzen, 3. Tek sayfa.TWIG - Embed içerisindeki bloku nasıl geçersiz kılarsınız, ancak alt şablonda?

Sayfa tarafından geçersiz kılacak Layout'ta blok yapmak istiyorum, ancak bu bloğu Embed widget'ına koymak istediğimde, o zaman çalışmaz.

file: Widget/awesome.html.twig (Widget'ı yerleştir)

<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 %} 

bu şekilde bu fikri yapmak mümkün mü?

cevap

15

Bunu yapamazsınız. Yerleştirme, içerme ve genişletme gibi çalışır. Bu nedenle, I_WANT_TO_OVERRIDE_THIS bloğu aslında 'genişletilmiş' awesome.html.twig'tir. Sayfa, layout.html.twig alanını genişletmiyor, bu yüzden harika değil, bu yüzden page.html için bir I_WANT_TO_OVERRIDE_THIS bloğu yok

Widget'ınız için bir yer tutucu bulundurmak ve bunları page.html.twig düzeyinde gömmek için bunu değiştirmeyi düşünmelisiniz. Gerçekten bu şekilde gerekiyorsa

, sen böyle yapmak sonunda edebilirsiniz: layout.html.twig olarak:

{% 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

Sen Genius vardır! – user3383675

+1

Bu "overrideWidgetPart: overrideWidgetPart" gerçekten ned mi? Bunu benzer bir soruna uyguladım ve o kısmı çıkardım ve işe yarıyor. Teşekkürler :) – Diguin

+1

@Diguin, bu snippet'te son bir sonuç açısından onlara gerek yoktur, ancak bu fikir, istenmeyen değişkenlerin şablonunuzda görünmesini kısıtlamaktır. Dışarıda farklı değişkenlere sahip olduğunuzu düşünün. Adların çarpışmalarını önlemek ve hata ayıklamayı basitleştirmek için şablonunuza ulaşmasını engellemeyi tercih edersiniz. '' {...} ile sadece 'kullanmak her zaman iyi bir uygulamadır. – ivkremer

1

kabul cevap bana bir kullanıyorum benzer bir durum anlamaya yardımcı bir embedin içine gömülmüş ve ben çocuk embed bloğunda html enjekte edebilmek istedim.

Eğer users.html dosyasına bakarsanız, {% set footer %}{% endset %} numaralı telefonu kullanıyorum, bu da html'yi {% block footer %} bloğuna yerleştirmeme izin veriyor.

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> 
İlgili konular