6

我想自动包装一些 html,比如说<span data-id="..">当我调用{{ product.name }}我的 twig 模板时。

因此,当我使用 twig 模板时{{ product.name }},我希望输出为:<span data-type="product" data-id="8" data-prop="name">My product name</span>. 我不能使用 twig 过滤器或宏,因为我确实需要模板语法{{ product.name }},所以最终用户(模板设计者)不必关心它。

我需要这个的原因是因为我正在为树枝模板构建一个页面编辑工具,所以我需要从 HTML 中了解这些变量的上下文。

我试图覆盖Compiler那些Twig_Environment使用,但我似乎无法改变树枝变量节点的输出。

我怎样才能做到这一点?

编辑

我想提一下,我需要这个来使用{{ product.name }}语法,因为其他设计师将在 Symfony 2 之外使用这些模板。我想让几乎所有的 twig 变量在前端都可以编辑,所以带有过滤器或宏的解决方案确实可以工作,但它扼杀了我正在编写的平台的可用性和可读性。目前 twig 中没有公共 API 可以实现我想要的,这就是我摆弄 twig 编译器的原因。我没有必要的 Twig 内部知识来实现​​这一点。如果有人能指出我的方向,那就太好了!

更新 2

我找到了一个可以实现我想要的地方。每个GetAttr节点都编译为$this->getAttribute($someContext, "property"). 所以如果我可以改变编译的树枝模板的子类,我就可以实现我想要的。默认情况下,所有树枝模板都从Twig_Template. 我想扩展这个方法

如何更改所有已编译树枝模板的子类?

更新 3 我找到了一种将我自己的基类用于所有已编译的树枝模板的方法。我可以简单地将其设置为 twig 环境中的一个选项,请参阅此链接。我希望明天让它工作,我会发布一个关于我如何一起解决它的正确答案。不确定我将如何处理转义,因为这将在$this->getAttribute()调用之后发生。

4

3 回答 3

2

我认为是这类包装的最佳选择。

例如:

main.twig

{% import "macros.twig" as macros %}

{{ macros.display_product(product) }}

macros.twig

{% macro display_product(product) %}

  <span data-id="{{ product.id }}" data-prop="name">{{ product.name }}</span>

{% endmacro %}

Context

product:
     id: 8
     name: My Georgeous Product

Result

<span data-id="8" data-prop="name">My Georgeous Product</span>

小提琴

于 2015-12-11T12:56:20.420 回答
2

我已经通过PrintNodeVAR_START我自己的EditablePrintNode. 在该节点中,我遍历 print 节点编译的表达式并获取必要的属性路径,并将其作为参数传递给围绕由PrintNode.

于 2016-02-24T02:12:44.240 回答
0

我建议编写一个自定义过滤器。您可以在此处找到有关如何在您的环境中编写和配置的文档

// an anonymous function
$filter = new Twig_SimpleFilter('my_custom_product_filter', function ($product) {
    return '<span data-id="'.$product->getId().'" data-prop="name">'.$product->getName().'</span>';
});

您需要按照文档中的说明进行注册

那么你可以使用如下:

{{ myProduct|my_custom_product_filter}}

希望这有帮助

于 2015-12-10T14:18:38.100 回答