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

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

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

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

{%endif%}

person GRafoKI    schedule 30.10.2012    source источник
comment
Три точки на самом деле представляют собой один символ, называемый многоточием. Это три полных остановки ..., а это многоточие   -  person Luke Cousins    schedule 18.05.2017


Ответы (15)


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

Вам нужен Twig 1.6.

person olegkhuss    schedule 30.10.2012
comment
это должен быть ответ, работающий до сих пор;) - person whalesingswee; 02.05.2017
comment
Как мы можем добавить ссылку на ...? - person mburakergenc; 14.07.2017
comment
Кроме того, если вы хотите обрезать слово, вы можете сделать это следующим образом: {{ text > 50 ? text|slice(0, 51)|split(' ')|slice(0, -1)|join(' ') ~ '…' : text }}. Я также рекомендую использовать символ многоточия () вместо 3 реальных точек (...). - person Nemo64; 31.07.2017
comment
Короче: {{ myentity.text[:50] ~ (myentity.text|length > 50 ? '...') }} - person Matias Kinnunen; 18.01.2018
comment
@ Nemo64, тебе просто не хватает |length после первого text, но это прекрасно, спасибо! - person mtefi; 24.10.2018
comment
Да не забывайте | длина {{текст | длина ›50? текст | slice (0, 51) | split ('') | slice (0, -1) | join ('') ~ '…': text}} - person ben.hamelin; 26.10.2018
comment
Спасибо, работает {{item.text | length ›50? item.text | slice (0, 50) ~ '...': item.text}} - person Kashmiri; 06.12.2018
comment
Ответ @martias выше (более короткий вариант) сработал для меня. Drupal 8.6. - person Auxiliary Joel; 05.04.2019

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

{{ text|truncate(50) }}
person mrMantir    schedule 30.10.2012
comment
Я использую Symfony 2.3, и фильтр усечения не является частью расширений по умолчанию. Поэтому вместо этого я прибег к решению Мануэля. - person maurits; 14.10.2013
comment
Чтобы включить расширение в Symfony, добавьте это в один из ваших файлов конфигурации: gist.github.com/pschultz/f33bfff72692ca0b6916 - person Peter; 27.06.2014
comment
Чтобы добавить ..., второй параметр должен быть установлен на true, например {{ text|truncate(50, true) - person Sithu; 12.05.2017
comment
Фактически установка второго параметра в значение true заставит его сохранить целые слова. По умолчанию он добавляет эллипсы. Третий параметр может изменить эллипсы на все, что угодно. twig-extensions.readthedocs.io/en/latest/ - person beta; 10.08.2017
comment
Используя Symfony 2.8, мне пришлось установить это расширение, чтобы использовать его. require twig/extensions - person beta; 10.08.2017

Еще один:

{{ myentity.text[:50] ~ '...' }}
person Manuel Bitto    schedule 15.06.2013
comment
единственная проблема в том, что он всегда показывает точки ...: / думаю, я выберу первое решение. - person Markus Kottländer; 13.08.2014
comment
Подскажите, пожалуйста, ссылку, где находится документ об этом [x: x]? - person BENARD Patrick; 07.12.2015
comment
Всегда с тремя точками ... на самом деле не отвечает на вопрос. - person dmmd; 09.08.2018

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

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

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

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

person Community    schedule 11.05.2016

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

person Matthias    schedule 16.12.2016
comment
Имейте в виду, что это решение позволяет внедрять HTML-код через переменную text. - person emix; 05.02.2018
comment
@ michael-zukowski Вы правы. Я изменил свое решение. - person Matthias; 20.03.2018

Решение @mshobnr / @olegkhuss в виде простого макроса:

{% macro trunc(txt, len) -%}
    {{ txt|length > len ? txt|slice(0, len) ~ '…' : txt }}
{%- endmacro %}

Пример использования:

{{ tools.trunc('This is the text to truncate. ', 50) }}

N.b. Я импортирую шаблон Twig, содержащий макросы, и импортирую его как такие «инструменты» (Symfony):

{% import "@AppBundle/tools.html.twig" as tools -%}

Кроме того, я заменил код символа html фактическим символом, это не должно быть проблемой при использовании UTF-8 в качестве кодировки файла. Таким образом, вам не нужно использовать |raw (поскольку это может вызвать проблемы с безопасностью).

person Graftak    schedule 28.04.2017

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

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

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

{% if text|length > 10 %} 
    {% for t in text|slice(0, 10) %}
        {{ t }} 
    {% endfor %}
    ...
{% else %}
    {{ text|join(' ') }}
{% endif %}
person Julius B.    schedule 01.12.2015
comment
и никаких надстроек !!! именно то, что мне нужно, разделенное пробелами и кусочками по словам, спасибо !!! - person Vladimir Ch; 19.09.2016
comment
Работает как шарм - person VDarricau; 11.08.2017


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

**{{ results['text'][4:2] }}**
person Zaheer Babar    schedule 10.12.2014

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

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

Привет...

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

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

Привет, мир!

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

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

Привет W ??

person goto    schedule 20.01.2020

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

{%- 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) }}
person Ham L.    schedule 11.09.2015

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

person Jeff Brewster    schedule 27.07.2018

В дополнение к комментарию Nemo64 под ответом olegkhuss, я хотел бы добавить, что если вам нужно закончить частичный текст на слове, а не на символе, вы можете сделать это:

entity.text|split(' ', 11)|length > 10 ? entty.text|split(' ', 11)|slice(0, 10)|join(' ') ~ '…' : entity.text

В этом примере весь текст, содержащий более 10 слов, будет вырезан после 10-го слова.

person Karobwe    schedule 07.04.2021

если кому-то это нужно из современного мира, поскольку этот вопрос очень старый, я бы сделал это так: я определенно не хотел бы иметь неполное слово в конце, поэтому я предпочитаю сделать это со следующими шагами: ограничение желаемую длину символов, разбейте мой текст на кучу массивов предложений, разделенных запятой или точкой, в зависимости от вашего текста, удалите последний массив, который представляет неполное слово, затем объедините или взломайте эти массивы вместе и, конечно, не забудьте соедините их с той точкой, которую мы удалили при расчленении строки символов, и за пределами ветки {{}} добавьте свои три точки, при этом, как было сказано, это будет выглядеть примерно так:

{{myentity.text|slice(0,50)|split('.')|slice(0,-1)|join('.')}}...

<a href="#">readeMore</a>

person Zache Leto    schedule 22.06.2021

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

{{ entity.text[:50] }}&#8230;
person Théo Attali    schedule 13.05.2018
comment
Не могли бы вы пояснить свой ответ? Почему следует использовать сущность HTML? И почему вы добавляете его к тексту в каждом случае, даже если длина текста меньше 50 символов? - person Nico Haase; 09.01.2019
comment
Привет, если вы напишете три точки, это три отдельные точки, но символ из трех точек называется многоточием. Сущность HTML с многоточием - &#8230;. - person Théo Attali; 09.01.2019
comment
И почему бы не использовать символ Юникода для этого многоточия? - person Nico Haase; 09.01.2019
comment
Вы тоже можете его использовать! этот комментарий был ответом на этот комментарий stackoverflow.com/a/17118915/5923187, но этот шаг был заблокирован из-за моей репутации - person Théo Attali; 09.01.2019