symfony 2 twig ограничивает длину текста и ставит три точки

128

Как я могу ограничить длину текста, например, 50, и поставить на дисплей три точки?

{% if myentity.text|length > 50 %}

{% block td_text %} {{ myentity.text}}{% endblock %}

{%endif%}
GRafoKI
источник
4
«Три точки» на самом деле представляют собой один символ, называемый многоточием. Это три полных остановки, ...и это многоточие
Люк Казинс,

Ответы:

204
{{ myentity.text|length > 50 ? myentity.text|slice(0, 50) ~ '...' : myentity.text  }}

Вам нужен Twig 1.6

olegkhuss
источник
это должен быть ответ, работающий до сих пор;)
whalesingswee
Как мы можем добавить ссылку на ...?
mburakergenc
11
Кроме того, если вы хотите , чтобы обрезать на слово, вы можете сделать это следующим образом : {{ text > 50 ? text|slice(0, 51)|split(' ')|slice(0, -1)|join(' ') ~ '…' : text }}. Я также рекомендую использовать символ многоточия ( ) вместо 3 реальных точек ( ...)
Nemo64
2
Короче:{{ myentity.text[:50] ~ (myentity.text|length > 50 ? '...') }}
mts knn
1
@ Nemo64, тебе просто не хватает |lengthпервого, textно это прекрасно, спасибо!
mtefi
116

почему бы не использовать фильтр twig truncate или wordwrap? Он принадлежит к расширениям twig, а lib, как я вижу, является частью Symfony2.0.

{{ text|truncate(50) }}
mrMantir
источник
5
Я использую Symfony 2.3, и фильтр усечения не является частью расширений по умолчанию. Поэтому вместо этого я прибег к решению Мануэля.
maurits
8
Чтобы включить расширение в Symfony, добавьте это в один из ваших файлов конфигурации: gist.github.com/pschultz/f33bfff72692ca0b6916
Питер,
1
Для добавления ...второй параметр должен быть установлен , trueнапример , как{{ text|truncate(50, true)
Ситху
Фактически установка второго параметра в значение true позволит сохранить слова целиком. По умолчанию он добавляет эллипсы. Третий параметр может изменить эллипсы на что угодно. twig-extensions.readthedocs.io/en/latest/…
beta
1
Используя Symfony 2.8, мне пришлось установить это расширение, чтобы использовать его. require twig/extensions
бета
35

Еще один:

{{ myentity.text[:50] ~ '...' }}
Мануэль Битто
источник
7
единственная проблема в том, что он всегда показывает точки ...: / думаю, я выберу первое решение.
Маркус Коттлендер,
1
Подскажите, пожалуйста, ссылку, где находится документ об этом [x: x]?
БЕНАРД Патрик 07
Всегда с тремя точками ... на самом деле не отвечает на вопрос.
dmmd 08
17

Я знаю, что это очень старый вопрос, но в ветке 1.6 вы можете использовать фильтр срезов;

{{ myentity.text|slice(0, 50) ~ '...' }}

Вторая часть тильды необязательна, если вы хотите что-то добавить, например, многоточие.

Изменить: Плохо, я вижу, что в самом популярном ответе используется фильтр срезов.


источник
10

Решение @olegkhuss с именем UTF-8 Elipsis: {{ (my.text|length > 50 ? my.text|slice(0, 50) ~ '…' : my.text) }}

Маттиас Шобнер
источник
2
Имейте в виду, что это решение позволяет внедрять HTML через textпеременную.
emix
1
@ michael-zukowski Вы правы. Я изменил свое решение.
Маттиас Шобнер,
8

Решение @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(так как это может вызвать проблемы с безопасностью).

Graftak
источник
6

Еще более элегантное решение - ограничить текст количеством слов (а не количеством символов). Это предотвращает некрасивые надрывы (например, «Стакков ...»).

Вот пример, в котором я сокращаю только текстовые блоки длиной более 10 слов:

{% set text = myentity.text |split(' ') %} 

{% if text|length > 10 %} 
    {% for t in text|slice(0, 10) %}
        {{ t }} 
    {% endfor %}
    ...
{% else %}
    {{ text|join(' ') }}
{% endif %}
Юлиус Б.
источник
и никаких надстроек !!! именно то, что мне нужно, разделенное пробелами и кусочками по словам, спасибо !!!
Владимир Ч
Работает как шарм
VDarricau
2

Ограничить можно следующим образом. Первый - это начальный индекс, а второй - количество символов.

**{{ results['text'][4:2] }}**
Захир Бабар
источник
2

Используйте фильтр усечения, чтобы обрезать строку после достижения лимита

{{ "Hello World!"|truncate(5) }} // default separator is ...

Привет...

Вы также можете указать truncate сохранять целые слова, установив для второго параметра значение true. Если последнее слово находится на разделителе, усечение распечатает все слово.

 {{ "Hello World!"|truncate(7, true) }} // preserve words

Привет, мир!

Если вы хотите изменить разделитель, просто установите третий параметр на желаемый разделитель.

{{ "Hello World!"|truncate(7, false, "??") }} 

Привет W ??

перейти к
источник
1

Обновление для Twig 2 и Twig 3.

фильтр усечения недоступен, вместо него можно использовать u-фильтр

вот пример:

{{ 'Lorem ipsum'|u.truncate(8) }}
Lorem ip

{{ 'Lorem ipsum'|u.truncate(8, '...') }}
Lorem...

Примечание: этот фильтр является частью StringExtension, который может потребоваться

twig/string-extra
Данил Пятницев
источник
0

Я написал этого простого марко для той же цели, надеюсь, это поможет:

{%- 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) }}
Хэм Л.
источник
0

Ошибка * в новых возможностях 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 ничего не отображала).

Джефф Брюстер
источник
-1

Лучше использовать символ HTML

{{ entity.text[:50] }}&#8230;
Тео Аттали
источник
Не могли бы вы пояснить свой ответ? Зачем использовать HTML-сущность? И почему вы добавляете его к тексту в каждом случае, даже если длина текста меньше 50 символов?
Нико Хаасе
Привет, если вы напишете три точки, это три отдельные точки, но символ «три точки» называется многоточием. HTML-объект с многоточием - это &#8230;.
Тео Аттали
И почему бы не использовать для этого многоточия символ юникода?
Нико Хаасе
Вы тоже можете его использовать! этот комментарий был ответом на этот комментарий stackoverflow.com/a/17118915/5923187, но этот ход был заблокирован из-за моей репутации
Тео Аттали