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

83

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

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

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

{%endif%}
  • 3
    «Три точки» - это на самом деле один символ, называемый многоточием. Это три полных остановки ... и это многоточие
Теги:
twig

9 ответов

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

Вам нужно Twig 1.6

  • 0
    да, это работает! Спасибо большое
  • 0
    это должен быть ответ, все еще работает до сих пор;)
Показать ещё 6 комментариев
78

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

{{ text|truncate(50) }}
  • 4
    Я использую Symfony 2.3, и фильтр усечения не является частью расширений по умолчанию. Поэтому вместо этого я прибег к решению Мануэля.
  • 7
    Чтобы включить расширение в Symfony, добавьте его в один из ваших файлов конфигурации: gist.github.com/pschultz/f33bfff72692ca0b6916
Показать ещё 3 комментария
37

Другой:

{{ myentity.text[:50] ~ '...' }}
  • 6
    единственная проблема в том, что он всегда показывает точки ...: / думаю, я пойду с первым решением.
  • 0
    Пожалуйста, не могли бы вы поделиться ссылкой, где находится документ об этом [x: x]?
Показать ещё 2 комментария
10

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

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

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

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

  • 0
    Но это самый короткий код, и он хорошо работает
  • 6
    И этот код всегда добавляет «…»
3

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

3

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

  • 2
    Помните, что это решение позволяет внедрять HTML через text переменную.
  • 1
    @ michael-zukowski Вы правы. Я изменил свое решение.
3

Еще более элегантным решением является ограничение текста на количество слов (а не количество символов). Это предотвращает уродливые слезы (например, "Stackov..." ).

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

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

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

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

**{{ results['text'][4:2] }}**
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) }}

Ещё вопросы

Сообщество Overcoder
Наверх
Меню