symfony 2 twig limite la longueur du texte et met trois points

128

Comment puis-je limiter la longueur du texte, par exemple 50, et mettre trois points à l'écran?

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

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

{%endif%}
GRafoKI
la source
4
Les "trois points" sont en fait un seul caractère appelé une ellipse. C'est trois arrêts complets ...et c'est une ellipse
Luke Cousins

Réponses:

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

Vous avez besoin de Twig 1.6

olégkhuss
la source
cela devrait être la réponse, qui fonctionne toujours jusqu'à présent;)
whalesingswee
Comment ajouter un lien vers ...?
mburakergenc
11
En outre, si vous voulez rogner sur un mot, vous pouvez le faire comme ceci: {{ 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 ( ...)
Nemo64
2
Plus court:{{ myentity.text[:50] ~ (myentity.text|length > 50 ? '...') }}
mts knn
1
@ Nemo64 vous manque juste l' |lengthaprès le premier textmais c'est parfait, merci!
mtefi
116

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) }}
mrMantir
la source
5
J'utilise Symfony 2.3 et le filtre tronqué ne fait pas partie des extensions par défaut. Par conséquent, j'ai eu recours à la solution de Manuel à la place.
maurits
8
Pour activer l'extension dans Symfony, ajoutez ceci à l'un de vos fichiers de configuration: gist.github.com/pschultz/f33bfff72692ca0b6916
Peter
1
Pour ajouter ..., le deuxième paramètre doit être défini sur truetel que{{ text|truncate(50, true)
Sithu
En fait, définir le deuxième paramètre sur true lui permettrait de conserver des mots entiers. Il ajoute les ellipses par défaut. Le troisième paramètre peut changer les ellipses en tout ce que vous voulez. twig-extensions.readthedocs.io/en/latest/…
bêta
1
En utilisant Symfony 2.8, j'ai dû installer cette extension pour l'utiliser. require twig/extensions
bêta
35

Un autre est:

{{ myentity.text[:50] ~ '...' }}
Manuel Bitto
la source
7
le seul problème est qu'il montre toujours les points ...: Je pense que j'irai avec la première solution.
Markus Kottländer
1
S'il vous plaît, pouvez-vous partager le lien où se trouve la documentation sur ce [x: x]?
BENARD Patrick
Toujours avec les trois points là ... ne répond pas vraiment à la question.
dmmd
17

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.


la source
10

Solution @olegkhuss avec UTF-8 Elipsis nommé: {{ (my.text|length > 50 ? my.text|slice(0, 50) ~ '…' : my.text) }}

Matthias Schobner
la source
2
Gardez à l'esprit que cette solution permet l'injection HTML via la textvariable.
emix
1
@ michael-zukowski Vous avez raison. J'ai changé ma solution.
Matthias Schobner
8

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é).

Graftak
la source
6

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 %}
Julius B.
la source
et aucun besoin supplémentaire !!! juste ce dont j'avais besoin, divisé par des espaces et des tranches par des mots, merci !!!
Vladimir Ch
Fonctionne comme un charme
VDarricau
2

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] }}**
Zaheer Babar
la source
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 ??

aller à
la source
1

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
Danil Pyatnitsev
la source
0

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) }}
Jambon L.
la source
0

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

Jeff Brewster
la source
-1

Il est préférable d'utiliser un caractère HTML

{{ entity.text[:50] }}&#8230;
Théo Attali
la source
Pouvez-vous ajouter quelques explications à votre réponse? Pourquoi utiliser une entité HTML? Et pourquoi l'ajoutez-vous au texte dans tous les cas, même si le texte comporte moins de 50 caractères?
Nico Haase
Salut, si vous écrivez trois points, ce sont trois points séparés, mais le caractère "trois points" est appelé une ellipse. L'entité html des points de suspension est &#8230;.
Théo Attali
Et pourquoi ne pas utiliser le caractère Unicode pour ces points de suspension?
Nico Haase
Vous pouvez aussi l'utiliser! ce commentaire était une réponse à ce commentaire stackoverflow.com/a/17118915/5923187 mais ce mouvement a été verrouillé à cause de ma réputation
Théo Attali