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%}
GRafoKI
źródło
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

olegkhuss
źródło
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) }}
mrMantir
źródło
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] ~ '...' }}
Manuel Bitto
źródło
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.


źródło
10

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

Matthias Schobner
źródło
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).

Graftak
źródło
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 %}
Juliusz B.
źródło
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] }}**
Zaheer Babar
źródło
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 ??

iść do
źródło
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
Danil Pyatnitsev
źródło
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) }}
Ham L.
źródło
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).

Jeff Brewster
źródło
-1

Lepiej jest użyć znaku HTML

{{ entity.text[:50] }}&#8230;
Théo Attali
źródło
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