如何修剪正文(field_body)?


10

我已经为节点创建了一个视图,该视图将内容显示为呈现的实体。除其他外,我在树枝模板中输出body字段:

{{ content.field_body }}

现在,我想将文本限制为200个字符,并放置三个点。我已经测试了三种不同的方法来执行此操作,但是没有任何效果。问题是,每种方式也都计数和修剪HTML字符。

1:我在“管理显示”中添加了“修剪”格式=>文本有限,但不正确。而且我没有三个点。

2:我修剪了树枝模板中的文本。但是要计算文字数,我必须先渲染它。因此,twig将文本输出为HTML(我在页面上看到HTML标签!)

{% set text = content.field_body|render %}
{{ text|length > 200 ? text|slice(0, 200) ~ '...' : text }}

3:我试图解决template_preprocess_node()中的问题。在这里,我在计算HTML标记方面也有同样的问题。

$body_text = $node->get('field_body')->getValue()[0]['value'];
$trimmed_text = substr($body_text, 0, 200) . '...';

如何正确修剪文字?

非常感谢您的帮助!

Answers:


18

您可以尝试几种解决方案,但请注意,使用html截断字符串通常是一个坏主意,因为可能存在未封闭或格式错误的标记。

1.使用| raw将html输出为html,可能会产生格式错误的标记:

{% set text = content.field_body|render %}
{{ text|length > 200 ? text|slice(0, 200)|raw ~ '...' : text|raw }}

2.首先去除html,更清洁:

{% set text = content.field_body|render|striptags %}
{{ text|length > 200 ? text|slice(0, 200) ~ '...' : text }}

3.注册一个树枝扩展名(未试用):

https://gist.github.com/leon/2857883

您可以签出的另一个有用的扩展名是Text扩展名,它可以帮助您避免切碎单词:

http://twig.sensiolabs.org/doc/extensions/text.html


2
第一个解决方案格式不正确的标签,第二个解决方案剥离所有html标签。
Yusef

1
@zhilevan是,如答案中所述。
squall3d

1
@ squall3d您如何解决不带条形html的问题?
Yusef

1
@zhilevan通常在我要显示截断的文本时,通常是出于预告片的目的,而我很少需要html。但是,如果您确实需要保留html,可以尝试以下扩展:gist.github.com/leon/2857883
squall3d

1
如果我在主体字段中使用图像。No 2不适用于图像。还有其他代码,也将打印图像
吗?logeshvaran

5

现在,您可以使用twig_extender模块并使用|truncate

这是一个如何在.twig模板中使用它的示例,请注意,我也在使用twig_field_value

{{ content.field_name|field_value|first['#text']|truncate(15, true, '....') }}

注意: 我通常将我的开发设置(./admin/config/development/devel)设置为使用Symfony var- dumper,并可以通过

即: {{ devel_dump(content.field_name|field_value) }}


4

改进之处:

  1. 如果你带的标签,你应该|trim摆脱空白
  2. 在单词边界上修剪 -参见下文slice()split()
  3. 使用省略号…)而不是“ ...”
  4. |raw 输出

{% set text = content.field_header_intro|render|striptags|trim %}

{{ (text|length > 200 ? text|slice(0, 201)|split(' ')|slice(0, -1)|join(' ') ~ '&hellip;' : text)|raw }}</code>


3

这就是我的处理方式。

示例:
field--node--body--article.html.twig

{% set mode = element['#view_mode'] %}
...
{% for item in items %}
  {% if mode == 'full' %}
    <div{{ attributes.addClass('texto') }}>{{ item.content }}</div>
  {% elseif mode == 'teaser' %}
    {# if there is something about trim_length in field formatter #}
    {% if item.content['#text_summary_trim_length'] %}
      {# first remove html tags then you slice with trim_length #}
      {% set texto = item.content['#text']|striptags|slice(0, item.content['#text_summary_trim_length']) %}
      <p {{ attributes }}>{{ texto }}...</p>
    {% else %}
      <p {{ attributes }}>{{ item.content }}</p>
    {% endif %}
  {% endif %}
{% endfor %}
...
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.