Як обрізати текст тіла (field_body)?


10

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

{{ content.field_body }}

Тепер я хотів би обмежити текст до 200 символів і поставити три крапки. Я перевірив три різні способи зробити це, але нічого не вийшло. Проблема полягає в тому, що кожен спосіб також підраховує та обрізає символи HTML.

1: Я додав формат "Обрізаний" у "Керування дисплеєм" => Текст обмежений, але не правильний. І у мене немає трьох крапок.

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


2
перше тег із неправильним формуванням рішення та другий тег рішення видаляють усі теги HTML
Юзеф

1
@ zhilevan yep, як описано у відповіді.
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, '....') }}

Примітка: я зазвичай зберігаю свої налаштування розробки (./admin/config/development/devel), встановлені для використання var-dumper Symfony і можу з’ясувати ланцюг із

тобто: {{ 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

Ось як я впорався з цим.

Приклад:
поле - вузол - тіло - 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 %}
...
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.