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


128

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

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

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

{%endif%}

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

Ответы:


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

Вам нужен Twig 1.6


это должен быть ответ, работающий до сих пор;)
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) }}

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


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, но этот ход был заблокирован из-за моей репутации
Тео Аттали
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.