Jak przyciąć tekst (body_body)?

10

Utworzyłem widok dla węzła, który pokazuje zawartość jako renderowany byt. Między innymi wyprowadzam pole ciała w szablonie gałązki:

{{ content.field_body }}

Teraz chciałbym ograniczyć tekst do 200 znaków i umieścić trzy kropki. Testowałem trzy różne sposoby, aby to zrobić, ale nic nie działało. Problem polega na tym, że każdy sposób liczy i przycina również znaki HTML.

1: Dodałem format „Przycięty” w „Zarządzaj wyświetlaniem” => Tekst jest ograniczony, ale niepoprawny. I nie mam trzech kropek.

2: Obciąłem tekst w szablonie gałązki. Ale żeby policzyć tekst, muszę go najpierw wyrenderować. W ten sposób gałązka wyświetla tekst jako HTML (widzę tagi HTML na mojej stronie!)

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

3: Próbowałem rozwiązać problem w template_preprocess_node (). Tutaj mam ten sam problem z liczeniem znaczników HTML.

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

Jak mogę odpowiednio przyciąć tekst?

Bardzo ci dziękuje za pomoc!

marco-s
źródło

Odpowiedzi:

18

Jest kilka rozwiązań, które możesz wypróbować, ale zwróć uwagę na to, że obcinanie ciągów za pomocą html jest ogólnie złym pomysłem ze względu na potencjalne niezamknięte lub zniekształcone tagi.

1. Użyj | raw, aby wyprowadzić HTML jako HTML, może produkować zniekształcone tagi:

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

2. Najpierw usuń HTML, czystsze:

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

3. Zarejestruj rozszerzenie gałązki (niesprawdzone):

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

Kolejnym przydatnym rozszerzeniem, które możesz sprawdzić, jest rozszerzenie Tekst, które pomaga zapobiegać rozdrabnianiu słów:

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

squall3d
źródło
2
zniekształcone tagi pierwszego rozwiązania i drugie rozwiązanie usuwają wszystkie tagi HTML.
Yusef
1
@zililan tak, jak opisano w odpowiedzi.
squall3d
1
@ squall3d jakie jest twoje rozwiązanie dla pokroić go bez pasków HTML?
Yusef
1
@zililan zwykle, gdy chcę wyświetlać obcięty tekst, jest on przeznaczony dla zwiastuna, w którym rzadko chcę HTML. Ale jeśli chcesz zachować kod
squall3d 25.09.16
1
Jeśli użyję obrazu w polu ciała. Nr 2 nie działa dla obrazów. Czy jest jakiś inny kod, wydrukuje również obraz
logeshvaran
5

Możesz to teraz zrobić za pomocą modułu twig_extender i użyć |truncate.

Oto przykład, jak używać go w szablonie .twig, zauważ, że używam również wartości twig_field_value :

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

uwaga: zazwyczaj utrzymuję moje ustawienia devel (./admin/config/development/devel) ustawione na używanie Symfony var-dumper i mogę rozgryźć łańcuch z

to znaczy: {{ devel_dump(content.field_name|field_value) }}

bdanin
źródło
4

Ulepszenia:

  1. W przypadku usunięcia tagów zalecana |trimaby pozbyć się białych znaków
  2. przycinanie na granicy słów - patrz poniżej slice()isplit()
  3. Użyj ellipsis ( …) zamiast „...”
  4. |raw wyjście

{% 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
źródło
3

Tak sobie z tym poradziłem.

Przykład:
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 %}
...
Vagner
źródło