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.