ฉันจะจำกัดความยาวของข้อความเช่น 50 และใส่จุดสามจุดในจอแสดงผลได้อย่างไร
{% if myentity.text|length > 50 %}
{% block td_text %} {{ myentity.text}}{% endblock %}
{%endif%}
ฉันจะจำกัดความยาวของข้อความเช่น 50 และใส่จุดสามจุดในจอแสดงผลได้อย่างไร
{% if myentity.text|length > 50 %}
{% block td_text %} {{ myentity.text}}{% endblock %}
{%endif%}
คำตอบ:
{{ myentity.text|length > 50 ? myentity.text|slice(0, 50) ~ '...' : myentity.text }}
คุณต้องTwig 1.6
{{ text > 50 ? text|slice(0, 51)|split(' ')|slice(0, -1)|join(' ') ~ '…' : text }}
นอกจากนี้หากคุณต้องการที่จะตัดคำที่คุณสามารถทำมันได้เช่นนี้ ฉันขอแนะนำให้ใช้อักขระจุดไข่ปลา ( …
) แทน 3 จุดจริง ( ...
)
{{ myentity.text[:50] ~ (myentity.text|length > 50 ? '...') }}
|length
ครั้งแรกtext
แต่ก็สมบูรณ์แบบขอบคุณ!
ทำไมไม่ใช้ตัวกรองการตัดทอนหรือการตัดคำของกิ่งไม้ มันเป็นของส่วนขยาย twigและ lib เป็นส่วนหนึ่งของ Symfony2.0 อย่างที่ฉันเห็น
{{ text|truncate(50) }}
...
ควรตั้งค่าพารามิเตอร์ที่สองเป็นtrue
เช่น{{ text|truncate(50, true)
require twig/extensions
อีกประการหนึ่งคือ:
{{ myentity.text[:50] ~ '...' }}
ฉันรู้ว่านี่เป็นคำถามเก่ามาก แต่จาก twig 1.6 คุณสามารถใช้ตัวกรองสไลซ์
{{ myentity.text|slice(0, 50) ~ '...' }}
ส่วนที่สองจากเครื่องหมายทิลเดเป็นทางเลือกหากคุณต้องการเพิ่มบางอย่างเช่นจุดไข่ปลา
แก้ไข:แย่จังฉันเห็นคำตอบที่ได้รับการโหวตมากที่สุดใช้ประโยชน์จากตัวกรองสไลซ์
โซลูชัน @olegkhuss ที่มีชื่อว่า UTF-8 Elipsis:
{{ (my.text|length > 50 ? my.text|slice(0, 50) ~ '…' : my.text) }}
text
ตัวแปร
@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
(เพราะอาจทำให้เกิดปัญหาด้านความปลอดภัย)
วิธีแก้ปัญหาที่สวยงามยิ่งขึ้นคือการ จำกัด ข้อความด้วยจำนวนคำ (ไม่ใช่ตามจำนวนอักขระ) ซึ่งจะช่วยป้องกันการฉีกขาดที่น่าเกลียด (เช่น 'Stackov ... ')
นี่คือตัวอย่างที่ฉันย่อเฉพาะบล็อกข้อความที่มีความยาวมากกว่า 10 คำ:
{% set text = myentity.text |split(' ') %}
{% if text|length > 10 %}
{% for t in text|slice(0, 10) %}
{{ t }}
{% endfor %}
...
{% else %}
{{ text|join(' ') }}
{% endif %}
คุณสามารถ จำกัด ได้ด้วยวิธีต่อไปนี้ อันดับแรกคือดัชนีเริ่มต้นและอันดับที่สองคือจำนวนอักขระ
**{{ results['text'][4:2] }}**
ใช้ตัวกรองตัดทอนเพื่อตัดสตริงหลังจากถึงขีด จำกัด
{{ "Hello World!"|truncate(5) }} // default separator is ...
สวัสดี...
คุณยังสามารถบอกตัดทอนเพื่อรักษาทั้งคำได้โดยตั้งค่าพารามิเตอร์ที่สองเป็นจริง ถ้า Word สุดท้ายอยู่บนตัวคั่นการตัดทอนจะพิมพ์ทั้ง Word
{{ "Hello World!"|truncate(7, true) }} // preserve words
ที่นี่สวัสดีชาวโลก!
หากคุณต้องการเปลี่ยนตัวคั่นเพียงแค่ตั้งค่าพารามิเตอร์ที่สามเป็นตัวคั่นที่คุณต้องการ
{{ "Hello World!"|truncate(7, false, "??") }}
สวัสดี W ??
อัปเดตสำหรับ Twig 2 และ Twig 3
ไม่สามารถใช้ตัวกรองตัดทอนได้คุณอาจใช้ตัวกรอง uแทนแทน
นี่คือตัวอย่าง:
{{ 'Lorem ipsum'|u.truncate(8) }}
Lorem ip
{{ 'Lorem ipsum'|u.truncate(8, '...') }}
Lorem...
หมายเหตุ: ตัวกรองนี้เป็นส่วนหนึ่งของ StringExtension ที่สามารถกำหนดได้โดย
twig/string-extra
ฉันเขียนมาร์โคง่ายๆนี้เพื่อจุดประสงค์เดียวกันหวังว่าจะช่วยได้:
{%- 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) }}
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 ไม่แสดงอะไรเลย)
ใช้อักขระ HTML จะดีกว่า
{{ entity.text[:50] }}…
…
คือ
...
และนี่คือ Ellipsis…