วิธีตัดแต่งเนื้อความ (field_body)?


10

ฉันสร้างมุมมองสำหรับโหนดซึ่งแสดงเนื้อหาเป็นเอนทิตีที่แสดงผล ในบรรดาคนอื่น ๆ ฉันส่งออกฟิลด์ร่างกายในแม่แบบกิ่งไม้:

{{ content.field_body }}

ตอนนี้ฉันต้องการ จำกัด ข้อความไว้ที่ 200 ตัวอักษรและใส่จุดสามจุด ฉันได้ทดสอบวิธีการต่าง ๆ สามวิธี แต่ไม่มีอะไรได้ผล ปัญหาคือว่าแต่ละวิธีนับและตัดแต่งอักขระ HTML ด้วย

1: ฉันได้เพิ่มรูปแบบ "Trimmed" ใน "Manage display" => ข้อความมี จำกัด แต่ไม่ถูกต้อง และฉันไม่มีจุดสามจุด

2: ฉันตัดแต่งข้อความในแม่แบบกิ่งไม้ แต่เพื่อนับข้อความฉันต้องแสดงมันก่อน ดังนั้น, twig เอาท์พุทข้อความเป็น HTML (ฉันเห็นแท็ก HTML บนหน้าของฉัน!)

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

3: ฉันพยายามแก้ไขปัญหาใน template_preprocess_node () ที่นี่ฉันมีปัญหาเดียวกันกับการนับมาร์กอัป HTML ด้วย

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

ฉันจะตัดข้อความได้อย่างไร

ขอบคุณมากสำหรับความช่วยเหลือของคุณ!

คำตอบ:


18

มีวิธีแก้ปัญหาบางอย่างที่คุณสามารถลองได้ แต่จดบันทึกการตัดทอนสตริงด้วย html โดยทั่วไปแล้วเป็นความคิดที่ไม่ดีเนื่องจากมีแท็กที่ไม่เป็นระเบียบหรือมีรูปแบบไม่ถูกต้อง

1. ใช้ | raw เพื่อส่งออก html เป็น html อาจสร้างแท็กที่มีรูปแบบไม่ถูกต้อง:

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

2. Strip html ก่อนทำความสะอาด:

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

3. ลงทะเบียนส่วนขยายกิ่งไม้ (ยังไม่ได้ทดสอบ):

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

ส่วนขยายที่เป็นประโยชน์อีกอย่างที่คุณสามารถตรวจสอบได้คือส่วนขยายข้อความซึ่งช่วยคุณป้องกันการตัดคำ:

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


2
คำตอบแรกแท็กที่มีรูปแบบไม่ถูกต้องและโซลูชันที่สองตัดแท็ก html ทั้งหมดออก
Yusef

1
@zhilevan yep ตามที่อธิบายไว้ในคำตอบ
squall3d

1
@ squall3d วิธีการแก้ปัญหาของคุณสำหรับชิ้นโดยไม่ต้องแถบ htmls คืออะไร?
Yusef

1
@zhilevan มักจะเมื่อฉันต้องการที่จะแสดงข้อความที่ถูกตัดทอนมันมีวัตถุประสงค์เพื่อทีเซอร์ที่ฉันไม่ค่อยต้องการ html แต่ถ้าคุณต้องการเก็บ html ไว้คุณสามารถลองใช้ส่วนขยายนี้: gist.github.com/leon/2857883
squall3d

1
ถ้าฉันใช้ภาพในช่องร่างกาย หมายเลข 2 ไม่ทำงานกับรูปภาพ มีรหัสอื่นจะพิมพ์ภาพเช่นกัน
logeshvaran

5

ตอนนี้คุณสามารถทำเช่นนี้กับtwig_extender|truncateโมดูลและการใช้งาน

นี่คือตัวอย่างของวิธีใช้ในเทมเพลต. twig โปรดทราบว่าฉันยังใช้twig_field_value ด้วย :

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

หมายเหตุ: ฉันมักจะตั้งค่า devel ของฉัน (./admin/config/development/devel) ให้ใช้Symfony var-dumperและสามารถหาโซ่ได้ด้วย

เช่น: {{ devel_dump(content.field_name|field_value) }}


4

การปรับปรุง:

  1. หากคุณตัดแท็กที่คุณควร|trimจะได้รับการกำจัดช่องว่าง
  2. ตัดขอบคำ - ดูด้านล่างslice()และsplit()
  3. ใช้จุดไข่ปลา ( …) แทนที่จะเป็น "... "
  4. |raw ผลลัพธ์

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

นี่คือวิธีที่ฉันจัดการสิ่งนี้

ตัวอย่าง:
field - node - body - 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 %}
...
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.