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