symfony 2 twig จำกัดความยาวของข้อความและใส่จุดสามจุด


128

ฉันจะจำกัดความยาวของข้อความเช่น 50 และใส่จุดสามจุดในจอแสดงผลได้อย่างไร

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

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

{%endif%}

4
"จุดสามจุด" เป็นอักขระเดี่ยวที่เรียกว่าจุดไข่ปลา นี่คือจุดแวะพักแบบเต็มสามจุด...และนี่คือ Ellipsis
Luke Cousins

คำตอบ:


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

คุณต้องTwig 1.6


นี่น่าจะเป็นคำตอบยังคงใช้งานได้จนถึงตอนนี้;)
whalesingswee

เราจะเพิ่มลิงค์ไปยัง ... ได้อย่างไร?
mburakergenc

11
{{ text > 50 ? text|slice(0, 51)|split(' ')|slice(0, -1)|join(' ') ~ '…' : text }}นอกจากนี้หากคุณต้องการที่จะตัดคำที่คุณสามารถทำมันได้เช่นนี้ ฉันขอแนะนำให้ใช้อักขระจุดไข่ปลา ( ) แทน 3 จุดจริง ( ...)
Nemo64

2
สั้นกว่า:{{ myentity.text[:50] ~ (myentity.text|length > 50 ? '...') }}
mts knn

1
@ Nemo64 คุณเพิ่งพลาด|lengthครั้งแรกtextแต่ก็สมบูรณ์แบบขอบคุณ!
mtefi

116

ทำไมไม่ใช้ตัวกรองการตัดทอนหรือการตัดคำของกิ่งไม้ มันเป็นของส่วนขยาย twigและ lib เป็นส่วนหนึ่งของ Symfony2.0 อย่างที่ฉันเห็น

{{ text|truncate(50) }}

5
ฉันใช้ Symfony 2.3 และตัวกรองการตัดทอนไม่ได้เป็นส่วนหนึ่งของส่วนขยายเริ่มต้น ดังนั้นฉันจึงใช้วิธีแก้ปัญหาของมานูเอลแทน
maurits

8
หากต้องการเปิดใช้งานส่วนขยายใน Symfony ให้เพิ่มสิ่งนี้ลงในไฟล์การกำหนดค่าของคุณ: gist.github.com/pschultz/f33bfff72692ca0b6916
Peter

1
ในการต่อท้าย...ควรตั้งค่าพารามิเตอร์ที่สองเป็นtrueเช่น{{ text|truncate(50, true)
Sithu

จริงๆแล้วการตั้งค่าพารามิเตอร์ที่สองเป็นจริงจะทำให้มันคงคำทั้งหมดไว้ จะเพิ่มจุดไข่ปลาตามค่าเริ่มต้น พารามิเตอร์ที่สามสามารถเปลี่ยนจุดไข่ปลาเป็นอะไรก็ได้ที่คุณต้องการ twig-extensions.readthedocs.io/en/latest/…
beta

1
เมื่อใช้ Symfony 2.8 ฉันต้องติดตั้งส่วนขยายนี้เพื่อใช้งาน require twig/extensions
เบต้า

35

อีกประการหนึ่งคือ:

{{ myentity.text[:50] ~ '...' }}

7
ปัญหาเดียวคือมันมักจะแสดงจุด ... : / คิดว่าฉันจะไปกับวิธีแก้ปัญหาแรก
Markus Kottländer

1
ได้โปรดคุณช่วยแชร์ลิงก์ที่เอกสารเกี่ยวกับ [x: x] นี้ได้ไหม
BENARD Patrick

มีจุดสามจุดอยู่ตรงนั้นเสมอ ... ไม่ได้ตอบคำถามจริงๆ
dmmd

17

ฉันรู้ว่านี่เป็นคำถามเก่ามาก แต่จาก twig 1.6 คุณสามารถใช้ตัวกรองสไลซ์

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

ส่วนที่สองจากเครื่องหมายทิลเดเป็นทางเลือกหากคุณต้องการเพิ่มบางอย่างเช่นจุดไข่ปลา

แก้ไข:แย่จังฉันเห็นคำตอบที่ได้รับการโหวตมากที่สุดใช้ประโยชน์จากตัวกรองสไลซ์


10

โซลูชัน @olegkhuss ที่มีชื่อว่า UTF-8 Elipsis: {{ (my.text|length > 50 ? my.text|slice(0, 50) ~ '…' : my.text) }}


2
โปรดทราบว่าโซลูชันนี้เปิดใช้งานการแทรก HTML ผ่านtextตัวแปร
emix

1
@ michael-zukowski คุณพูดถูก ฉันเปลี่ยนวิธีแก้ปัญหาแล้ว
Matthias Schobner

8

@mshobnr / @olegkhuss โซลูชันที่สร้างเป็นมาโครง่ายๆ:

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

ตัวอย่างการใช้งาน:

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

Nb ฉันนำเข้าเทมเพลต Twig ที่มีมาโครและนำเข้าเป็น 'เครื่องมือ' เช่นนี้ (Symfony):

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

นอกจากนี้ฉันแทนที่รหัสอักขระ html ด้วยอักขระจริงสิ่งนี้ไม่ควรมีปัญหาเมื่อใช้ UTF-8 เป็นการเข้ารหัสไฟล์ ด้วยวิธีนี้คุณไม่ต้องใช้|raw(เพราะอาจทำให้เกิดปัญหาด้านความปลอดภัย)


6

วิธีแก้ปัญหาที่สวยงามยิ่งขึ้นคือการ จำกัด ข้อความด้วยจำนวนคำ (ไม่ใช่ตามจำนวนอักขระ) ซึ่งจะช่วยป้องกันการฉีกขาดที่น่าเกลียด (เช่น 'Stackov ... ')

นี่คือตัวอย่างที่ฉันย่อเฉพาะบล็อกข้อความที่มีความยาวมากกว่า 10 คำ:

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

{% if text|length > 10 %} 
    {% for t in text|slice(0, 10) %}
        {{ t }} 
    {% endfor %}
    ...
{% else %}
    {{ text|join(' ') }}
{% endif %}

และไม่ต้องแอดออน !!! เพียงแค่สิ่งที่ฉันต้องการแบ่งตามช่องว่างและชิ้นส่วนด้วยคำขอบคุณ !!!
Vladimir Ch

ทำงานได้อย่างมีเสน่ห์
VDarricau

2

คุณสามารถ จำกัด ได้ด้วยวิธีต่อไปนี้ อันดับแรกคือดัชนีเริ่มต้นและอันดับที่สองคือจำนวนอักขระ

**{{ results['text'][4:2] }}**

2

ใช้ตัวกรองตัดทอนเพื่อตัดสตริงหลังจากถึงขีด จำกัด

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

สวัสดี...

คุณยังสามารถบอกตัดทอนเพื่อรักษาทั้งคำได้โดยตั้งค่าพารามิเตอร์ที่สองเป็นจริง ถ้า Word สุดท้ายอยู่บนตัวคั่นการตัดทอนจะพิมพ์ทั้ง Word

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

ที่นี่สวัสดีชาวโลก!

หากคุณต้องการเปลี่ยนตัวคั่นเพียงแค่ตั้งค่าพารามิเตอร์ที่สามเป็นตัวคั่นที่คุณต้องการ

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

สวัสดี W ??


1

อัปเดตสำหรับ Twig 2 และ Twig 3

ไม่สามารถใช้ตัวกรองตัดทอนได้คุณอาจใช้ตัวกรอง uแทนแทน

นี่คือตัวอย่าง:

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

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

หมายเหตุ: ตัวกรองนี้เป็นส่วนหนึ่งของ StringExtension ที่สามารถกำหนดได้โดย

twig/string-extra

0

ฉันเขียนมาร์โคง่ายๆนี้เพื่อจุดประสงค์เดียวกันหวังว่าจะช่วยได้:

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

ตัวอย่างการใช้งาน # 1 (ผลลัพธ์: "my long string here ... "):

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

ตัวอย่างการใช้งาน # 2 (ผลลัพธ์: "short string!"):

{{ _self.stringMaxLength("shorter string!", 20) }}

0

Bugginess * ในความสามารถใหม่ของ Drupal 8 ที่นี่เป็นแรงบันดาลใจให้เราเขียนของเราเอง:

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

สิ่งนี้คำนึงถึงทั้งคำและอักขระ (* การตั้งค่า "ขอบเขตคำ" ใน D8 ไม่แสดงอะไรเลย)


-1

ใช้อักขระ HTML จะดีกว่า

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

คุณช่วยเพิ่มคำอธิบายในคำตอบของคุณได้ไหม เหตุใดจึงควรใช้เอนทิตี HTML แล้วทำไมคุณถึงต่อท้ายข้อความในแต่ละกรณีแม้ว่าข้อความจะมีความยาวน้อยกว่า 50 ตัวอักษร?
Nico Haase

สวัสดีถ้าคุณเขียนจุดสามจุดมันจะเป็นจุดสามจุดที่แยกจากกัน แต่อักขระ "สามจุด" เรียกว่าจุดไข่ปลา กิจการจุดไข่ปลา HTML &#8230;คือ
Théo Attali

และทำไมไม่ใช้อักขระ Unicode สำหรับจุดไข่ปลานั้น?
Nico Haase

คุณก็ใช้ได้เช่นกัน! ความคิดเห็นนี้เป็นคำตอบสำหรับความคิดเห็นนั้นstackoverflow.com/a/17118915/5923187แต่การย้ายนั้นถูกล็อคเพราะชื่อเสียงของฉัน
Théo Attali
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.