2013-05-18 89 views
2

我正在使用Twig和Symfony2框架分開,將其更小地滾動以更好地滿足我(感知的)需求。我的框架的一部分是管理js/css依賴關係的資產管理庫,並且在預處理,合併,縮小,gzipping之後,輸出適當的<link><script>標籤以放置在<head><body>的底部。推遲Twig中的執行/完成

資產助手只有三個公共職能:require_asset($asset),render_head()render_bottom()。第一個是在不同的模板部分中謹慎使用(我想保持資源在應用程序邏輯之外的加載,因此在樹枝模板中)。在需要所有資產之後需要調用另外兩個資產,並且(在資產管理者完成其工作之後)返回適當的標籤並將其放置在模板中。

一切正常模板擴展基礎的模板:

base.twig:

<!DOCTYPE html> 
<html> 
    <head> 
     <meta charset="utf-8"> 
     <title>{{ title }}</title> 
     <!--[if lt IE 9]><script src="//html5shiv.googlecode.com/svn/trunk/html5.js"></script><![endif]--> 
     {{ Assets.headAssets }} 
    </head> 
    </body> 
     {% block body %} 
     {% endblock %} 
     {{ Assets.bottomAssets }} 
    <body> 
</html> 

這裏{{ Assets.headAssets }}{{ Assets.bottomAssets }}是通過先前聲明的樹枝全局變量Assets調用上述render_head()render_bottom()方法;

在我的情況下,這個基本模板是從test.twig擴展:

{% extends "base.twig" %} 
{% import "forms.twig" as forms %} 

{% block body %} 
    {{ Assets.requires('formtest.css') }} 
    {{ Assets.requires('testscript.js') }} 
    <form method="post"> 

     {{ forms.form(form) }} 

     <input type="submit"/> 
    </form> 

{% endblock %} 

這裏,{{ Assets.requires('formtest.css') }}{{ Assets.requires('testscript.js') }}指示資產助手通過調用require_asset($asset)包括由該模板所需的CSS和JS。

通常情況下,如果在樹枝外完成,輸出函數將在需要所有需要的資產後調用最後一次。這按預期工作。

我遇到的問題與從樹枝模板執行這些函數的順序有關。由於base.twig首先被調用,並且包含對輸出函數的調用,所以在從擴展模板或包含的塊/宏進行任何需求之前調用它們。正因爲如此,結果是空的,並沒有考慮到這些新的要求。

儘管解決此問題的一種方法是在Twig返回渲染後計算輸出,並將其替換爲返回的結果。這工作,但我覺得不夠優雅。

我想知道是否有一種方法推遲執行{{ Assets.headAssets }}{{ Assets.bottomAssets }},直到枝條完成其他任何事情。有什麼辦法可以實現這一目標嗎?

回答

2

,我認爲這會工作:

base.twig

{% set bodyContent %} 
    {% block body %}{% endblock body %} 
{% endset %} 
<!DOCTYPE html> 
<html> 
    <head> 
     <meta charset="utf-8"> 
     <title>{{ title }}</title> 
     <!--[if lt IE 9]><script src="//html5shiv.googlecode.com/svn/trunk/html5.js"></script><![endif]--> 
     {{ Assets.headAssets }} 
    </head> 
    </body> 
     {{ bodyContent }} 
     {{ Assets.bottomAssets }} 
    <body> 
</html> 

其他文件可以修改。

正如你所看到的,塊bodybase.twig模板中非常先調用,所以你的所有資產在執行到{{ Assets.headAssets }}時已經被要求調用。

+0

它工作正常,但在一個稍微無關的注意,在使用'身體content'作爲解析錯誤一根樹枝不同的結果,因爲'-'被暗示爲減法運算。冒着修理它的自由。 – Andri

+0

@Andri如果有答案的問題,只是離開OP發表評論我要修復它。 – 2014-03-26 12:27:08

2

對於那些仍然在尋找一個答案,我寫了一個Twig extension允許推遲塊渲染。