Respuestas:
{{ myentity.text|length > 50 ? myentity.text|slice(0, 50) ~ '...' : myentity.text }}
Necesitas Twig 1.6
{{ text > 50 ? text|slice(0, 51)|split(' ')|slice(0, -1)|join(' ') ~ '…' : text }}
. También recomiendo usar el carácter de puntos suspensivos ( …
) en lugar de 3 puntos reales ( ...
)
{{ myentity.text[:50] ~ (myentity.text|length > 50 ? '...') }}
|length
primero text
pero es perfecto, ¡gracias!
¿Por qué no utilizar el filtro de truncamiento o ajuste de palabras de Twig? Pertenece a las extensiones de ramita y lib es parte de Symfony2.0 como veo.
{{ text|truncate(50) }}
...
, el segundo parámetro debe establecerse true
como{{ text|truncate(50, true)
require twig/extensions
Otro es:
{{ myentity.text[:50] ~ '...' }}
Sé que esta es una pregunta muy antigua, pero desde twig 1.6 puedes usar el filtro de división;
{{ myentity.text|slice(0, 50) ~ '...' }}
La segunda parte de la tilde es opcional si desea agregar algo, por ejemplo, los puntos suspensivos.
Editar: Mi error, veo que la respuesta más votada hace uso del filtro de división.
Solución @olegkhuss con elipsis UTF-8 con nombre:
{{ (my.text|length > 50 ? my.text|slice(0, 50) ~ '…' : my.text) }}
text
variable.
Solución @mshobnr / @olegkhuss hecha en una macro simple:
{% macro trunc(txt, len) -%}
{{ txt|length > len ? txt|slice(0, len) ~ '…' : txt }}
{%- endmacro %}
Ejemplo de uso:
{{ tools.trunc('This is the text to truncate. ', 50) }}
Nota: importo una plantilla Twig que contiene macros y la importo como 'herramientas' como esta (Symfony):
{% import "@AppBundle/tools.html.twig" as tools -%}
Además, reemplacé el código de caracteres html con el carácter real, esto no debería ser un problema al usar UTF-8 como codificación del archivo. De esta manera no tiene que usar |raw
(ya que podría causar un problema de seguridad).
Una solución aún más elegante es limitar el texto por la cantidad de palabras (y no por la cantidad de caracteres). Esto evita los rasgaduras feas (por ejemplo, 'Stackov ...').
Aquí hay un ejemplo donde acorto solo bloques de texto de más de 10 palabras:
{% set text = myentity.text |split(' ') %}
{% if text|length > 10 %}
{% for t in text|slice(0, 10) %}
{{ t }}
{% endfor %}
...
{% else %}
{{ text|join(' ') }}
{% endif %}
Puede limitar de la siguiente manera. El primero es el índice de inicio y el segundo es el número de caracteres.
**{{ results['text'][4:2] }}**
Use el filtro truncado para cortar una cadena después de alcanzar el límite
{{ "Hello World!"|truncate(5) }} // default separator is ...
Hola...
También puede decirle a truncate que conserve palabras enteras estableciendo el segundo parámetro en verdadero. Si la última palabra está en el separador, truncar imprimirá toda la palabra.
{{ "Hello World!"|truncate(7, true) }} // preserve words
Aquí Hola Mundo!
Si desea cambiar el separador, simplemente configure el tercer parámetro en su separador deseado.
{{ "Hello World!"|truncate(7, false, "??") }}
Hola w ??
Actualización para Twig 2 y Twig 3.
el filtro truncado no está disponible, en su lugar, puede usar u-filter
Aquí hay un ejemplo:
{{ 'Lorem ipsum'|u.truncate(8) }}
Lorem ip
{{ 'Lorem ipsum'|u.truncate(8, '...') }}
Lorem...
Nota: este filtro es parte de StringExtension que puede ser requerido por
twig/string-extra
Escribí este marco simple con el mismo propósito, espero que ayude:
{%- macro stringMaxLength(str, maxLength) -%}
{%- if str | length < maxLength -%}
{{ str }}
{%- else -%}
{{ str|slice(0, maxLength) }}...
{%- endif -%}
{%- endmacro -%}
Ejemplo de uso # 1 (Salida: "mi cadena larga aquí ..."):
{{ _self.stringMaxLength("my long string here bla bla bla la", 20) }}
Ejemplo de uso # 2 (Salida: "cadena más corta"):
{{ _self.stringMaxLength("shorter string!", 20) }}
Bugginess * en las nuevas capacidades de Drupal 8 aquí nos inspiró a escribir el nuestro:
<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>
Esto tiene en cuenta tanto las palabras como los caracteres (* la configuración del "límite de palabras" en D8 no mostraba nada).
Es mejor usar un caracter HTML
{{ entity.text[:50] }}…
…
.
...
y esta es una elipsis…