Patternlab / Twig 变量插值不适用于来自 json 的字符串

Patternlab / Twig Variable Interpolation doesn't work with string from json

我正在从事一个基于 twig patternlab 框架的项目。我的大部分内容都使用 JSON 文件,尤其是页面。

我想将 link(由原子构建)集成到我从 JSON 文件中获得的文本中,该文件具有 link 的占位符。我正在处理来自多语言 cms 的文本,因此将占位符放入文本内容是保持其灵活性的最简单方法。

这是我的 json 文件的摘录

{
    "legal" : "Mit dem Absenden des Formulars akzeptieren Sie unsere #{ legalLink }.",
    "deeplink" : {
        "label" : "Datenschutzbedingungen",
        "url" : "#AGB_link"
    }
}

这是我的树枝模板

{# __ build the link __ #}
{% set legalLink %}
    {% include "atoms-link" with contact.deeplink %}
{% endset %}

{# __ set up the string with interpolation placeholder __ #}
{% set legalText_a = "Mit dem Absenden des Formulars akzeptieren Sie unsere #{ legalLink }." %}
{% set legalText_b = contact.legal %}
{% set legalText_c %}
    {% include contact.legal %}
{% endset %}

{# __ dump to check/debug how it comes out __ #}
{{ dump (legalText_a) }}<hr>
{{ dump (legalText_b) }}<hr>
{{ dump (legalText_c) }}<hr>

{# __ output the result __ #}
<p>A) {{ legalText_a|raw }}</p>
<p>B) {{ legalText_b|raw }}</p>
<p>C) {{ legalText_c|raw }}</p>

这是我的结果(都转储了最后的html。

string(121) "Mit dem Absenden des Formulars akzeptieren Sie unsere Datenschutzbedingungen ."
string(69) "Mit dem Absenden des Formulars akzeptieren Sie unsere #{ legalLink }."
object(Twig_Markup)#2627 (2) { ["content":protected]=> string(78) " Mit dem Absenden des Formulars akzeptieren Sie unsere #{ legalLink }.   " ["charset":protected]=> string(5) "UTF-8" }

A) Mit dem Absenden des Formulars akzeptieren Sie unsere Datenschutzbedingungen.
B) Mit dem Absenden des Formulars akzeptieren Sie unsere #{ legalLink }.
C) Mit dem Absenden des Formulars akzeptieren Sie unsere #{ legalLink }.

选项 A 完美运行,当我将 twig set 与字符串一起使用时,插值开始并且所有内容都正确输出。但是我的模板代码中有一个字符串......那不是我想要的。

选项 B 是我第一次尝试使用 JSON 文件中的字符串,但是当我将 var 与字符串一起用于集合时,插值没有启动。我尝试了 |raw 的多种变体不知道还有什么,但结果总是一样的。

C选项也不行。使用带有 include 作为块的 twig set 将它变成 twig 标记代码,根据我最近的经验,这几乎不能用于任何事情。我仍然认为我会尝试一下。

有没有办法让插值工作,或者有没有更好的替代方法 twig/patternlab 来实现我想要实现的目标?

要解决此问题,您首先需要启用扩展 Twig_Extension_StringLoader。这使您可以访问函数 template_from_string,它使您能够在 twig 中使用 "create" 模板并(重新)启用您需要的字符串插值。

注册分机

$twig->addExtension(new Twig_Extension_StringLoader());

使用template_from_string达到预期效果

{% set legalLink = 'Datenschutzbedingungen' %}
{{ include(template_from_string('{{ "'~contact.legal~'" }}')) }}