2

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

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

但是,如果这可以作为过滤器应用到包含中会更好,但它似乎不可能?

我是 Twig 的新手,如果我错过了明显的功能,请原谅。

4

2 回答 2

12

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

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

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

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

于 2014-03-29T16:49:04.580 回答
1

我也在寻找类似的东西,因为我正在使用 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。希望有帮助!

于 2013-06-12T14:17:48.877 回答