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.