首页 > 解决方案 > Patternlab / Twig 变量插值不适用于 json 中的字符串

问题描述

我正在开发一个基于 twig 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 完美地工作,当我使用带有字符串的 twig set 时,插值开始并且一切都正确输出。但这就是我的模板代码中的一个字符串......这不是我想要的。

选项 B 是我第一次尝试使用 JSON 文件中的字符串,但是当我使用 var 和字符串作为集合时,插值不起作用。我尝试了多种变体 |raw 并且不确定还有什么,但结果是总是一样。

选项 C 也不起作用。使用 twig set 和 include 作为一个块将其转换为 twig 标记代码,从我最近的经验来看,这几乎不能用于任何事情。我还是想试试看。

有没有办法让插值工作,或者是否有一个很好的选择与 twig/patternlab 来获得我想要实现的目标?

标签: twigstring-interpolationpatternlab.io

解决方案


要解决此问题,您首先需要启用扩展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~'" }}')) }}

推荐阅读