Bagaimana cara memotong teks isi (field_body)?


10

Saya telah membuat tampilan untuk sebuah simpul yang menunjukkan konten sebagai entitas yang diberikan. Di antara yang lain, saya menampilkan bidang tubuh dalam templat ranting:

{{ content.field_body }}

Sekarang, saya ingin membatasi teks menjadi 200 karakter dan meletakkan tiga titik. Saya telah menguji tiga cara berbeda untuk melakukan itu, tetapi tidak ada yang berhasil. Masalahnya adalah, masing-masing cara menghitung dan memangkas karakter HTML juga.

1: Saya telah menambahkan format "Dipangkas" di "Kelola tampilan" => Teks terbatas tetapi tidak benar. Dan saya tidak punya tiga titik.

2: Saya telah memangkas teks dalam templat ranting. Tetapi untuk menghitung teks saya harus membuatnya terlebih dahulu. Dengan demikian, ranting menampilkan teks sebagai HTML (Saya melihat tag HTML di halaman saya!)

{% set text = content.field_body|render %}
{{ text|length > 200 ? text|slice(0, 200) ~ '...' : text }}

3: Saya sudah mencoba menyelesaikan masalah di template_preprocess_node (). Di sini saya memiliki masalah yang sama dengan menghitung markup HTML juga.

$body_text = $node->get('field_body')->getValue()[0]['value'];
$trimmed_text = substr($body_text, 0, 200) . '...';

Bagaimana saya bisa memotong teks saya dengan benar?

Terima kasih banyak atas bantuan Anda!

Jawaban:


18

Ada beberapa solusi yang dapat Anda coba tetapi perhatikan string truncating dengan html umumnya ide yang buruk karena memiliki potensi tag tidak tertutup atau salah bentuk.

1. Gunakan | raw untuk menampilkan html sebagai html, dapat menghasilkan tag salah format:

{% set text = content.field_body|render %}
{{ text|length > 200 ? text|slice(0, 200)|raw ~ '...' : text|raw }}

2. Strip html terlebih dahulu, bersihkan:

{% set text = content.field_body|render|striptags %}
{{ text|length > 200 ? text|slice(0, 200) ~ '...' : text }}

3. Daftarkan ekstensi ranting (belum diuji):

https://gist.github.com/leon/2857883

Ekstensi bermanfaat lainnya yang dapat Anda periksa adalah ekstensi Teks, yang membantu Anda mencegah pemotongan kata-kata:

http://twig.sensiolabs.org/doc/extensions/text.html


2
solusi pertama tag cacat dan solusi kedua menghapus semua tag html.
Yusef

1
@ Zhilevan ya, seperti yang dijelaskan dalam jawaban.
squall3d

1
@ squall3d apa solusi Anda untuk mengirisnya tanpa strip html?
Yusef

1
@ Zhilevan biasanya ketika saya ingin menampilkan teks terpotong itu untuk tujuan penggoda, di mana saya jarang ingin html. Tetapi jika Anda perlu melestarikan html, Anda dapat mencoba ekstensi ini: gist.github.com/leon/2857883
squall3d

1
Jika saya menggunakan gambar di bidang tubuh. No 2, tidak berfungsi untuk gambar. Apakah ada kode lain, akan mencetak gambar juga
logeshvaran

5

Anda sekarang dapat melakukan ini dengan modul twig_extender dan menggunakannya |truncate.

Berikut ini adalah contoh cara menggunakannya dalam templat .twig, perhatikan bahwa saya juga menggunakan twig_field_value :

{{ content.field_name|field_value|first['#text']|truncate(15, true, '....') }}

Catatan: Saya biasanya menjaga pengaturan devel saya (./admin/config/development/devel) diatur untuk menggunakan Symfony var-dumper dan dapat mengetahui rantai dengan

yaitu: {{ devel_dump(content.field_name|field_value) }}


4

Perbaikan:

  1. jika Anda strip tag Anda harus |trimke menyingkirkan spasi
  2. trim pada batas kata - lihat di bawah slice()dansplit()
  3. Gunakan ellipsis ( …) daripada "..."
  4. |raw hasil

{% set text = content.field_header_intro|render|striptags|trim %}

{{ (text|length > 200 ? text|slice(0, 201)|split(' ')|slice(0, -1)|join(' ') ~ '&hellip;' : text)|raw }}</code>


3

Beginilah cara saya menangani ini.

Contoh:
bidang - simpul - tubuh - article.html.twig

{% set mode = element['#view_mode'] %}
...
{% for item in items %}
  {% if mode == 'full' %}
    <div{{ attributes.addClass('texto') }}>{{ item.content }}</div>
  {% elseif mode == 'teaser' %}
    {# if there is something about trim_length in field formatter #}
    {% if item.content['#text_summary_trim_length'] %}
      {# first remove html tags then you slice with trim_length #}
      {% set texto = item.content['#text']|striptags|slice(0, item.content['#text_summary_trim_length']) %}
      <p {{ attributes }}>{{ texto }}...</p>
    {% else %}
      <p {{ attributes }}>{{ item.content }}</p>
    {% endif %}
  {% endif %}
{% endfor %}
...
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.