2014-10-29 24 views
0

我正在從佈局文件導入宏,並在該宏內部定義了幾個小塊塊。樹枝:無法覆蓋在宏中定義的塊

當我在一個新的'視圖'文件中擴展我的'基'佈局文件時,我無法覆蓋我在宏中定義的塊的內容。

這是一個非常簡化的最小版本的用例。

結構:

base.twig

{% import 'macros' as macros %} 
<section> 
    {{ macros.render_sections() }} 

    {% block working %} 
     content1-default 
    {% endblock %} 
</section> 

macro.twig

{% macro render_sections() %} 
    <section> 
     {% block notworking %} 
     content2-default 
     {% endblock %} 
    </section> 
{% endmacro %} 

view.twig

{% extends "base" %} 

{% block working %} 
    content1-override 
{% endblock %} 

{% block notworking %} 
    content2-override 
{% endblock %} 

預期的行爲: 我希望看到「內容1,覆蓋內容2 - 覆蓋」在我的HTML。

實際發生的: 我看到「內容1,覆蓋內容2默認」

有沒有辦法來塊範圍傳遞給宏?

我已經嘗試在base.twig文件中定義宏,以排除導入功能,但這並沒有幫助。 ,而且顯然其他一切正常,因爲我可以看到被覆蓋的塊。

+0

即使它能工作,我認爲這將代表巨大的濫用宏。爲什麼不能在主模板中泄漏這些'{%block%}'語句? – 2014-10-29 15:50:53

+0

實際的用例是我有一個塊名稱的嵌套數組,我遞歸地使用宏遍歷數組並渲染塊{{block(array_item)}}。所以宏本身更復雜,有for循環,if和遞歸。 – Rodik 2014-10-29 15:52:40

回答

7

你應該瞭解的樹枝的內部:

  • 所有枝條文件被轉換爲PHP類

  • {% extends %}對於litteral PHP extends(用於繼承)的等價物。

  • {% import %}您的上下文的屬性分配給類型的「樹枝文件要導入」

  • 塊比PHP方法不多,和本機PHP繼承讓你覆蓋的樹枝塊甜美的對象。

因此,考慮到這一點,你的轉換樹枝的代碼看起來就像這樣:

class base { 

    public function display() { 
     $context['macros'] = new macros(); 
     $context['macros']->render_sections(); 
     echo '<section>'; 
     echo $this->blockWorking(); 
     echo '</section>'; 
    } 

    public function blockWorking() { 
    echo "content1-default"; 
    } 

} 

class macros { 

    public function render_sections() { 
    echo '<section>'; 
    echo $this->blockNotWorking(); 
    echo '</section>'; 
    } 

    public function blockNotWorking() { 
    echo "content2-defualt"; 
    } 

} 

class view extends base { 

    public function blockWorking() { 
    echo "content1-override"; 
    } 

    public function blockNotWorking() { 
    echo "content2-override"; 
    } 

} 

$view = new view(); 
$view->display(); 

你可以清楚地看到這裏觀看等級的blockNotWorking()方法再也沒能改寫宏的方法。