Patternlab / Twig变量插值不适用于JSON中的字符串

时间:2018-06-20 19:39:35

标签: twig string-interpolation patternlab.io

我正在研究一个基于树枝patternlab框架的项目。我的大多数内容都使用JSON文件,尤其是页面。

我想将链接(由原子构建)集成到从JSON文件中获得的文本中,该文本具有链接的占位符。我正在处理来自多语言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完美运行,当我使用带有字符串的细枝集时,插值开始,一切正常输出。但这在我的模板代码中包含一个字符串...那不是我想要的。

选项B是我第一次尝试使用JSON文件中的字符串,但是当我将var与字符串作为集合使用时,插值不会生效。我尝试了| raw的多个变体,但是不确定结果总是一样。

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

有没有一种方法可以使插值起作用,或者用twig / patternlab有一个很好的替代方法来获得我要实现的目标?

1 个答案:

答案 0 :(得分:1)

要解决此问题,您首先需要启用扩展名Twig_Extension_StringLoader。这使您可以访问函数template_from_string,该函数使您能够在twig内部“创建”模板并(重新)启用所需的字符串插值。

注册扩展名

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

使用template_from_string达到预期效果

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