Ответы:
{{ 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
но это прекрасно, спасибо!
почему бы не использовать фильтр twig truncate или wordwrap? Он принадлежит к расширениям twig, а 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
(так как это может вызвать проблемы с безопасностью).
Еще более элегантное решение - ограничить текст количеством слов (а не количеством символов). Это предотвращает некрасивые надрывы (например, «Стакков ...»).
Вот пример, в котором я сокращаю только текстовые блоки длиной более 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 ...
Привет...
Вы также можете указать truncate сохранять целые слова, установив для второго параметра значение true. Если последнее слово находится на разделителе, усечение распечатает все слово.
{{ "Hello World!"|truncate(7, true) }} // preserve words
Привет, мир!
Если вы хотите изменить разделитель, просто установите третий параметр на желаемый разделитель.
{{ "Hello World!"|truncate(7, false, "??") }}
Привет W ??
Обновление для Twig 2 и Twig 3.
фильтр усечения недоступен, вместо него можно использовать u-фильтр
вот пример:
{{ '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] }}…
…
.
...
и это многоточие…