クライアントとサーバー間でテンプレートを共有しており、逐語的に可能なスクリプトタグ内に生のテンプレートを出力したいと思います。
http://twig.sensiolabs.org/doc/tags/verbatim.html
しかし、これをインクルードへのフィルターとして適用できればもっといいのですが、それは不可能だと思われますか?
私は小枝に慣れていないので、明らかな機能を逃した場合はすみません。
クライアントとサーバー間でテンプレートを共有しており、逐語的に可能なスクリプトタグ内に生のテンプレートを出力したいと思います。
http://twig.sensiolabs.org/doc/tags/verbatim.html
しかし、これをインクルードへのフィルターとして適用できればもっといいのですが、それは不可能だと思われますか?
私は小枝に慣れていないので、明らかな機能を逃した場合はすみません。
同じ問題が発生し、検索結果にこのページが表示されました。この質問に答えてから、Twig開発者はこの機能をライブラリに追加しました。私は将来の検索者のためにいくつかの詳細を追加する必要があると考えました。
生のテキストを含める機能(Twigと同じ構文を使用するクライアント側テンプレート)は、この関数を使用して実行されsource
ます。
すなわち:{{ source('path/to/template.html.twig') }}
Symfonyと一緒にクライアント側のテンプレートにTwig.jsを使用しているので、私もこのようなものを探していました。サーバー側とクライアント側のコード間でテンプレートを共有しようとしていたため、コンテンツを解析する必要がある場合と、逐語的に扱う必要がある場合がありましたが、これは少し注意が必要でした。
これを支援するためにTwigに組み込まれているものは見つかりませんでしたが、幸いなことに、Twigを拡張して探しているものを取得するのは非常に簡単です。関数として実装しましたが、フィルターとしても実行できる場合があります。
services.yml
statsidekick.twig.include_as_template_extension:
class: StatSidekick\AnalysisBundle\Twig\IncludeAsTemplateExtension
tags:
- { name: twig.extension }
IncludeAsTemplateExtension.php
<?php
namespace StatSidekick\AnalysisBundle\Twig;
use Twig_Environment;
use Twig_Extension;
class IncludeAsTemplateExtension extends Twig_Extension {
/**
* Returns a list of global functions to add to the existing list.
*
* @return array An array of global functions
*/
public function getFunctions() {
return array(
new \Twig_SimpleFunction( 'include_as_template', array( $this, 'includeAsTemplate' ), array( 'needs_environment' => true, 'is_safe' => array( 'html' ) ) )
);
}
function includeAsTemplate( Twig_Environment $env, $location, $id ) {
$contents = $env->getLoader()->getSource( $location );
return "<script data-template-id=\"{$id}\" type=\"text/x-twig-template\">{$contents}</script>";
}
/**
* Returns the name of the extension.
*
* @return string The extension name
*/
public function getName() {
return 'include_as_template_extension';
}
}
Twigファイルでの使用法
{{ include_as_template( 'Your:Template:here.html.twig', 'template-id' ) }}
このようなTwigファイルがある場合:
<ul class="message-list">
{% for message in messages %}
<li>{{ message }}</li>
{% endfor %}
</ul>
出力は次のようになります。
<script data-template-id="template-id" type="text/x-twig-template">
<ul class="message-list">
{% for message in messages %}
<li>{{ message }}</li>
{% endfor %}
</ul>
</script>
この作品は、KariSöderholmのここでの回答から派生しています。お役に立てば幸いです。