Відповіді:
{{ myentity.text|length > 50 ? myentity.text|slice(0, 50) ~ '...' : myentity.text }}
Вам потрібна Twig 1.6
{{ text > 50 ? text|slice(0, 51)|split(' ')|slice(0, -1)|join(' ') ~ '…' : text }}
. Я також рекомендую використовувати символ еліпсису ( …
) замість 3 реальних крапок ( ...
)
{{ myentity.text[:50] ~ (myentity.text|length > 50 ? '...') }}
|length
після першого, text
але це ідеально, дякую!
чому б не використовувати гілочку обрізки або фільтр для переробки слів? Він належить до розширень гілочок і lib є частиною Symfony2.0, як я бачу.
{{ text|truncate(50) }}
...
, другий параметр слід встановити true
таким, як{{ text|truncate(50, true)
require twig/extensions
Ще один:
{{ myentity.text[:50] ~ '...' }}
Я знаю, що це дуже старе питання, але з гілочки 1.6 ви можете використовувати фільтр зрізів;
{{ myentity.text|slice(0, 50) ~ '...' }}
Друга частина тильди необов’язкова, якщо ви хочете додати щось, наприклад еліпсис.
Редагувати: Моє погано, я бачу відповідь, яка найбільше голосує, і використовується фільтр фрагментів.
@olegkhuss рішення з назвою UTF-8 Elipsis:
{{ (my.text|length > 50 ? my.text|slice(0, 50) ~ '…' : my.text) }}
text
змінну.
Рішення @mshobnr / @olegkhuss в простому макросі:
{% macro trunc(txt, len) -%}
{{ txt|length > len ? txt|slice(0, len) ~ '…' : txt }}
{%- endmacro %}
Приклад використання:
{{ tools.trunc('This is the text to truncate. ', 50) }}
Nb Я імпортую шаблон Twig, що містить макроси та імпортує його як "інструменти", як це (Symfony):
{% import "@AppBundle/tools.html.twig" as tools -%}
Крім того, я замінив код html-символу фактичним символом, це не повинно бути проблемою при використанні UTF-8 як кодування файлів. Таким чином вам не доведеться користуватися |raw
(оскільки це може спричинити проблеми із безпекою).
Ще більш елегантним рішенням є обмеження тексту за кількістю слів (а не за кількістю символів). Це запобігає некрасиві прориви (наприклад, "Stackov ...").
Ось приклад, коли я скорочую лише текстові блоки довжиною більше 10 слів:
{% set text = myentity.text |split(' ') %}
{% if text|length > 10 %}
{% for t in text|slice(0, 10) %}
{{ t }}
{% endfor %}
...
{% else %}
{{ text|join(' ') }}
{% endif %}
Ви можете обмежитися наступним чином. Перший - це початковий індекс, а другий - кількість символів.
**{{ results['text'][4:2] }}**
Використовуйте фільтр усікання, щоб відрізати рядок після досягнення межі
{{ "Hello World!"|truncate(5) }} // default separator is ...
Здравствуйте...
Ви також можете сказати урізати, щоб зберегти цілі слова, встановивши другий параметр на істинне. Якщо останнє слово знаходиться на розділювачі, усікання надрукує усі слова.
{{ "Hello World!"|truncate(7, true) }} // preserve words
Ось Hello World!
Якщо ви хочете змінити роздільник, просто встановіть третій параметр на потрібний роздільник.
{{ "Hello World!"|truncate(7, false, "??") }}
Привіт W ??
Оновлення для Twig 2 і Twig 3.
Фільтр усікання недоступний, замість нього ви можете використовувати u-filter
ось приклад:
{{ 'Lorem ipsum'|u.truncate(8) }}
Lorem ip
{{ 'Lorem ipsum'|u.truncate(8, '...') }}
Lorem...
Примітка. Цей фільтр є частиною StringExtension, яку може вимагати
twig/string-extra
Я написав це просте Марко з тією ж метою, сподіваюся, що це допомагає:
{%- macro stringMaxLength(str, maxLength) -%}
{%- if str | length < maxLength -%}
{{ str }}
{%- else -%}
{{ str|slice(0, maxLength) }}...
{%- endif -%}
{%- endmacro -%}
Приклад використання №1 (Вихід: "моя довга рядок тут ..."):
{{ _self.stringMaxLength("my long string here bla bla bla la", 20) }}
Приклад використання №2 (вихід: "коротший рядок!"):
{{ _self.stringMaxLength("shorter string!", 20) }}
Бурхливість * у нових можливостях Drupal 8 тут надихнула нас написати власні:
<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>
Це враховує як слова, так і символи (* налаштування "межі слів" у D8 нічого не відображало).
Краще використовувати символ HTML
{{ entity.text[:50] }}…
…
.
...
і це Еліпсіс…