2015-03-24 11 views
8

Mam więc 3 szablony: 1. Osadź widget z kilkoma parametrami, 2. Globalny układ dla każdej strony, 3. Pojedyncza strona.TWIG - Jak przesłonić blok wewnątrz osadzania, ale w szablonie podrzędnym?

Chcę utworzyć blok w układzie, który byłby nadpisany przez stronę, ale gdy chcę umieścić ten blok wewnątrz widgetu Umieść, to nie działa.

file: Widget/awesome.html.twig (widget HTML)

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

Czy to możliwe, aby zrobić jakoś ten pomysł?

Odpowiedz

15

Nie możesz tego zrobić. Osadź prace takie jak include i extends, dzięki czemu blok I_WANT_TO_OVERRIDE_THIS znajduje się w twoim "rozszerzonym" pliku awesome.html.twig. Strona rozciąga layout.html.twig nie jest niesamowita, więc nie ma bloku I_WANT_TO_OVERRIDE_THIS dla strony.html

Należy rozważyć zmianę tego ustawienia, tak aby zawierał element zastępczy widgetu i osadzał go na poziomie page.html.twig.

Jeśli naprawdę potrzebujesz w ten sposób można w końcu zrobić to tak: W 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

Jesteś geniuszem! – user3383675

+1

Czy to "overrideWidgetPart: overrideWidgetPart" naprawdę działa? Zastosowałem to do podobnego problemu i usunąłem tę część, i to działa. Dzięki :) – Diguin

+1

@Diguin nie ma dla nich potrzeby w tym fragmencie pod względem końcowego wyniku, ale chodzi o ograniczenie niepożądanych zmiennych do pojawienia się w szablonie. Weź pod uwagę, że masz wiele różnych zmiennych na zewnątrz. Raczej uniemożliwisz im dotarcie do twojego szablonu, aby uniknąć kolizji nazw i uprościć debugowanie. Używanie 'with {...} only' jest zawsze dobrą praktyką. – ivkremer

1

Zaakceptowanych odpowiedź pomógł mi dowiedzieć się podobny przypadek, w którym używam osadzić wewnątrz osadzania i chciałem móc wstrzyknąć html do bloku embed dla dzieci.

Jeśli spojrzysz w users.html zobaczysz, że używam {% set footer %}{% endset %}, co pozwala mi przekazać kod HTML do bloku emulacji podrzędnego {% 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> 
Powiązane problemy