twig symfony 2 ogranicza długość tekstu i wstaw trzy kropki


128

Jak mogę ograniczyć długość tekstu np. 50 i umieścić trzy kropki na wyświetlaczu?

{% if myentity.text|length > 50 %}

{% block td_text %} {{ myentity.text}}{% endblock %}

{%endif%}

4
„Trzy kropki” to właściwie pojedynczy znak zwany wielokropkiem. To są trzy kropki, ...a to wielokropek…
— Luke Cousins

Odpowiedzi:


204
{{ myentity.text|length > 50 ? myentity.text|slice(0, 50) ~ '...' : myentity.text  }}

Potrzebujesz Twig 1.6


to powinna być odpowiedź, działająca do dziś;)
— whalesingswee

Jak możemy dodać link do ...?
— mburakergenc

11
Dodatkowo, jeśli chcesz przyciąć na słowie, można zrobić to tak: {{ text > 50 ? text|slice(0, 51)|split(' ')|slice(0, -1)|join(' ') ~ '…' : text }}. Polecam również użycie znaku wielokropka ( …) zamiast 3 prawdziwych kropek (... )
— Nemo64.

2
Krótszy:{{ myentity.text[:50] ~ (myentity.text|length > 50 ? '...') }}
— mts knn

1
@ Nemo64 po prostu brakuje ci |lengthpierwszego, textale to jest idealne, dziękuję!
— mtefi

116

dlaczego nie użyć filtru obcinania lub zawijania słów twiga? Należy on do rozszerzeń twig, a lib jest częścią Symfony2.0, jak widzę.

{{ text|truncate(50) }}

5
Używam Symfony 2.3 i filtr obcinania nie jest częścią domyślnych rozszerzeń. Dlatego zamiast tego skorzystałem z rozwiązania Manuela.
— Maurits

8
Aby włączyć rozszerzenie w Symfony, dodaj to do jednego z plików konfiguracyjnych: gist.github.com/pschultz/f33bfff72692ca0b6916
— Peter

1
Aby dołączyć ...drugi parametr powinien być ustawiony truetaki jak{{ text|truncate(50, true)
— Sithu

W rzeczywistości ustawienie drugiego parametru na true spowoduje, że zachowa on całe słowa. Domyślnie dodaje elipsy. Trzeci parametr może zmienić elipsy na dowolne. twig-extensions.readthedocs.io/en/latest/…
— beta

1
Używając Symfony 2.8, musiałem zainstalować to rozszerzenie, aby z niego korzystać. require twig/extensions
— wersja beta

35

Kolejny to:

{{ myentity.text[:50] ~ '...' }}

7
jedynym problemem jest to, że zawsze pokazuje kropki ...: / Myślę, że pójdę z pierwszym rozwiązaniem.
— Markus Kottländer

1
Czy możesz udostępnić link, w którym znajduje się dokument o tym [x: x]?
— BENARD Patrick

Zawsze z trzema kropkami ... tak naprawdę nie odpowiada na pytanie.
— dmmd

17

Wiem, że to bardzo stare pytanie, ale od gałązki 1.6 możesz użyć filtra plasterków;

{{ myentity.text|slice(0, 50) ~ '...' }}

Druga część tyldy jest opcjonalna, jeśli chcesz coś dodać, na przykład wielokropek.

Edycja: Mój błąd, widzę, że najbardziej głosowana odpowiedź korzysta z filtra wycinków.


10

Rozwiązanie @olegkhuss o nazwie UTF-8 Elipsis: {{ (my.text|length > 50 ? my.text|slice(0, 50) ~ '…' : my.text) }}


2
Należy pamiętać, że to rozwiązanie umożliwia wstrzykiwanie HTML przez textzmienną.
— emix

1
@ michael-zukowski Masz rację. Zmieniłem rozwiązanie.
— Matthias Schobner

8

@mshobnr / @olegkhuss w prostym makrze:

{% macro trunc(txt, len) -%}
    {{ txt|length > len ? txt|slice(0, len) ~ '…' : txt }}
{%- endmacro %}

Przykład użycia:

{{ tools.trunc('This is the text to truncate. ', 50) }}

Uwaga: Importuję szablon Twig zawierający makra i importuję go jako „narzędzia” w następujący sposób (Symfony):

{% import "@AppBundle/tools.html.twig" as tools -%}

Zastąpiłem również kod znaków html rzeczywistym znakiem, nie powinno to stanowić problemu przy użyciu UTF-8 jako kodowania pliku. W ten sposób nie musisz go używać |raw(ponieważ może to spowodować problem z bezpieczeństwem).


6

Jeszcze bardziej eleganckim rozwiązaniem jest ograniczenie tekstu liczbą słów (a nie liczbą znaków). Zapobiega to brzydkim przebiciom (np. „Stackov…”).

Oto przykład, w którym skracam tylko bloki tekstu dłuższe niż 10 słów:

{% set text = myentity.text |split(' ') %} 

{% if text|length > 10 %} 
    {% for t in text|slice(0, 10) %}
        {{ t }} 
    {% endfor %}
    ...
{% else %}
    {{ text|join(' ') }}
{% endif %}

i bez dodatkowych potrzeb !!! tylko to, czego potrzebowałem, podzielone spacjami i plasterki słowami, dzięki!
— Vladimir Ch

Działa jak urok
— VDarricau

2

Możesz ograniczyć w następujący sposób. Pierwszy to indeks początkowy, a drugi to liczba znaków.

**{{ results['text'][4:2] }}**

2

Użyj filtru truncate, aby odciąć ciąg po osiągnięciu limitu

{{ "Hello World!"|truncate(5) }} // default separator is ...

Dzień dobry...

Możesz także powiedzieć truncate, aby zachowywał całe słowa, ustawiając drugi parametr na true. Jeśli ostatnie słowo znajduje się w separatorze, obcięcie spowoduje wydrukowanie całego słowa.

 {{ "Hello World!"|truncate(7, true) }} // preserve words

Witaj świecie!

Jeśli chcesz zmienić separator, po prostu ustaw trzeci parametr na żądany separator.

{{ "Hello World!"|truncate(7, false, "??") }} 

Cześć W ??


1

Aktualizacja dla Twig 2 i Twig 3.

truncate filter nie jest dostępny, zamiast niego możesz użyć u-filter

Oto przykład:

{{ 'Lorem ipsum'|u.truncate(8) }}
Lorem ip

{{ 'Lorem ipsum'|u.truncate(8, '...') }}
Lorem...

Uwaga: ten filtr jest częścią StringExtension, którego może wymagać

twig/string-extra

0

Napisałem ten prosty marco w tym samym celu, mam nadzieję, że pomoże:

{%- macro stringMaxLength(str, maxLength) -%}
    {%- if str | length < maxLength -%}
        {{ str }}
    {%- else -%}
        {{ str|slice(0, maxLength) }}...
    {%- endif -%}
{%- endmacro -%}

Przykład użycia # 1 (dane wyjściowe: „tutaj mój długi ciąg ...”):

{{ _self.stringMaxLength("my long string here bla bla bla la", 20) }}

Przykład użycia # 2 (dane wyjściowe: „krótszy ciąg!”):

{{ _self.stringMaxLength("shorter string!", 20) }}

0

Bugginess * w nowych możliwościach Drupala 8 zainspirował nas do napisania własnego:

<a href="{{ view_node }}">{% if title|length > 32 %}{% set title_array = title|split(' ') %}{% set title_word_count = 0 %}{% for ta in title_array %}{% set word_count = ta|length %}{% if title_word_count < 32 %}{% set title_word_count = title_word_count + word_count %}{{ ta }} {% endif %}{% endfor %}...{% else %}{{ title }}{% endif %}</a>

Uwzględnia to zarówno słowa, jak i znaki (* ustawienie „granicy słów” w D8 nic nie wyświetlało).


-1

Lepiej jest użyć znaku HTML

{{ entity.text[:50] }}&#8230;

Czy możesz dodać wyjaśnienie do swojej odpowiedzi? Dlaczego należy używać encji HTML? I dlaczego dodajesz to do tekstu w każdym przypadku, nawet jeśli tekst ma mniej niż 50 znaków?
— Nico Haase

Cześć, jeśli napiszesz trzy kropki, będą to trzy oddzielne kropki, ale znak „trzech kropek” nazywa się wielokropkiem. Element HTML z wielokropkiem to &#8230;.
— Théo Attali

A dlaczego nie użyć znaku Unicode dla tego wielokropka?
— Nico Haase,

Ty też możesz tego użyć! ten komentarz był odpowiedzią na ten komentarz stackoverflow.com/a/17118915/5923187, ale ten ruch został zablokowany z powodu mojej reputacji
— Théo Attali
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.