Yanıtlar:
{{ myentity.text|length > 50 ? myentity.text|slice(0, 50) ~ '...' : myentity.text }}
Twig 1.6'ya ihtiyacınız var
{{ 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
{{ myentity.text[:50] ~ (myentity.text|length > 50 ? '...') }}
|length
sonrasını özlüyorsunuz text
ama bu mükemmel, teşekkürler!
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) }}
...
, ikinci parametre ayarlanması gerekir true
gibi{{ text|truncate(50, true)
require twig/extensions
Bir diğeri:
{{ myentity.text[:50] ~ '...' }}
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.
UTF-8 Elipsis adlı @olegkhuss çözümü:
{{ (my.text|length > 50 ? my.text|slice(0, 50) ~ '…' : my.text) }}
text
değişken üzerinden HTML yerleştirmeyi etkinleştirdiğini unutmayın .
@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).
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 %}
Aşağıdaki şekilde sınırlayabilirsiniz. Birincisi başlangıç dizini ve ikincisi karakter sayısıdır.
**{{ results['text'][4: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 ??
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
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) }}
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).
Bir HTML karakteri kullanmak daha iyidir
{{ entity.text[:50] }}…
…
.
...
nokta ve bu bir Ellipsis…