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

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


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

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] ~ '...' }}

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.


10

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


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


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

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] }}**

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


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

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

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


-1

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

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

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
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.