我正在使用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 }}
,直到枝條完成其他任何事情。有什麼辦法可以實現這一目標嗎?
它工作正常,但在一個稍微無關的注意,在使用'身體content'作爲解析錯誤一根樹枝不同的結果,因爲'-'被暗示爲減法運算。冒着修理它的自由。 – Andri
@Andri如果有答案的問題,只是離開OP發表評論我要修復它。 – 2014-03-26 12:27:08