symfony 2 twig metnin uzunluğunu sınırlar ve üç nokta koyar


128

Metnin uzunluğunu, örneğin 50'yi nasıl sınırlayabilirim ve ekrana üç nokta koyabilirim?

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

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

{%endif%}

4
"Üç nokta" aslında Ellipsis adı verilen tek bir karakterdir. Bu üç ...nokta ve bu bir Ellipsis…
— Luke Cousins

Yanıtlar:


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

Twig 1.6'ya ihtiyacınız var


cevap bu olmalı, şimdiye kadar hala çalışıyor;)
— whalesingswee

... bağlantısını nasıl ekleyebiliriz?
— mburakergenc

11
Bir kelimeye kırpmak istiyorsanız Ek olarak, böyle yapabilirsiniz: {{ text > 50 ? text|slice(0, 51)|split(' ')|slice(0, -1)|join(' ') ~ '…' : text }}. Ayrıca …3 gerçek nokta ( ...) yerine üç nokta karakterini ( ) kullanmanızı tavsiye ederim
— Nemo64

2
Daha kısa:{{ myentity.text[:50] ~ (myentity.text|length > 50 ? '...') }}
— mts knn

1
@ Nemo64 sadece ilkinden |lengthsonrasını özlüyorsunuz textama bu mükemmel, teşekkürler!
— mtefi

116

neden twig'in kesik veya kelime sarma filtresini kullanmıyorsunuz? Bu aittir uzantıları dal ve ben gördüğünüz gibi lib Symfony2.0 bir parçasıdır.

{{ text|truncate(50) }}

5
Symfony 2.3 kullanıyorum ve kesme filtresi varsayılan uzantıların bir parçası değil. Bu nedenle, bunun yerine Manuel'in çözümüne başvurdum.
— maurits

8
Uzantıyı Symfony'de etkinleştirmek için, bunu yapılandırma dosyalarınızdan birine ekleyin: gist.github.com/pschultz/f33bfff72692ca0b6916
— Peter

1
Ekleme yapılması için ..., ikinci parametre ayarlanması gerekir truegibi{{ text|truncate(50, true)
— Sithu

Aslında ikinci parametrenin true olarak ayarlanması, tüm kelimeleri korumasını sağlar. Varsayılan olarak elipsleri ekler. Üçüncü parametre, elipsleri istediğiniz herhangi bir şeye değiştirebilir. twig-extensions.readthedocs.io/en/latest/…
— beta

1
Symfony 2.8'i kullanmak için bu uzantıyı yüklemem gerekiyordu. require twig/extensions
— beta

35

Bir diğeri:

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

7
tek sorun her zaman noktaları göstermesidir ...: / sanırım ilk çözüme gideceğim.
— Markus Kottländer

1
Lütfen bu [x: x] ile ilgili dokümanın bulunduğu bağlantıyı paylaşabilir misiniz?
— BENARD Patrick

Her zaman orada üç nokta olması ... soruyu gerçekten cevaplamaz.
— dmmd

17

Bunun çok eski bir soru olduğunu biliyorum, ancak twig 1.6'dan dilim filtresini kullanabilirsiniz;

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

Tilde gelen ikinci kısım, örneğin üç nokta gibi bir şey eklemek istiyorsanız isteğe bağlıdır.

Düzenleme: Benim hatam, en çok oylanan cevabın dilim filtresini kullandığını görüyorum.


10

UTF-8 Elipsis adlı @olegkhuss çözümü: {{ (my.text|length > 50 ? my.text|slice(0, 50) ~ '…' : my.text) }}


2
Lütfen bu çözümün textdeğişken üzerinden HTML yerleştirmeyi etkinleştirdiğini unutmayın .
— emix

1
@ michael-zukowski Haklısın. Çözümümü değiştirdim.
— Matthias Schobner

8

@mshobnr / @olegkhuss çözümü basit bir makroya dönüştürüldü:

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

Kullanım örneği:

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

Nb Makrolar içeren bir Twig şablonunu içe aktarıyorum ve bunu şu şekilde 'araçlar' olarak içe aktarıyorum (Symfony):

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

Ayrıca html karakter kodunu gerçek karakterle değiştirdim, dosya kodlaması olarak UTF-8 kullanırken bu sorun olmamalı. Bu şekilde kullanmanız gerekmez |raw(çünkü bir güvenlik sorununa neden olabilir).


6

Daha da zarif bir çözüm, metni kelime sayısıyla (karakter sayısına göre değil) sınırlandırmaktır. Bu, çirkin yırtılmaları önler (örneğin, 'Stackov ...').

Yalnızca 10 kelimeden uzun metin bloklarını kısalttığım bir örnek:

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

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

ve eklenti ihtiyacı yok !!! tam da ihtiyacım olan şey, boşluklara ve dilimlere göre bölünmüş, thx !!!
— Vladimir Ch

Cazibe gibi çalışıyor
— VDarricau

2

Aşağıdaki şekilde sınırlayabilirsiniz. Birincisi başlangıç ​​dizini ve ikincisi karakter sayısıdır.

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

2

Sınıra ulaşıldıktan sonra bir dizeyi kesmek için kesme filtresini kullanın

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

Merhaba...

İkinci parametreyi true olarak ayarlayarak, tam kelimeleri korumasını da söyleyebilirsiniz. Son Sözcük ayırıcı üzerindeyse, kırpmak tüm Word'ü yazdıracaktır.

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

Merhaba Dünya!

Ayırıcıyı değiştirmek isterseniz, üçüncü parametreyi istediğiniz ayırıcıya ayarlayın.

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

Merhaba W ??


1

Twig 2 ve Twig 3 için güncelleme.

kesme filtresi mevcut değil, bunun yerine u filtre kullanabilirsiniz

işte bir örnek:

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

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

Not: Bu filtre, StringExtension'ın bir parçasıdır ve

twig/string-extra

0

Bu basit marco'yu da aynı amaç için yazdım, umarım yardımcı olur:

{%- macro stringMaxLength(str, maxLength) -%}
    {%- if str | length < maxLength -%}
        {{ str }}
    {%- else -%}
        {{ str|slice(0, maxLength) }}...
    {%- endif -%}
{%- endmacro -%}

Kullanım Örneği 1 (Çıktı: "buradaki uzun dizim ..."):

{{ _self.stringMaxLength("my long string here bla bla bla la", 20) }}

Kullanım Örneği 2 (Çıktı: "daha kısa dize!"):

{{ _self.stringMaxLength("shorter string!", 20) }}

0

Buradaki yeni Drupal 8 yeteneklerindeki hata *, kendi başımıza yazmamız için bize ilham verdi:

<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>

Bu, hem kelimeleri hem de karakterleri dikkate alır (* D8'deki "kelime sınırı" ayarı hiçbir şey göstermiyordu).


-1

Bir HTML karakteri kullanmak daha iyidir

{{ entity.text[:50] }}&#8230;

Cevabınıza bir açıklama ekleyebilir misiniz? Neden bir HTML varlığı kullanılmalıdır? Ve metin 50 karakterden kısa olsa bile neden her bir durumdaki metne ekliyorsunuz?
— Nico Haase

Merhaba, üç nokta yazarsanız, bu üç ayrı nokta, ancak "üç nokta" karakterine üç nokta denir. Üç nokta html varlığı &#8230;.
— Théo Attali

Ve neden bu üç nokta için unicode karakterini kullanmıyorsunuz?
— Nico Haase

Sen de kullanabilirsin! bu yorum o yoruma bir cevaptı stackoverflow.com/a/17118915/5923187 ama bu hareket benim itibarım yüzünden kilitlendi
— Théo Attali
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.