可以逐字地用于包含的内容吗?

时间:2013-02-22 10:46:55

标签: symfony twig

我在客户端和服务器之间共享模板,并希望在脚本标记内输出原始模板,这可以逐字逐句。

http://twig.sensiolabs.org/doc/tags/verbatim.html

然而,如果将其作为包含的过滤器应用会更好,但似乎不可能?

如果我错过了明显的功能,我很想知道这件事。

2 个答案:

答案 0 :(得分:12)

我遇到了同样的问题,这个页面出现在我的搜索结果中。在回答这个问题之后,Twig开发人员将这个功能添加到了库中。我想我应该为未来的搜索者添加一些细节。

使用source函数完成包含原始文本(也就是使用与Twig相同的语法的客户端模板)的功能。

即:{{ source('path/to/template.html.twig') }}

http://twig.sensiolabs.org/doc/functions/source.html

答案 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。希望有所帮助!