Làm thế nào để cắt văn bản cơ thể (field_body)?


10

Tôi đã tạo chế độ xem cho một nút hiển thị nội dung dưới dạng thực thể được hiển thị. Trong số những người khác, tôi xuất trường cơ thể trong mẫu twig:

{{ content.field_body }}

Bây giờ, tôi muốn giới hạn văn bản trong 200 ký tự và đặt ba dấu chấm. Tôi đã thử nghiệm ba cách khác nhau để làm điều đó, nhưng không có gì hiệu quả. Vấn đề là, mỗi cách cũng tính và cắt các ký tự HTML.

1: Tôi đã thêm định dạng "Cắt xén" trong "Quản lý hiển thị" => Văn bản bị giới hạn nhưng không chính xác. Và tôi không có ba dấu chấm.

2: Tôi đã cắt văn bản trong mẫu twig. Nhưng để đếm văn bản tôi phải kết xuất nó trước. Do đó, twig xuất văn bản dưới dạng HTML (Tôi thấy các thẻ HTML trên trang của mình!)

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

3: Tôi đã cố gắng giải quyết vấn đề trong template_pre process_node (). Ở đây tôi cũng gặp vấn đề tương tự với việc đếm đánh dấu HTML.

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

Làm thế nào tôi có thể cắt văn bản của tôi phải không?

Cảm ơn bạn rất nhiều vì đã giúp đỡ của bạn!

Câu trả lời:


18

Có một vài giải pháp bạn có thể thử nhưng lưu ý cắt ngắn chuỗi bằng html nói chung là một ý tưởng tồi do có các thẻ không rõ ràng hoặc không đúng định dạng.

1. Sử dụng | raw để xuất html dưới dạng html, có thể tạo các thẻ không đúng định dạng:

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

2. Dải html trước, sạch hơn:

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

3. Đăng ký một phần mở rộng twig (chưa được kiểm tra):

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

Một tiện ích mở rộng hữu ích khác mà bạn có thể kiểm tra là tiện ích mở rộng Văn bản, giúp bạn ngăn chặn việc băm chữ:

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


2
giải pháp đầu tiên thẻ không đúng định dạng và giải pháp thứ hai tước tất cả các thẻ html.
Yusef

1
@zhilevan yep, như được mô tả trong câu trả lời.
squall3d

1
@ squall3d giải pháp của bạn để cắt nó mà không có dải html là gì?
Yusef

1
@zhilevan thường khi tôi muốn hiển thị văn bản bị cắt bớt, nó nhằm mục đích trêu ghẹo, nơi tôi hiếm khi muốn html. Nhưng nếu bạn cần bảo toàn html, bạn có thể thử tiện ích mở rộng này: gist.github.com/leon/2857883
squall3d

1
Nếu tôi sử dụng hình ảnh trong lĩnh vực cơ thể. Không 2, không hoạt động cho hình ảnh. Có mã nào khác không, cũng sẽ in hình ảnh
logeshvaran

5

Bây giờ bạn có thể làm điều này với mô-đun twig_extender và sử dụng |truncate.

Dưới đây là một ví dụ về cách sử dụng nó trong mẫu .twig, lưu ý rằng tôi cũng đang sử dụng twig_field_value :

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

lưu ý: Tôi thường giữ cài đặt phát âm của mình (./admin/config/development/devel) để sử dụng Symfony var-dumper và có thể tìm ra chuỗi với

I E: {{ devel_dump(content.field_name|field_value) }}


4

Cải tiến:

  1. nếu bạn tách thẻ bạn nên |trimđể thoát khỏi khoảng trắng
  2. cắt trên ranh giới từ - xem bên dưới slice()split()
  3. Sử dụng dấu chấm lửng ( …) thay vì "..."
  4. |raw đầu ra

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

Đây là cách tôi xử lý này.

Ví dụ:
trường - nút - cơ thể - 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 %}
...
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.