symfony 2 twig giới hạn độ dài của văn bản và đặt ba dấu chấm


128

Làm cách nào tôi có thể giới hạn độ dài của văn bản, ví dụ: 50 và đặt ba dấu chấm vào màn hình?

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

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

{%endif%}

4
"Ba dấu chấm" thực sự là một ký tự đơn gọi là Ellipsis. Đây là ba điểm dừng đầy đủ ...và đây là một Ellipsis
Luke Cousins

Câu trả lời:


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

Bạn cần Twig 1.6


đây sẽ là câu trả lời, vẫn hoạt động cho đến bây giờ;)
whalesingswee

Làm thế nào chúng ta có thể thêm một liên kết đến ...?
mburakergenc

11
Ngoài ra, nếu bạn muốn cắt từ, bạn có thể làm như thế này : {{ text > 50 ? text|slice(0, 51)|split(' ')|slice(0, -1)|join(' ') ~ '…' : text }}. Tôi cũng khuyên bạn nên sử dụng ký tự dấu chấm lửng ( ) thay vì 3 dấu chấm thực ( ...)
Nemo64

2
Ngắn {{ myentity.text[:50] ~ (myentity.text|length > 50 ? '...') }}
gọn

1
@ Nemo64 bạn chỉ thiếu |lengthcái đầu tiên textnhưng thật hoàn hảo, cảm ơn bạn!
mtefi

116

Tại sao không sử dụng bộ lọc cắt xén hoặc wordwrap của twig? Nó thuộc về phần mở rộng twig và lib là một phần của Symfony2.0 như tôi thấy.

{{ text|truncate(50) }}

5
Tôi đang sử dụng Symfony 2.3 và bộ lọc cắt ngắn không phải là một phần của tiện ích mở rộng mặc định. Do đó, tôi đã dùng đến giải pháp của Manuel.
maurits

8
Để bật tiện ích mở rộng trong Symfony, hãy thêm tiện ích này vào một trong các tệp cấu hình của bạn: gist.github.com/pschultz/f33bfff72692ca0b6916
Peter

1
Để append ..., tham số thứ hai nên được đặt truenhư{{ text|truncate(50, true)
Sithu

Trên thực tế, việc đặt tham số thứ hai thành true sẽ khiến nó bảo toàn toàn bộ từ. Nó thêm các hình elip theo mặc định. Tham số thứ ba có thể thay đổi các hình elip thành bất cứ điều gì bạn muốn. twig-extensions.readthedocs.io/en/latest/ từ
beta

1
Sử dụng Symfony 2.8, tôi đã phải cài đặt tiện ích mở rộng này để sử dụng nó. require twig/extensions
beta

35

Một số khác là:

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

7
vấn đề duy nhất là nó luôn hiển thị các dấu chấm ...: / nghĩ rằng tôi sẽ đi với giải pháp đầu tiên.
Markus Kottländer

1
Xin vui lòng, bạn có thể chia sẻ liên kết nơi tài liệu về [x: x] này được đặt không?
BENARD Patrick

Luôn luôn có ba dấu chấm ở đó ... không thực sự trả lời câu hỏi.
dmmd

17

Tôi biết đây là một câu hỏi rất cũ, nhưng từ twig 1.6, bạn có thể sử dụng bộ lọc lát;

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

Phần thứ hai từ dấu ngã là tùy chọn nếu bạn muốn thêm một cái gì đó, ví dụ như dấu chấm lửng.

Chỉnh sửa: Xấu của tôi, tôi thấy câu trả lời được bình chọn nhiều nhất sử dụng bộ lọc lát.


10

Giải pháp @olegkhuss có tên là UTF-8 Elipsis: {{ (my.text|length > 50 ? my.text|slice(0, 50) ~ '…' : my.text) }}


2
Xin lưu ý giải pháp này cho phép tiêm HTML thông qua textbiến.
emix

1
@ michael-zukowski Bạn nói đúng. Tôi đã thay đổi giải pháp của tôi.
Matthias Schobner 20/03/18

8

@mshobnr / @olegkhuss giải pháp được tạo thành một macro đơn giản:

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

Ví dụ sử dụng:

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

Nb Tôi nhập mẫu Twig chứa macro và nhập dưới dạng 'công cụ' như thế này (Symfony):

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

Ngoài ra, tôi đã thay thế mã ký tự html bằng ký tự thực tế, điều này sẽ không có vấn đề gì khi sử dụng UTF-8 làm mã hóa tệp. Bằng cách này, bạn không phải sử dụng |raw(vì nó có thể gây ra sự cố bảo mật).


6

Một giải pháp thậm chí thanh lịch hơn là giới hạn văn bản theo số lượng từ (chứ không phải theo số lượng ký tự). Điều này ngăn chặn những vết rách xấu xí (ví dụ 'Stackov ...').

Đây là một ví dụ trong đó tôi chỉ rút ngắn các khối văn bản dài hơn 10 từ:

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

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

và không có nhu cầu bổ sung !!! chỉ cần những gì tôi cần, phân chia bởi khoảng trắng và lát bằng từ, thx !!!
Vladimir Ch

Hoạt động như một bùa mê
VDarricau

2

Bạn có thể giới hạn theo cách sau. Đầu tiên là chỉ số bắt đầu và thứ hai là số lượng ký tự.

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

2

Sử dụng bộ lọc cắt ngắn để cắt một chuỗi sau khi đạt đến giới hạn

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

Xin chào...

Bạn cũng có thể yêu cầu cắt ngắn để bảo toàn toàn bộ từ bằng cách đặt tham số thứ hai thành true. Nếu từ cuối cùng nằm trên dấu phân cách, cắt ngắn sẽ in ra toàn bộ Word.

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

Xin chào thế giới!

Nếu bạn muốn thay đổi dấu phân cách, chỉ cần đặt tham số thứ ba thành dấu phân cách bạn muốn.

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

Xin chào


1

Cập nhật cho Twig 2 và Twig 3.

Bộ lọc cắt ngắn không có sẵn, thay vào đó, bạn có thể sử dụng bộ lọc u

đây là một ví dụ:

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

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

Lưu ý: bộ lọc này là một phần của StringExtension có thể được yêu cầu bởi

twig/string-extra

0

Tôi đã viết marco đơn giản này cho cùng một mục đích, hy vọng nó sẽ giúp:

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

Ví dụ sử dụng # 1 (Kết quả: "chuỗi dài của tôi ở đây ..."):

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

Ví dụ sử dụng # 2 (Đầu ra: "chuỗi ngắn hơn!"):

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

0

Bugginess * trong các khả năng mới của Drupal 8 ở đây đã truyền cảm hứng cho chúng tôi tự viết:

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

Điều này sẽ được xem xét cả từ và ký tự (* cài đặt "ranh giới từ" trong D8 không hiển thị gì).


-1

Tốt hơn là sử dụng một ký tự HTML

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

Bạn có thể thêm một số lời giải thích cho câu trả lời của bạn? Tại sao người ta nên sử dụng một thực thể HTML? Và tại sao bạn lại thêm nó vào văn bản trong từng trường hợp, ngay cả khi văn bản dài dưới 50 ký tự?
Nico Haase

Xin chào, nếu bạn viết ba dấu chấm thì đó là ba dấu chấm riêng biệt nhưng ký tự "ba chấm" được gọi là dấu chấm lửng. Thực thể html dấu chấm lửng là &#8230;.
Théo Attali

Và tại sao không sử dụng ký tự unicode cho dấu chấm lửng đó?
Nico Haase

Bạn cũng có thể sử dụng nó! bình luận này là một câu trả lời cho bình luận đó stackoverflow.com/a/17118915/5923187 nhưng động thái đó đã bị khóa vì danh tiếng của tôi
Théo Attali
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.