Antworten:
{{ myentity.text|length > 50 ? myentity.text|slice(0, 50) ~ '...' : myentity.text }}
Du brauchst Twig 1.6
{{ text > 50 ? text|slice(0, 51)|split(' ')|slice(0, -1)|join(' ') ~ '…' : text }}
. Ich empfehle auch die Verwendung des Auslassungszeichens ( …
) anstelle von 3 echten Punkten ( ...
)
{{ myentity.text[:50] ~ (myentity.text|length > 50 ? '...') }}
|length
nach dem ersten text
aber das ist perfekt, danke!
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) }}
...
sollte der zweite Parameter true
wie {{ text|truncate(50, true)
require twig/extensions
Ein anderer ist:
{{ myentity.text[:50] ~ '...' }}
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.
@ olegkhuss-Lösung mit dem Namen UTF-8 Elipsis:
{{ (my.text|length > 50 ? my.text|slice(0, 50) ~ '…' : my.text) }}
text
Variable ermöglicht.
@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).
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 %}
Sie können auf folgende Weise einschränken. Erstens startet der Index und zweitens die Anzahl der Zeichen.
**{{ results['text'][4: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 ??
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
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) }}
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).
Es ist besser, ein HTML-Zeichen zu verwenden
{{ entity.text[:50] }}…
…
.
...
und dies ist eine Ellipse…