Il ramoscello di symfony 2 limita la lunghezza del testo e mette tre punti


128

Come posso limitare la lunghezza del testo, ad esempio 50, e inserire tre punti sul display?

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

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

{%endif%}

4
I "tre punti" sono in realtà un singolo personaggio chiamato Ellissi. Si tratta di tre fermate complete ...e questa è un'ellissi
Luke Cousins

Risposte:


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

Hai bisogno di Twig 1.6


questa dovrebbe essere la risposta, funzionando ancora fino ad ora;)
whalesingswee

Come possiamo aggiungere un link a ...?
mburakergenc,

11
Inoltre, se si desidera ritagliare su una parola, si può fare in questo modo: {{ text > 50 ? text|slice(0, 51)|split(' ')|slice(0, -1)|join(' ') ~ '…' : text }}. Consiglio anche di usare il carattere con i puntini di sospensione ( ) anziché 3 punti reali ( ...)
Nemo64

2
Più breve:{{ myentity.text[:50] ~ (myentity.text|length > 50 ? '...') }}
mts kn

1
@ Nemo64 ti manca il |lengthdopo il primo textma è perfetto, grazie!
mtefi,

116

perché non usare il filtro troncato o wordwrap di ramoscello? Appartiene alle estensioni del ramoscello e la lib fa parte di Symfony2.0 come vedo.

{{ text|truncate(50) }}

5
Sto usando Symfony 2.3 e il filtro troncato non fa parte delle estensioni predefinite. Pertanto, ho fatto ricorso alla soluzione di Manuel invece.
Maurits

8
Per abilitare l'estensione in Symfony aggiungilo a uno dei tuoi file di configurazione: gist.github.com/pschultz/f33bfff72692ca0b6916
Peter

1
Per aggiungere ..., il secondo parametro dovrebbe essere impostato truecome{{ text|truncate(50, true)
Sithu,

Impostando il secondo parametro su true, si preserverebbero parole intere. Aggiunge le ellissi per impostazione predefinita. Il terzo parametro può cambiare le ellissi in qualsiasi cosa tu voglia. twig-extensions.readthedocs.io/en/latest/…
beta

1
Usando Symfony 2.8, ho dovuto installare questa estensione per usarla. require twig/extensions
beta

35

Un altro è:

{{ myentity.text[:50] ~ '...' }}

7
l'unico problema è che mostra sempre i punti ...: / penso che andrò con la prima soluzione.
Markus Kottländer,

1
Per favore, puoi condividere il link in cui si trova il documento su questo [x: x]?
BENARD Patrick,

Sempre con i tre punti lì ... non risponde davvero alla domanda.
dmmd

17

So che questa è una domanda molto vecchia, ma dal ramoscello 1.6 puoi usare il filtro slice;

{{ myentity.text|slice(0, 50) ~ '...' }}

La seconda parte della tilde è facoltativa se si desidera aggiungere qualcosa, ad esempio i puntini di sospensione.

Modifica: Mio male, vedo la risposta più votata fare uso del filtro fetta.


10

Soluzione @olegkhuss con l'ellissi UTF-8: {{ (my.text|length > 50 ? my.text|slice(0, 50) ~ '…' : my.text) }}


2
Tieni presente che questa soluzione consente l'iniezione HTML attraverso la textvariabile.
emix

1
@ michael-zukowski Hai ragione. Ho cambiato la mia soluzione.
Matthias Schobner,

8

La soluzione @mshobnr / @olegkhuss trasformata in una semplice macro:

{% macro trunc(txt, len) -%}
    {{ txt|length > len ? txt|slice(0, len) ~ '…' : txt }}
{%- endmacro %}

Esempio di utilizzo:

{{ tools.trunc('This is the text to truncate. ', 50) }}

Nb Importerò un modello Twig contenente macro e lo importerò come 'strumenti' come questo (Symfony):

{% import "@AppBundle/tools.html.twig" as tools -%}

Inoltre, ho sostituito il codice html con il carattere reale, questo non dovrebbe essere un problema quando si utilizza UTF-8 come codifica del file. In questo modo non è necessario utilizzare |raw(poiché potrebbe causare un problema di sicurezza).


6

Una soluzione ancora più elegante è limitare il testo in base al numero di parole (e non al numero di caratteri). Questo impedisce brutti strappi (ad es. "Stackov ...").

Ecco un esempio in cui accorco solo blocchi di testo più lunghi di 10 parole:

{% set text = myentity.text |split(' ') %} 

{% if text|length > 10 %} 
    {% for t in text|slice(0, 10) %}
        {{ t }} 
    {% endfor %}
    ...
{% else %}
    {{ text|join(' ') }}
{% endif %}

e nessun bisogno aggiuntivo !!! proprio quello di cui avevo bisogno, diviso per spazi e sezioni per parole, grazie !!!
Vladimir Ch,

Funziona come un fascino
VDarricau,

2

Puoi limitare nel modo seguente. Il primo è l'indice di partenza e il secondo è il numero di caratteri.

**{{ results['text'][4:2] }}**

2

Utilizzare il filtro troncato per tagliare una stringa dopo aver raggiunto il limite

{{ "Hello World!"|truncate(5) }} // default separator is ...

Ciao...

Puoi anche dire a troncato di conservare parole intere impostando il secondo parametro su vero. Se l'ultima parola si trova sul separatore, troncato stamperà l'intera parola.

 {{ "Hello World!"|truncate(7, true) }} // preserve words

Qui ciao mondo!

Se si desidera modificare il separatore, è sufficiente impostare il terzo parametro sul separatore desiderato.

{{ "Hello World!"|truncate(7, false, "??") }} 

Ciao w ??


1

Aggiornamento per Twig 2 e Twig 3.

il filtro tronca non è disponibile, al suo posto puoi usare il filtro u

ecco un esempio:

{{ 'Lorem ipsum'|u.truncate(8) }}
Lorem ip

{{ 'Lorem ipsum'|u.truncate(8, '...') }}
Lorem...

Nota: questo filtro fa parte di StringExtension che può essere richiesto da

twig/string-extra

0

Ho scritto questo semplice Marco per lo stesso scopo, spero che aiuti:

{%- macro stringMaxLength(str, maxLength) -%}
    {%- if str | length < maxLength -%}
        {{ str }}
    {%- else -%}
        {{ str|slice(0, maxLength) }}...
    {%- endif -%}
{%- endmacro -%}

Esempio di utilizzo n. 1 (Output: "my long string here ..."):

{{ _self.stringMaxLength("my long string here bla bla bla la", 20) }}

Esempio di utilizzo n. 2 (output: "stringa più corta!"):

{{ _self.stringMaxLength("shorter string!", 20) }}

0

Bugginess * nelle nuove funzionalità di Drupal 8 qui ci ha ispirato a scrivere il nostro:

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

Ciò tiene conto sia delle parole che dei caratteri (* l'impostazione "limite di parole" in D8 non mostrava nulla).


-1

È meglio usare un carattere HTML

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

Puoi aggiungere qualche spiegazione alla tua risposta? Perché si dovrebbe usare un'entità HTML? E perché lo aggiungi al testo in ogni singolo caso, anche se il testo è lungo meno di 50 caratteri?
Nico Haase,

Salve, se scrivi tre punti sono tre punti separati ma il carattere "tre punti" si chiama puntini di sospensione. L'entità html dei puntini di sospensione è &#8230;.
Théo Attali,

E perché non usare il carattere unicode per quei puntini di sospensione?
Nico Haase,

Puoi usarlo anche tu! questo commento è stato una risposta a quel commento stackoverflow.com/a/17118915/5923187 ma quella mossa è stata bloccata a causa della mia reputazione
Théo Attali
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.