Der Zweig symfony 2 begrenzt die Länge des Textes und setzt drei Punkte


128

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

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

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

{%endif%}

4
Die "drei Punkte" sind eigentlich ein einzelnes Zeichen, das als Ellipse bezeichnet wird. Dies ist drei Punkte ...und dies ist eine Ellipse
Luke Cousins

Antworten:


204
{{ myentity.text|length > 50 ? myentity.text|slice(0, 50) ~ '...' : myentity.text  }}

Du brauchst Twig 1.6


Dies sollte die Antwort sein, die bis jetzt noch funktioniert;)
Walesingswee

Wie können wir einen Link zu ... hinzufügen?
mburakergenc

11
Wenn Sie ein Wort beschneiden möchten, können Sie dies außerdem folgendermaßen tun : {{ text > 50 ? text|slice(0, 51)|split(' ')|slice(0, -1)|join(' ') ~ '…' : text }}. Ich empfehle auch die Verwendung des Auslassungszeichens ( ) anstelle von 3 echten Punkten ( ...)
Nemo64

2
Kürzere:{{ myentity.text[:50] ~ (myentity.text|length > 50 ? '...') }}
mts knn

1
@ Nemo64 du vermisst nur das |lengthnach dem ersten textaber das ist perfekt, danke!
Mtefi

116

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

{{ text|truncate(50) }}

5
Ich verwende Symfony 2.3 und der Filter zum Abschneiden ist nicht Teil der Standarderweiterungen. Deshalb habe ich stattdessen auf Manuels Lösung zurückgegriffen.
Maurits

8
Um die Erweiterung in Symfony zu aktivieren, fügen Sie diese zu einer Ihrer Konfigurationsdateien hinzu: gist.github.com/pschultz/f33bfff72692ca0b6916
Peter

1
Zum Anhängen ...sollte der zweite Parameter truewie {{ text|truncate(50, true)
folgt

Wenn Sie den zweiten Parameter tatsächlich auf true setzen, bleiben ganze Wörter erhalten. Standardmäßig werden die Ellipsen hinzugefügt. Der dritte Parameter kann die Ellipsen nach Belieben ändern. twig-extensions.readthedocs.io/en/latest/…
Beta

1
Mit Symfony 2.8 musste ich diese Erweiterung installieren, um sie verwenden zu können. require twig/extensions
Beta

35

Ein anderer ist:

{{ myentity.text[:50] ~ '...' }}

7
Das einzige Problem ist, dass es immer die Punkte zeigt ...: Ich denke, ich werde mit der ersten Lösung gehen.
Markus Kottländer

1
Können Sie bitte den Link teilen, über den sich das Dokument zu diesem [x: x] befindet?
BENARD Patrick

Immer mit den drei Punkten da ... beantwortet die Frage nicht wirklich.
dmmd

17

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

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

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

Bearbeiten: Meine schlechte, ich sehe, dass die am besten bewertete Antwort den Slice-Filter verwendet.


10

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


2
Beachten Sie bitte, dass diese Lösung die HTML-Injection über die textVariable ermöglicht.
Emix

1
@ michael-zukowski Du hast recht. Ich habe meine Lösung geändert.
Matthias Schobner

8

@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) }}

Nb Ich importiere eine Twig-Vorlage mit Makros und importiere sie als 'Werkzeuge' wie diese (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 verwenden |raw(da dies ein Sicherheitsproblem verursachen könnte).


6

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 Durchbrüche (zB '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 %}

und keine zusätzlichen Bedürfnisse !!! genau das, was ich brauchte, geteilt durch Leerzeichen und Scheiben durch Worte, danke !!!
Vladimir Ch

Funktioniert wie ein Zauber
VDarricau

2

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

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

2

Verwenden Sie den Kürzungsfilter, um eine Zeichenfolge nach Erreichen des Grenzwerts abzuschneiden

{{ "Hello World!"|truncate(5) }} // default separator is ...

Hallo...

Sie können truncate auch anweisen, ganze Wörter beizubehalten, indem Sie den zweiten Parameter auf true setzen. Wenn sich das letzte Wort im Trennzeichen befindet, wird beim Abschneiden das gesamte Wort ausgedruckt.

 {{ "Hello World!"|truncate(7, true) }} // preserve words

Hier Hallo Welt!

Wenn Sie das Trennzeichen ändern möchten, setzen Sie einfach den dritten Parameter auf das gewünschte Trennzeichen.

{{ "Hello World!"|truncate(7, false, "??") }} 

Hallo W ??


1

Update für Twig 2 und Twig 3.

Filter abschneiden ist nicht verfügbar, stattdessen können Sie U-Filter verwenden

Hier ist ein Beispiel:

{{ 'Lorem ipsum'|u.truncate(8) }}
Lorem ip

{{ 'Lorem ipsum'|u.truncate(8, '...') }}
Lorem...

Hinweis: Dieser Filter ist Teil von StringExtension, der von benötigt werden kann

twig/string-extra

0

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

Verwendungsbeispiel 1 (Ausgabe: "meine lange Zeichenfolge hier ..."):

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

Verwendungsbeispiel 2 (Ausgabe: "kürzere Zeichenfolge!"):

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

0

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

Es ist besser, ein HTML-Zeichen zu verwenden

{{ entity.text[:50] }}&#8230;

Können Sie Ihrer Antwort eine Erklärung hinzufügen? Warum sollte man eine HTML-Entität verwenden? Und warum hängen Sie es in jedem Fall an den Text an, auch wenn der Text weniger als 50 Zeichen lang ist?
Nico Haase

Hallo, wenn Sie drei Punkte schreiben, sind es drei separate Punkte, aber das Zeichen "drei Punkte" wird als Ellipse bezeichnet. Die Auslassungs-HTML-Entität ist &#8230;.
Théo Attali

Und warum nicht das Unicode-Zeichen für diese Ellipse verwenden?
Nico Haase

Sie können es auch verwenden! Dieser Kommentar war eine Antwort auf diesen Kommentar stackoverflow.com/a/17118915/5923187, aber dieser Schritt wurde wegen meines Rufs gesperrt
Théo Attali
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.