symfony 2 гілочки обмежують довжину тексту і ставлять три крапки


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


це повинна бути відповідь, яка працює досі;)
khalesingswee

Як ми можемо додати посилання на ...?
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

чому б не використовувати гілочку обрізки або фільтр для переробки слів? Він належить до розширень гілочок і lib є частиною Symfony2.0, як я бачу.

{{ text|truncate(50) }}

5
Я використовую Symfony 2.3, і фільтр усікання не є частиною розширень за замовчуванням. Тому я скоріше вдався до рішення Мануеля.
maurits

8
Щоб увімкнути розширення в Symfony, додайте це до одного з конфігураційних файлів: gist.github.com/pschultz/f33bfff72692ca0b6916
Пітер,

1
Щоб додати ..., другий параметр слід встановити trueтаким, як{{ text|truncate(50, true)
Sithu

Власне встановлення другого параметра на істинне дозволило б зберегти цілі слова. Він додає еліпси за замовчуванням. Третій параметр може змінити еліпси на все, що завгодно. twig-extensions.readthedocs.io/en/latest/…
бета

1
Використовуючи Symfony 2.8, мені довелося встановити це розширення, щоб його використовувати. require twig/extensions
бета-версія

35

Ще один:

{{ myentity.text[:50] ~ '...' }}

7
Єдина проблема полягає в тому, що вона завжди показує крапки ...: / думаю, я піду з першим рішенням.
Маркус Коттлендер

1
Будь ласка, можете поділитися посиланням, де знаходиться документ про це [x: x]?
БЕНАРД Патрік

Завжди з трьома крапками там… насправді не відповідає на питання.
dmmd

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змінну.
емікс

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

Ще більш елегантним рішенням є обмеження тексту за кількістю слів (а не за кількістю символів). Це запобігає некрасиві прориви (наприклад, "Stackov ...").

Ось приклад, коли я скорочую лише текстові блоки довжиною більше 10 слів:

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

{% if text|length > 10 %} 
    {% for t in text|slice(0, 10) %}
        {{ t }} 
    {% endfor %}
    ...
{% else %}
    {{ text|join(' ') }}
{% endif %}

і ніяких додаткових потреб !!! просто те, що мені потрібно, розділити на пробіли та фрагменти словами, THX !!!
Володимир Ч.

Працює як шарм
VDarricau

2

Ви можете обмежитися наступним чином. Перший - це початковий індекс, а другий - кількість символів.

**{{ results['text'][4:2] }}**

2

Використовуйте фільтр усікання, щоб відрізати рядок після досягнення межі

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

Здравствуйте...

Ви також можете сказати урізати, щоб зберегти цілі слова, встановивши другий параметр на істинне. Якщо останнє слово знаходиться на розділювачі, усікання надрукує усі слова.

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

Ось Hello World!

Якщо ви хочете змінити роздільник, просто встановіть третій параметр на потрібний роздільник.

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

Привіт W ??


1

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

Фільтр усікання недоступний, замість нього ви можете використовувати u-filter

ось приклад:

{{ '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.