web-dev-qa-db-fra.com

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

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%}
112
GRafoKI
{{ myentity.text|length > 50 ? myentity.text|slice(0, 50) ~ '...' : myentity.text  }}

Vous avez besoin de Twig 1.6

185
olegkhuss

pourquoi ne pas utiliser le filtre tronqué ou wordwrap de twig? Il appartient à twig extensions et lib fait partie de Symfony2.0 comme je le vois.

{{ text|truncate(50) }}
102
mrMantir

Un autre est:

{{ myentity.text[:50] ~ '...' }}
35
Manuel Bitto

Je sais que la question est 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 Ellipsis.

Edit: Mon mauvais, je vois la réponse la plus votée utilise le filtre slice.

16
user3599441

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

9
Matthias Schobner

Une solution encore plus élégante consiste à limiter le texte au nombre de mots (et non au nombre de caractères). Cela évite 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 %}
6
Julius B.

@mshobnr/@olegkhuss solution transformée en une macro simple:

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

N.b. J'importe un modèle Twig contenant des macros) et l'importe comme "outils" comme ceci (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 lorsque vous utilisez 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é).

5
Graftak

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
Zaheer Babar

Bugginess * dans les nouvelles Drupal 8 capacités ici nous ont inspiré pour écrire notre propre:

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

Ceci prend en compte les mots et les caractères (* le paramètre "Limite de mots" dans D8 n'affichait rien).

1
Jeff Brewster

J'ai écrit ce simple Marco dans le même but, en espérant 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
Ham L.

Il vaut mieux utiliser un caractère HTML

{{ entity.text[:50] }}&#8230;
0
Théo Attali