Gövde metni nasıl kesilir (field_body)?


10

İçeriği işlenen varlık olarak gösteren bir düğüm için bir görünüm oluşturdum. Diğerleri arasında, dal şablonundaki gövde alanını çıktıyorum:

{{ content.field_body }}

Şimdi, metni 200 karakterle sınırlamak ve üç nokta koymak istiyorum. Bunu yapmanın üç farklı yolunu test ettim, ama hiçbir şey işe yaramadı. Sorun, her yolun HTML karakterlerini de sayması ve kesmesidir.

1: "Görüntüyü yönet" => "Kesilmiş" biçimini ekledim. Metin sınırlıdır ancak doğru değildir. Ve üç noktam yok.

2: Dal şablonundaki metni kırptım. Ama metni saymak için önce onu işlemeliyim. Böylece, dal metni HTML olarak çıkarır (Sayfamda HTML etiketleri görüyorum!)

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

3: Sorunu template_preprocess_node () içinde çözmeye çalıştım. Burada ben de HTML işaretleme sayma ile aynı sorunu var.

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

Metnimi nasıl düzeltebilirim?

Yardımın için çok teşekkürler!

Yanıtlar:


18

Deneyebileceğiniz birkaç çözüm var, ancak html ile kesme dizelerini not etmek, potansiyel olarak kapatılmamış veya hatalı biçimlendirilmiş etiketlere sahip olması nedeniyle kötü bir fikirdir.

1. html'yi html olarak çıkarmak için | raw kullanın, hatalı biçimlendirilmiş etiketler üretebilir:

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

2. Önce html soyun, temizleyici:

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

3. Bir dal uzantısı kaydedin (denenmemiş):

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

Kontrol edebileceğiniz başka bir yararlı uzantı, kelimeleri kesmenizi önlemeye yardımcı olan Metin uzantısıdır:

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


2
ilk çözüm hatalı biçimlendirilmiş etiketler ve ikinci çözüm tüm html etiketleri şerit.
Yusef

1
@zhilevan yep, cevapta açıklandığı gibi.
squall3d

1
@ squall3d şerit htmls olmadan dilim için çözüm nedir?
Yusef

1
@zhilevan genellikle kesilmiş metin görüntülemek istediğimde nadiren html istediğim bir teaser amacı için. Ancak, html'yi korumanız gerekiyorsa, bu uzantıyı deneyebilirsiniz: gist.github.com/leon/2857883
squall3d

1
Resmi vücut alanında kullanırsam. No 2, görüntüler için çalışmıyor. Başka bir kod var mı, görüntüyü de yazdıracak
logeshvaran

5

Şimdi bunu twig_extender modülü ile yapabilir ve kullanabilirsiniz |truncate.

İşte .twig şablonunda nasıl kullanılacağına dair bir örnek, ayrıca twig_field_value kullandığımı unutmayın :

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

not: Genelde Devel ayarlarımı (./admin/config/development/devel) Symfony var damperli kamyonu kullanmak üzere ayarlı tutuyorum ve zinciri

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


4

İyileştirmeler:

  1. Eğer etiketleri şerit eğer gerektiği |trimiçin boşluk kurtulmak
  2. sözcük sınırında düzeltme - aşağıya bakın slice()vesplit()
  3. "..." yerine üç nokta ( …) kullanın
  4. |raw çıktı

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

Bunu ben böyle hallettim.

Örnek:
alan - düğüm - gövde - 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 %}
...
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.