Как обрезать основной текст (field_body)?

10

Я создал вид для узла, который показывает контент как визуализированный объект. Среди прочего, я вывожу поле тела в шаблоне ветки:

{{ content.field_body }}

Теперь я хотел бы ограничить текст до 200 символов и поставить три точки. Я протестировал три разных способа сделать это, но ничего не помогло. Проблема в том, что каждый способ также учитывает и корректирует символы HTML.

1: Я добавил формат «Trimmed» в «Manage display» => Текст ограничен, но не корректен. И у меня нет трех точек.

2: я урезал текст в шаблоне ветки. Но чтобы посчитать текст, я должен сделать это первым. Таким образом, веточка выводит текст в виде 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) . '...';

Как я могу обрезать свой текст правильно?

Спасибо большое за помощь!

МАРКО-ы
источник

Ответы:

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

squall3d
источник
2
Первое решение искажает теги, а второе решение удаляет все HTML-теги.
Юсеф
1
@жилеван да, как описано в ответе.
squall3d
1
@ squall3d Какое у вас решение для нарезки без полоски htmls?
Юсеф
1
@zhilevan обычно, когда я хочу отобразить усеченный текст, это для тизера, где я редко хочу html. Но если вам нужно сохранить html, вы можете попробовать это расширение: gist.github.com/leon/2857883
squall3d
1
Если я использую изображение в поле тела. № 2, не работает для изображений. Есть ли какой-нибудь другой код, также будет напечатано изображение
logeshvaran
5

Теперь вы можете сделать это с помощью модуля twig_extender и использовать его |truncate.

Вот пример того, как использовать его в шаблоне .twig, обратите внимание, что я также использую twig_field_value :

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

примечание: я обычно держу свои настройки devel (./admin/config/development/devel) настроенными на использование Symfony var-dumper и могу определить цепочку с помощью

то есть: {{ devel_dump(content.field_name|field_value) }}

bdanin
источник
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>

Duncanmoo
источник
3

Вот как я справился с этим.

Пример:
поле - узел - тело - 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 %}
...
Vagner
источник