在Drupal 8树枝中将纯文本呈现为HTML


15

我碰到一堵墙,试图从纯文本字段将svg图像标记代码呈现为html。

我希望从纯文本字段呈现svg代码,而不会覆盖其他任何地方的纯文本字段呈现。

纯文本格式当前将所有html标记和<>转换为&lt; &gt;

我创建了一个字段模板,并尝试将字段内容输出为

{{ item.content.context.value }}

{{ item.content|raw }}

两者都将值呈现为用“引号”括起来的每一行的字符串,并将换行符转换为<br/>标签。

我以前使用的是字段类型格式化的文本,但是<pre>即使允许所有标签,它也将所有内容包装在标签中。我真的很想让它与纯文本一起使用。

字段必须以文本形式保存的svg代码示例:

<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
         viewBox="0 0 290 290" enable-background="new 0 0 290 290" xml:space="preserve">
    <g>
        <path fill="none" stroke="#78C681" stroke-width="3" stroke-miterlimit="10" d="M261.1,273.1H28.9c-6.6,0-12-5.4-12-12V28.9
            c0-6.6,5.4-12,12-12h232.1c6.6,0,12,5.4,12,12v232.1C273.1,267.7,267.7,273.1,261.1,273.1z"/>
        <circle fill="none" stroke="#1B435D" stroke-width="2" stroke-miterlimit="10" cx="145.2" cy="166.9" r="62.7"/>
        <line fill="none" stroke="#78C681" stroke-width="3" stroke-miterlimit="10" x1="16.9" y1="60.8" x2="273.1" y2="60.8"/>
        <circle fill="none" stroke="#1B435D" stroke-width="2" stroke-miterlimit="10" cx="178.3" cy="152.3" r="6.8"/>
        <path fill="none" stroke="#1B435D" stroke-width="2" stroke-linecap="round" stroke-miterlimit="10" d="M115.1,167.9
            c8.8,0,22.3,3.2,28.4,4.7"/>
        <path fill="none" stroke="#1B435D" stroke-width="2" stroke-linecap="round" stroke-miterlimit="10" d="M151.9,216.9
            c0,0,17.2-1.5,29.6-14.8"/>
    </g>
</svg>

希望有人能帮忙。

最好,

阿拉里


开箱即用的纯文本具有一个可以逃避标记的过滤器。|raw不会转义已经转义的标记。转义发生在Twig的自动逃生之前。
Cottser

Answers:


17

来自Drupal社区的iworkyon解决方案:

field--node-[field name] .html.twig:

{% if svg %}
  <div class="my-svg">
    {{ svg|raw }}
  </div>
{% endif %}

THEME.info:

/**
* Implements hook_preprocess_field().
*/
function MYTHEME_preprocess_field(&$variables, $hook) {
    switch ($variables['element']['#field_name']) {
      case 'field_svg_test':
        $variables['svg'] = $variables['items'][0]['content']['#context']['value'];
        break;
    }
}

呵呵,看起来像我的“我在工作” IRC昵称在这里:D谷歌搜索时的有趣发现!
ividyon

希望您不要介意:)它对我有所帮助,所以我想与您分享。
Alari Truuts

7

您是否尝试对值应用原始过滤器?

{{ item.content.context.value|raw }}

但这并不安全。要输出文件,可以使用文件字段。它具有正确的字段格式器来生成链接。如果您无法根据需要配置ui中的链接,则可以针对该特定字段修改细枝或预处理。


raw正在/已被移除:drupal.org/node/2603074
Clive

4k4:该字段是纯文本字段,而不是文件。该字段值将是svg图像的复制标记。我尝试了您的解决方案,但没什么不同,仍然出现引号引起来的换行和换行符的问题。另外,现在我担心在使用Clive所说的之后使用| raw,甚至离达成解决方案还很远。
Alari Truuts 2015年

您甚至还无法找到解决方案,因为您试图欺骗自动转义和drupal会尝试一切阻止您这样做。如我的答案所述,更好地使用提供文件链接的机制。然后在一行中使用适当的树枝模板更改渲染。
2015年

4k4:我现在有点困惑,因为该字段必须保存的内容不是文件。它采用文本/ svg代码的形式。我用一个例子更新了这个问题。
Alari Truuts 2015年

纯文本将无法输出此svg代码。如果可以处理svg代码,您是否尝试过文本格式“ Full Html”?如果不是,则最好将svg放入其自己的svg文件中。
2015年

6

这为我工作:

{{ item.content['#context'].value|raw }}
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.