Risposte:
{{ myentity.text|length > 50 ? myentity.text|slice(0, 50) ~ '...' : myentity.text }}
Hai bisogno di Twig 1.6
{{ 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 ( ...
)
{{ myentity.text[:50] ~ (myentity.text|length > 50 ? '...') }}
|length
dopo il primo text
ma è perfetto, grazie!
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) }}
...
, il secondo parametro dovrebbe essere impostato true
come{{ text|truncate(50, true)
require twig/extensions
Un altro è:
{{ myentity.text[:50] ~ '...' }}
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.
Soluzione @olegkhuss con l'ellissi UTF-8:
{{ (my.text|length > 50 ? my.text|slice(0, 50) ~ '…' : my.text) }}
text
variabile.
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).
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 %}
Puoi limitare nel modo seguente. Il primo è l'indice di partenza e il secondo è il numero di caratteri.
**{{ results['text'][4: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 ??
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
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) }}
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).
È meglio usare un carattere HTML
{{ entity.text[:50] }}…
…
.
...
e questa è un'ellissi…