J'ai créé une vue pour un nœud qui montre le contenu comme entité rendue. Entre autres, je produis le champ corporel dans le modèle de brindille:
{{ content.field_body }}
Maintenant, je voudrais limiter le texte à 200 caractères et mettre trois points. J'ai testé trois façons différentes de le faire, mais rien n'a fonctionné. Le problème est que chaque manière compte et coupe également les caractères HTML.
1: J'ai ajouté le format "Trimmed" dans "Manage display" => Le texte est limité mais pas correct. Et je n'ai pas les trois points.
2: J'ai coupé le texte dans le modèle de brindille. Mais pour compter le texte, je dois d'abord le rendre. Ainsi, twig affiche le texte au format HTML (je vois des balises HTML sur ma page!)
{% set text = content.field_body|render %}
{{ text|length > 200 ? text|slice(0, 200) ~ '...' : text }}
3: J'ai essayé de résoudre le problème dans template_preprocess_node (). Ici, j'ai le même problème avec le comptage du balisage HTML aussi.
$body_text = $node->get('field_body')->getValue()[0]['value'];
$trimmed_text = substr($body_text, 0, 200) . '...';
Comment puis-je couper mon texte correctement?
Merci beaucoup pour votre aide!
Vous pouvez maintenant le faire avec le module twig_extender et l'utiliser
|truncate
.Voici un exemple de la façon de l'utiliser dans le modèle .twig, notez que j'utilise également twig_field_value :
Remarque: je conserve généralement mes paramètres de développement (./admin/config/development/devel) définis pour utiliser le var-dumper Symfony et je peux comprendre la chaîne avec
c'est à dire:
{{ devel_dump(content.field_name|field_value) }}
la source
Améliorations:
|trim
pour se débarrasser des espaces blancsslice()
etsplit()
…
) plutôt que "..."|raw
le résultat{% set text = content.field_header_intro|render|striptags|trim %}
{{ (text|length > 200 ? text|slice(0, 201)|split(' ')|slice(0, -1)|join(' ') ~ '…' : text)|raw }}</code>
la source
C'est ainsi que j'ai géré cela.
Exemple:
champ - nœud - corps - article.html.twig
la source