symfony 2 ranting membatasi panjang teks dan meletakkan tiga titik

128

Bagaimana saya bisa membatasi panjang teks, misalnya 50, dan meletakkan tiga titik di layar?

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

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

{%endif%}
GRAFKI
sumber
4
"Tiga titik" sebenarnya adalah satu karakter yang disebut Ellipsis. Ini adalah tiga perhentian penuh ...dan ini adalah Ellipsis
Luke Cousins

Jawaban:

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

Anda membutuhkan Ranting 1.6

olegkhus
sumber
ini seharusnya jawabannya, masih bekerja sampai sekarang;)
whalesingswee
Bagaimana kami dapat menambahkan tautan ke ...?
mburakergenc
11
Selain itu, jika Anda ingin memotong pada kata, Anda dapat melakukannya seperti ini: {{ text > 50 ? text|slice(0, 51)|split(' ')|slice(0, -1)|join(' ') ~ '…' : text }}. Saya juga merekomendasikan menggunakan karakter ellipsis ( ) alih-alih 3 titik nyata ( ...)
Nemo64
2
Lebih pendek:{{ myentity.text[:50] ~ (myentity.text|length > 50 ? '...') }}
mts knn
1
@ Nemo64 Anda baru saja melewatkan |lengthsetelah pertama texttetapi itu sempurna, terima kasih!
mtefi
116

mengapa tidak menggunakan filter ranting truncate atau wordwrap? Itu milik ekstensi ranting dan lib adalah bagian dari Symfony2.0 seperti yang saya lihat.

{{ text|truncate(50) }}
mrMantir
sumber
5
Saya menggunakan Symfony 2.3 dan filter truncate bukan bagian dari ekstensi default. Karena itu, saya menggunakan solusi Manuel sebagai gantinya.
maurits
8
Untuk mengaktifkan ekstensi di Symfony, tambahkan ini ke salah satu file konfigurasi Anda: gist.github.com/pschultz/f33bfff72692ca0b6916
Peter
1
Untuk menambahkan ..., parameter kedua harus diatur ke trueseperti{{ text|truncate(50, true)
Sithu
Sebenarnya pengaturan parameter kedua menjadi true akan membuatnya mempertahankan seluruh kata. Ia menambahkan elips secara default. Parameter ketiga dapat mengubah elips menjadi apa pun yang Anda inginkan. twig-extensions.readthedocs.io/en/latest/…
beta
1
Menggunakan Symfony 2.8, saya harus menginstal ekstensi ini untuk menggunakannya. require twig/extensions
beta
35

Yang lain adalah:

{{ myentity.text[:50] ~ '...' }}
Manuel Bitto
sumber
7
satu-satunya masalah adalah selalu menunjukkan titik-titik ...: / saya pikir saya akan pergi dengan solusi pertama.
Markus Kottländer
1
Tolong, bisakah Anda membagikan tautan di mana dokumen tentang [x: x] ini berada?
BENARD Patrick
Selalu dengan tiga titik di sana ... tidak benar-benar menjawab pertanyaan.
dmmd
17

Saya tahu ini adalah pertanyaan yang sangat lama, tetapi dari ranting 1.6 Anda dapat menggunakan filter slice;

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

Bagian kedua dari tilde adalah opsional untuk jika Anda ingin menambahkan sesuatu misalnya elipsis.

Sunting: Buruk saya, saya melihat jawaban paling banyak menggunakan filter slice.


sumber
10

Solusi @olegkhuss dengan nama UTF-8 Elipsis: {{ (my.text|length > 50 ? my.text|slice(0, 50) ~ '…' : my.text) }}

Matthias Schobner
sumber
2
Harap diingat bahwa solusi ini memungkinkan injeksi HTML melalui textvariabel.
emix
1
@ michael-zukowski Anda benar. Saya telah mengubah solusi saya.
Matthias Schobner
8

Solusi @mshobnr / @olegkhus dibuat menjadi makro sederhana:

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

Contoh penggunaan:

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

Nb Saya mengimpor template Ranting yang berisi makro dan mengimpornya sebagai 'alat' seperti ini (Symfony):

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

Juga, saya mengganti kode karakter html dengan karakter aktual, ini seharusnya tidak ada masalah ketika menggunakan UTF-8 sebagai pengkodean file. Dengan cara ini Anda tidak harus menggunakan |raw(karena dapat menyebabkan masalah keamanan).

Graftak
sumber
6

Solusi yang bahkan lebih elegan adalah membatasi teks dengan jumlah kata (dan bukan oleh jumlah karakter). Ini mencegah tembusnya air mata yang jelek (mis. 'Stackov ...').

Berikut adalah contoh di mana saya mempersingkat hanya blok teks yang lebih panjang dari 10 kata:

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

{% if text|length > 10 %} 
    {% for t in text|slice(0, 10) %}
        {{ t }} 
    {% endfor %}
    ...
{% else %}
    {{ text|join(' ') }}
{% endif %}
Julius B.
sumber
dan tidak ada kebutuhan tambahan !!! apa yang saya butuhkan, dibagi dengan spasi dan irisan dengan kata-kata, terima kasih !!!
Vladimir Ch
Bekerja seperti pesona
VDarricau
2

Anda dapat membatasi dengan cara berikut. Pertama adalah indeks awal dan yang kedua adalah jumlah karakter.

**{{ results['text'][4:2] }}**
Zaheer Babar
sumber
2

Gunakan filter truncate untuk memotong string setelah batas tercapai

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

Halo...

Anda juga bisa memberi tahu truncate untuk mempertahankan seluruh kata dengan mengatur parameter kedua menjadi true. Jika Word terakhir ada di separator, truncate akan mencetak seluruh Word.

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

Di sini Hello World!

Jika Anda ingin mengubah pemisah, cukup atur parameter ketiga ke pemisah yang Anda inginkan.

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

Halo W ??

pergi ke
sumber
1

Pembaruan untuk Twig 2 dan Twig 3.

filter truncate tidak tersedia, sebagai gantinya Anda dapat menggunakan u-filter

berikut ini sebuah contoh:

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

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

Catatan: filter ini adalah bagian dari StringExtension yang dapat diminta oleh

twig/string-extra
Danil Pyatnitsev
sumber
0

Saya menulis marco sederhana ini untuk tujuan yang sama, semoga membantu:

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

Contoh Penggunaan # 1 (Output: "string panjang saya di sini ..."):

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

Contoh Penggunaan # 2 (Output: "string lebih pendek!"):

{{ _self.stringMaxLength("shorter string!", 20) }}
Ham L.
sumber
0

Bugginess * dalam kemampuan Drupal 8 yang baru di sini menginspirasi kami untuk menulis sendiri:

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

Ini mempertimbangkan kata-kata dan karakter (* pengaturan "batas kata" di D8 tidak menampilkan apa-apa).

Jeff Brewster
sumber
-1

Lebih baik menggunakan karakter HTML

{{ entity.text[:50] }}&#8230;
Théo Attali
sumber
Bisakah Anda menambahkan penjelasan pada jawaban Anda? Mengapa orang harus menggunakan entitas HTML? Dan mengapa Anda menambahkannya ke teks dalam setiap kasus, bahkan jika teks kurang dari 50 karakter?
Nico Haase
Hai, jika Anda menulis tiga titik, itu tiga titik yang terpisah tetapi karakter "tiga titik" disebut elipsis. Entitas html ellipsis adalah &#8230;.
Théo Attali
Dan mengapa tidak menggunakan karakter unicode untuk elipsis itu?
Nico Haase
Anda bisa menggunakannya juga! komentar ini adalah jawaban untuk komentar tersebut stackoverflow.com/a/17118915/5923187 tetapi langkah itu terkunci karena reputasi saya
Théo Attali