web-dev-qa-db-ja.com

symfony 2 twigはテキストの長さを制限し、3つのドットを配置します

テキストの長さ(50など)を制限し、ディスプレイに3つのドットを配置するにはどうすればよいですか?

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

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

{%endif%}
112
GRafoKI
{{ myentity.text|length > 50 ? myentity.text|slice(0, 50) ~ '...' : myentity.text  }}

Twig 1.6 が必要です

185
olegkhuss

twigの切り捨てフィルターまたはワードラップフィルターを使用しないのはなぜですか? twig extensions に属し、libはSymfony2.0の一部です。

{{ text|truncate(50) }}
102
mrMantir

もう一つは:

{{ myentity.text[:50] ~ '...' }}
35
Manuel Bitto

これは非常に古い質問ですが、twig 1.6からはスライスフィルターを使用できます。

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

チルダの2番目の部分は、省略記号などを追加する場合のオプションです。

編集:私の悪い、私は、最も投票された答えがスライスフィルターを利用するのを見ます。

16
user3599441

名前付きUTF-8省略記号を使用した@olegkhussソリューション:{{ (my.text|length > 50 ? my.text|slice(0, 50) ~ '…' : my.text) }}

9

さらに洗練された解決策は、文字数ではなく単語数でテキストを制限することです。これにより、tearいティアスルーが防止されます(例:「Stackov ...」)。

以下に、10ワードより長いテキストブロックのみを短縮する例を示します。

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

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

@mshobnr/@olegkhussソリューションを単純なマクロにしたもの:

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

使用例:

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

N.b.マクロを含むTwigテンプレートをインポートし、次のような「ツール」としてインポートします(Symfony):

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

また、html文字コードを実際の文字に置き換えました。これは、ファイルエンコーディングとしてUTF-8を使用する場合は問題ありません。この方法では、|rawを使用する必要はありません(セキュリティ上の問題を引き起こす可能性があるため)。

5
Graftak

次の方法で制限できます。 1つ目は開始インデックスで、2つ目は文字数です。

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

ここでの新しいDrupal 8機能のBu​​gginess *は、私たちに独自の記述を促しました。

<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の「単語境界」設定には何も表示されませんでした)。

1
Jeff Brewster

私は同じ目的でこの簡単なマルコを書きました。

{%- 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(出力:「短い文字列!」):

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

HTML文字を使用することをお勧めします

{{ entity.text[:50] }}&#8230;
0
Théo Attali