webentwicklung-frage-antwort-db.com.de

symfony 2 twig begrenzen die Länge des Textes und setzen drei Punkte

Wie kann ich die Textlänge begrenzen, z. B. 50, und drei Punkte in die Anzeige einfügen?

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

Sie benötigen Twig 1.6

185
olegkhuss

warum nicht Twigs Truncate- oder Wordwrap-Filter verwenden? Es gehört zu Zweigerweiterungen und lib ist ein Teil von Symfony2.0, wie ich sehe.

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

Ein anderer ist:

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

Ich weiß, dass dies eine sehr alte Frage ist, aber ab twig 1.6 können Sie den Slice-Filter verwenden;

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

Der zweite Teil der Tilde ist optional, wenn Sie etwas hinzufügen möchten, beispielsweise die Ellipse.

Edit: Meine schlechte, ich sehe die am häufigsten gewählte Antwort, benutze den Slice-Filter.

16
user3599441

@olegkhuss Lösung mit dem Namen UTF-8 Elipsis: {{ (my.text|length > 50 ? my.text|slice(0, 50) ~ '…' : my.text) }}

9

Eine noch elegantere Lösung besteht darin, den Text durch die Anzahl der Wörter (und nicht durch die Anzahl der Zeichen) zu begrenzen. Dies verhindert hässliche Durchrisse (z. B. "Stackov ...").

Hier ist ein Beispiel, in dem ich nur Textblöcke kürze, die länger als 10 Wörter sind:

{% 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 Lösung in ein einfaches Makro umgewandelt:

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

Anwendungsbeispiel:

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

N.b. Ich importiere eine Twig Vorlage mit Makros und importiere sie als 'Tools' wie folgt (Symfony):

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

Außerdem habe ich den HTML-Zeichencode durch das eigentliche Zeichen ersetzt. Dies sollte kein Problem sein, wenn UTF-8 als Dateicodierung verwendet wird. Auf diese Weise müssen Sie nicht |raw Verwenden (da dies ein Sicherheitsproblem verursachen könnte).

5
Graftak

Sie können auf folgende Weise einschränken. Erstens beginnt der Index und zweitens die Anzahl der Zeichen.

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

Bugginess * in den neuen Drupal 8 Funktionen hier hat uns dazu inspiriert, unsere eigenen zu schreiben:

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

Dies berücksichtigt sowohl Wörter als auch Zeichen (* die Einstellung "Wortgrenze" in D8 zeigte nichts an).

1
Jeff Brewster

Ich habe diesen einfachen Marco für den gleichen Zweck geschrieben, hoffe, es hilft:

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

Anwendungsbeispiel 1 (Ausgabe: "Meine lange Zeichenfolge hier ..."):

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

Anwendungsbeispiel 2 (Ausgabe: "Kürzere Zeichenfolge!"):

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

Es ist besser, ein HTML-Zeichen zu verwenden

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