Odpowiedzi:
{{ myentity.text|length > 50 ? myentity.text|slice(0, 50) ~ '...' : myentity.text }}
Potrzebujesz Twig 1.6
{{ text > 50 ? text|slice(0, 51)|split(' ')|slice(0, -1)|join(' ') ~ '…' : text }}
. Polecam również użycie znaku wielokropka ( …
) zamiast 3 prawdziwych kropek (...
)
{{ myentity.text[:50] ~ (myentity.text|length > 50 ? '...') }}
|length
pierwszego, text
ale to jest idealne, dziękuję!
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) }}
...
drugi parametr powinien być ustawiony true
taki jak{{ text|truncate(50, true)
require twig/extensions
Kolejny to:
{{ myentity.text[:50] ~ '...' }}
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.
Rozwiązanie @olegkhuss o nazwie UTF-8 Elipsis:
{{ (my.text|length > 50 ? my.text|slice(0, 50) ~ '…' : my.text) }}
text
zmienną.
@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).
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 %}
Możesz ograniczyć w następujący sposób. Pierwszy to indeks początkowy, a drugi to liczba znaków.
**{{ results['text'][4: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 ??
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
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) }}
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).
Lepiej jest użyć znaku HTML
{{ entity.text[:50] }}…
…
.
...
a to wielokropek…