2

私は 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 }}これを達成する方法はありますか?

4

2 に答える 2

2

まだ答えを探している人のために、ブロック レンダリングを延期できるようにするTwig 拡張機能を作成しました。

于 2014-05-14T11:56:01.087 に答える
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>

他のファイルは変更できません。

ご覧のとおり、テンプレートではbody最初に呼び出しをブロックbase.twigするため、実行が呼び出されたときにすべてのアセットが既に必要です{{ Assets.headAssets }}

于 2014-02-13T07:48:44.963 に答える