私は Symfony2 のプロジェクトに取り組んでおり、メイン ビューの 1 つに含める必要があるいくつかの小さな html があります。公式の Twig ドキュメントによると、単純に使用できるはずです{% include 'filename.html' %}
が、Symfony では、ファイル名が「.html.twig」で終わらない限り、ファイルが見つからないというエラーがスローされます。{% raw %}
これらのファイルには動的コンテンツがなく、たくさんの二重中括弧 (JavaScript テンプレート) がなく、テンプレート デザイナーがこれらのファイルをすべてタグでラップする必要があるため、これらのファイルに Twig テンプレートを使用するのは避けたいと思います。それを行うための厄介な方法。
4 に答える
また、Twig テンプレートに生のファイル (mustache テンプレート) を含めるための解決策を見つけようとして同じ問題に遭遇したため、Twig はそれらを解析しようとしません。
最初は、口ひげのテンプレート ファイルに sometemplate.html という名前を付けて、{% raw %}
タグで囲みました。これはしばらくの間うまくいきましたが、その後、PhpStorm IDE を Handlebars プラグイン (口ひげの構文用) と共に使い始めました。PhpStorm がファイルを口ひげ構文として認識するためには、一意のファイル拡張子 (.mustache
デフォルト) が必要なので、sometemplate.html の名前を sometemplate.mustache に変更しましたが、口ひげテンプレートを Twig でラップする必要があるという考えが本当に嫌いでした。タグ。だから私は@rdjsがオプション3で言ったことをやった。これが最善の解決策です。
これが私が作った動作中のTwig拡張関数です:
function twig_include_raw(Twig_Environment $env, $template) {
return $env->getLoader()->getSource($template);
}
$twig->addFunction('include_raw', new Twig_Function_Function('twig_include_raw', array('needs_environment' => true)));
これを行うと、Twig がファイルを解析することなく、ファイルを「生」として簡単に含めることができます。
{{ include_raw('sometemplate.mustache')|raw }}
口ひげのテンプレートを HTML の head セクションに簡単に含めるための Twig マクロも作成しました。
{% macro mustache_script(id, file) -%}
<script id="{{ id }}" type="text/x-mustache-template">
{{ include_raw(file)|raw }}
</script>
{%- endmacro %}
上記のマクロを含むファイルを Twig テンプレート (たとえば) にインポートした後、HTMLセクション内で{% import "macros.twig" %}
実行するだけで、Twig テンプレートに口ひげテンプレート ファイルを簡単にインポートできます。{{ mustache_script('sometemplate_tpl', 'sometemplate.mustache') }}
<head>
これが同じ問題の解決策を探している人の助けになることを願っています。
小枝ファイル拡張子の簡単な要約 (ドキュメントから取得):
すべてのテンプレート名には、そのテンプレートの形式とエンジンを指定する 2 つの拡張子もあります。
AcmeBlogBundle:Blog:index.html.twig - HTML format, Twig engine
AcmeBlogBundle:Blog:index.html.php - HTML format, PHP engine
AcmeBlogBundle:Blog:index.css.twig - CSS format, Twig engine
デフォルトでは、Symfony2 テンプレートは Twig または PHP で記述でき、拡張子の最後の部分 (.twig または .php など) は、これら 2 つのエンジンのどちらを使用するかを指定します。拡張子の最初の部分 (.html、.css など) は、テンプレートが生成する最終的な形式です。
したがって、エラーが発生しなくても、ファイルを .html として含めることは少なくともあいまいであることは理にかなっています。
したがって、次の 3 つの選択肢があります。
ファイルが純粋な JavaScript である場合は、それらをスクリプト タグとしてページに含めます。
HTML と JS が混在している場合は、JS を {% raw %} でエスケープし、ファイルを foo.html.twig テンプレートとして含めます。このように多くのスクリプトが含まれている場合、おそらく設計者は少しリファクタリングを行い、スクリプトの大部分を外部ファイルに移動できます (オプション 1 を参照)。
本当に主張するのであれば、生の HTML ファイルをインクルードする Twig エクステンションをいつでも書くことができます。(編集: このオプションの詳細については、以下の @Haprog の回答を参照してください)。
{{ include_html('foo/bar.html') }}
UPDATE 2015 twig は source 関数を追加しました:
{{ source('AcmeSomeBundle:Default:somefile.html.twig') }}
オプション 4 については、以下のコメントで @Nigel Angel に感謝します。