私は Symfony2 フレームワークとは別に Twig を使用しており、私の (認識された) ニーズにより適した小さなものに丸めています。私のフレームワークの一部は、js/css の依存関係を管理するアセット管理ライブラリであり、前処理、結合、縮小、gzip の後、適切な<link>
および<script>
タグを出力し、 の<head>
または の下部に配置し<body>
ます。
require_asset($asset)
アセット ヘルパーには、render_head()
との 3 つのパブリック関数しかありませんrender_bottom()
。最初のものは、さまざまなテンプレート パーツ全体で控えめに使用されます (アセットの読み込みをアプリケーション ロジックの外側、つまり twig テンプレートの内側に保持したい)。残りの 2 つは、すべてのアセットが要求された後に呼び出す必要があり、(アセット マネージャーが処理を行った後に) テンプレートに配置する適切なタグとタグを返します。
すべての通常のテンプレートは、ベース テンプレートを拡張します。
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 }}
and{{ Assets.bottomAssets }}
は、以前に宣言された Twig グローバル変数Assets
を介して、前述のrender_head()
andrender_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 %}
ここで、を呼び出して、このテンプレートに必要な css と js を含めるようにアセット ヘルパーに指示し{{ Assets.requires('formtest.css') }}
ます。{{ Assets.requires('testscript.js') }}
require_asset($asset)
通常、twig の外部で実行された場合、必要なすべてのアセットが要求された後、出力関数が最後に呼び出されます。これは期待どおりに機能します。
私が直面している問題は、小枝テンプレートからのこれらの関数の実行順序に関係しています。base.twig が最初に呼び出され、出力関数への呼び出しが含まれているため、これらは拡張テンプレートまたは含まれるブロック/マクロから要件が作成される前に呼び出されます。このため、結果は空であり、これらの新しい要件が考慮されていません。
この問題を解決する方法の 1 つは、Twig がレンダリングを返した後に出力を計算し、返された結果でそれらを置き換えることです。これは機能しますが、十分にエレガントではないと感じています。
小枝が他のすべてで完了するまで、{{ Assets.headAssets }}
およびの実行を延期する方法があるかどうか疑問に思っていました。{{ Assets.bottomAssets }}
これを達成する方法はありますか?