Réponses:
{{ myentity.text|length > 50 ? myentity.text|slice(0, 50) ~ '...' : myentity.text }}
Vous avez besoin de Twig 1.6
{{ text > 50 ? text|slice(0, 51)|split(' ')|slice(0, -1)|join(' ') ~ '…' : text }}
. Je recommande également d'utiliser le caractère points de suspension ( …
) au lieu de 3 vrais points ( ...
)
{{ myentity.text[:50] ~ (myentity.text|length > 50 ? '...') }}
|length
après le premier text
mais c'est parfait, merci!
pourquoi ne pas utiliser le filtre tronqué ou wordwrap de twig? Il appartient aux extensions twig et lib fait partie de Symfony2.0 comme je le vois.
{{ text|truncate(50) }}
...
, le deuxième paramètre doit être défini sur true
tel que{{ text|truncate(50, true)
require twig/extensions
Un autre est:
{{ myentity.text[:50] ~ '...' }}
Je sais que c'est une question très ancienne, mais à partir de twig 1.6, vous pouvez utiliser le filtre de tranche;
{{ myentity.text|slice(0, 50) ~ '...' }}
La deuxième partie du tilde est facultative si vous souhaitez ajouter quelque chose, par exemple les points de suspension.
Edit: Mon mauvais, je vois que la réponse la plus votée utilise le filtre de tranche.
Solution @olegkhuss avec UTF-8 Elipsis nommé:
{{ (my.text|length > 50 ? my.text|slice(0, 50) ~ '…' : my.text) }}
text
variable.
Solution @mshobnr / @olegkhuss transformée en une simple macro:
{% macro trunc(txt, len) -%}
{{ txt|length > len ? txt|slice(0, len) ~ '…' : txt }}
{%- endmacro %}
Exemple d'utilisation:
{{ tools.trunc('This is the text to truncate. ', 50) }}
Nb j'importe un template Twig contenant des macros et l'importe comme 'outils' comme celui-ci (Symfony):
{% import "@AppBundle/tools.html.twig" as tools -%}
De plus, j'ai remplacé le code de caractère html par le caractère réel, cela ne devrait poser aucun problème lors de l'utilisation de UTF-8 comme encodage de fichier. De cette façon, vous n'avez pas à utiliser |raw
(car cela pourrait causer un problème de sécurité).
Une solution encore plus élégante consiste à limiter le texte par le nombre de mots (et non par le nombre de caractères). Cela empêche les déchirures laides (par exemple, «Stackov ...»).
Voici un exemple où je raccourcis uniquement les blocs de texte de plus de 10 mots:
{% set text = myentity.text |split(' ') %}
{% if text|length > 10 %}
{% for t in text|slice(0, 10) %}
{{ t }}
{% endfor %}
...
{% else %}
{{ text|join(' ') }}
{% endif %}
Vous pouvez limiter de la manière suivante. Le premier est l'index de départ et le second est le nombre de caractères.
**{{ results['text'][4:2] }}**
Utilisez le filtre tronquer pour couper une chaîne une fois la limite atteinte
{{ "Hello World!"|truncate(5) }} // default separator is ...
Bonjour...
Vous pouvez également indiquer à truncate de conserver des mots entiers en définissant le deuxième paramètre sur true. Si le dernier mot est sur le séparateur, tronquer imprimera le mot entier.
{{ "Hello World!"|truncate(7, true) }} // preserve words
Ici Hello World!
Si vous souhaitez modifier le séparateur, définissez simplement le troisième paramètre sur le séparateur souhaité.
{{ "Hello World!"|truncate(7, false, "??") }}
Bonjour W ??
Mise à jour pour Twig 2 et Twig 3.
le filtre tronqué n'est pas disponible, à la place, vous pouvez utiliser u-filter
Voici un exemple:
{{ 'Lorem ipsum'|u.truncate(8) }}
Lorem ip
{{ 'Lorem ipsum'|u.truncate(8, '...') }}
Lorem...
Remarque: ce filtre fait partie de StringExtension qui peut être requis par
twig/string-extra
J'ai écrit ce marco simple dans le même but, j'espère que cela aide:
{%- macro stringMaxLength(str, maxLength) -%}
{%- if str | length < maxLength -%}
{{ str }}
{%- else -%}
{{ str|slice(0, maxLength) }}...
{%- endif -%}
{%- endmacro -%}
Exemple d'utilisation n ° 1 (sortie: "ma longue chaîne ici ..."):
{{ _self.stringMaxLength("my long string here bla bla bla la", 20) }}
Exemple d'utilisation n ° 2 (sortie: "chaîne plus courte!"):
{{ _self.stringMaxLength("shorter string!", 20) }}
La bugginess * dans les nouvelles capacités de Drupal 8 nous a inspiré ici pour écrire la nôtre:
<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>
Cela prend en considération à la fois les mots et les caractères (* le paramètre «limite de mot» dans D8 n'affichait rien).
Il est préférable d'utiliser un caractère HTML
{{ entity.text[:50] }}…
…
.
...
et c'est une ellipse…