本文(field_body)をトリミングする方法は?


10

レンダリングされたエンティティとしてコンテンツを表示するノードのビューを作成しました。特に、twigテンプレートでbodyフィールドを出力します。

{{ content.field_body }}

ここで、テキストを200文字に制限し、ドットを3つ配置します。これを行う3つの方法をテストしましたが、何も機能しませんでした。問題は、それぞれの方法がHTML文字を数え、トリミングすることです。

1:「表示の管理」に「トリミング」の形式を追加しました=>テキストは制限されていますが、正しくありません。そして、私は3つのドットを持っていません。

2:twigテンプレートのテキストをトリミングしました。しかし、テキストを数えるには、最初にそれをレンダリングする必要があります。これにより、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. twig拡張機能を登録します(未テスト):

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

チェックアウトできるもう1つの便利な拡張機能は、テキスト拡張機能です。これは、単語を切り刻むのを防ぐのに役立ちます。

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


2
最初のソリューションは不正な形式のタグであり、2番目のソリューションはすべてのhtmlタグを取り除きます。
ユセフ2016

1
@zhilevanうん、答えに記載されています。
squall3d 2016

1
@ squall3dストリップHTMLなしでスライスするためのソリューションは何ですか?
ユセフ2016

1
@zhilevan通常、切り詰められたテキストを表示したい場合は、ティーザーの目的で使用しますが、htmlはほとんど使用しません。ただし、htmlを保持する必要がある場合は、この拡張機能を試すことができます。gist.github.com
leon

1
本文フィールドで画像を使用する場合。いいえ2、画像では機能しません。他のコードはありますか?画像も印刷します
logeshvaran

5

これで、twig_extenderモジュールを使用してこれを実行し、を使用できます|truncate

これが.twigテンプレートで使用する方法の例です。twig_field_valueも使用していることに注意してください

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

注: 私は通常、Symfonyのvar-dumperを使用するように設定された開発設定(./admin/config/development/devel)を保持し、次のようにしてチェーンを把握できます

つまり: {{ 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.