본문을 자르는 방법 (field_body)?


10

컨텐츠를 렌더링 된 엔티티로 표시하는 노드에 대한보기를 작성했습니다. 무엇보다도, 나는 나뭇 가지 템플릿으로 body field를 출력합니다 :

{{ content.field_body }}

이제 텍스트를 200 자로 제한하고 3 개의 점을 넣고 싶습니다. 나는 그것을하기 위해 세 가지 다른 방법을 테스트했지만 아무것도 효과가 없습니다. 문제는 각 방법으로 HTML 문자를 세고 자릅니다.

1 : "표시 관리"에 "Trimmed"형식을 추가했습니다. => 텍스트가 제한되어 있지만 올바르지 않습니다. 그리고 나는 세 개의 점이 없습니다.

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. 먼저 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 스트립 HTML없이 슬라이스를위한 솔루션은 무엇입니까?
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.