2016-04-25 66 views
2

我有以下的樹枝模板:使用祖父母塊

{# layout.twig #} 

{% block content %} 
    THIS IS LAYOUT 
{% endblock %} 

{# secondary_layout.twig #} 

{% extends layout.twig %} 
{% block content %} 
    THIS IS SECONDARY_LAYOUT 
{% endblock %} 

{# mypage.twig #} 
{% extends secondary_layout.twig %} 

{% block content %} 
    {# I WOULD LIKE TO USE layout content block here #} 
{% endblock %} 

我可以調用父()在mypage.twig內容分塊內,但如何使用祖父母代替?

回答

2

寫我有一個解決問題的好了,只需修改secondary_layout

{# secondary_layout.twig #} 

{% extends layout.twig %} 
{% block content %} 
    {% if use_layout_block %} 
     {{ parent() }} 
    {% else %} 
     THIS IS SECONDARY_LAYOUT 
    {% endif %} 
{% endblock %} 

{# mypage.twig #} 
{% extends secondary_layout.twig %} 

{% block content %} 
    {% set use_layout_block = true %} 
{% endblock %} 

它可以幫助別人。

如果有人得到另一種解決方案,隨時回答。

+0

我甚至猜測這是實現它的唯一方法 – DarkBee

+0

不幸的是,如果中間的樹枝是一個你正在擴展並且不想直接編輯它的包文件,這並沒有什麼幫助。 – caponica

+0

@caponica這也正是我的問題。但是Med的解決方案給了我一個好主意。我通過在塊內添加使用語句來解決問題。 Inside {#mypage.twig#} {%block content%} add {%「layout.twig」%} – Martin

4

有些情況下,您可以實現此目的。不幸的是不在你的情況。但是,如果僅使用「橫向重用」(use關鍵字),但不適用於繼承(extends),則此功能起作用。這例如適用於表單主題。

在我的情況下,我定義了一個從引導3表單主題繼承的表單主題。引導主題本身繼承自「form_div_layout」。我想覆蓋選擇小部件,幷包含祖父的(form_div_layout)塊內容,因爲在這種情況下,塊的引導版本不適合我。所以基本上是一個非常類似的問題。

這可以從兩個繼承來解決,父(bootstrap_3_layout)和盛大父佈局(form_div_layout),而定義別名爲盛大父塊被重寫:

{# my_form_theme.html.twig #} 

{% use 'form_div_layout.html.twig' with choice_widget_collapsed as base_choice_widget_collapsed %} 
{% use 'bootstrap_3_layout.html.twig' %} 

{% block choice_widget_collapsed -%} 
    {# There is no "grandparent()" function, so instead we can do this: #} 
    {{- block('base_choice_widget_collapsed') -}} 
{%- endblock %} 

我寫這個答案,儘管它沒有回答實際的問題。但是當其他人也可能會發現這個問題,當谷歌搜索這樣一個「祖父母」特徵,也許他們會放棄不必要的,當他們說,這是不可能的。