我在客户端和服务器之间共享模板,并希望在脚本标记内输出原始模板,这可以逐字逐句。
http://twig.sensiolabs.org/doc/tags/verbatim.html
然而,如果将其作为包含的过滤器应用会更好,但似乎不可能?
如果我错过了明显的功能,我很想知道这件事。
答案 0 :(得分:12)
我遇到了同样的问题,这个页面出现在我的搜索结果中。在回答这个问题之后,Twig开发人员将这个功能添加到了库中。我想我应该为未来的搜索者添加一些细节。
使用source
函数完成包含原始文本(也就是使用与Twig相同的语法的客户端模板)的功能。
即:{{ source('path/to/template.html.twig') }}
答案 1 :(得分:1)
我也在寻找类似的东西,因为我正在使用Twig.js与Symfony一起进行客户端模板化。我试图在服务器端代码和客户端代码之间共享模板,因此我需要在某些情况下解析内容并在其他情况下逐字处理,这被证明有点棘手。
我找不到任何内置在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的回答here。希望有所帮助!