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

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


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

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] ~ '...' }}

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.


10

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


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


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

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] }}**

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


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

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

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


-1

Lebih baik menggunakan karakter HTML

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

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
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.