la ramita de Symfony 2 limita la longitud del texto y pone tres puntos

128

¿Cómo puedo limitar la longitud del texto, por ejemplo, 50, y poner tres puntos en la pantalla?

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

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

{%endif%}
GRafoKI
fuente
44
Los "tres puntos" son en realidad un solo personaje llamado puntos suspensivos. Estas son tres paradas completas ...y esta es una elipsis
Luke Cousins

Respuestas:

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

Necesitas Twig 1.6

olegkhuss
fuente
esta debería ser la respuesta, todavía funciona hasta ahora;)
whalesingswee
¿Cómo podemos agregar un enlace a ...?
mburakergenc
11
Además, si se desea recortar en una palabra, puede hacerlo de esta manera: {{ 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 ( ...)
Nemo64
2
Más corto:{{ myentity.text[:50] ~ (myentity.text|length > 50 ? '...') }}
mts knn
1
@ Nemo64 solo te estás perdiendo el |lengthprimero textpero es perfecto, ¡gracias!
mtefi
116

¿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) }}
mrMantir
fuente
55
Estoy usando Symfony 2.3 y el filtro truncado no forma parte de las extensiones predeterminadas. Por lo tanto, recurrí a la solución de Manuel en su lugar.
Maurits
8
Para habilitar la extensión en Symfony, agregue esto a uno de sus archivos de configuración: gist.github.com/pschultz/f33bfff72692ca0b6916
Peter
1
Para agregar ..., el segundo parámetro debe establecerse truecomo{{ text|truncate(50, true)
Sithu
En realidad, establecer el segundo parámetro en verdadero hará que conserve palabras completas. Agrega las elipses por defecto. El tercer parámetro puede cambiar las elipses a lo que quieras. twig-extensions.readthedocs.io/en/latest/…
beta
1
Usando Symfony 2.8, tuve que instalar esta extensión para usarla. require twig/extensions
beta
35

Otro es:

{{ myentity.text[:50] ~ '...' }}
Manuel Bitto
fuente
77
el único problema es que siempre muestra los puntos ...: / creo que iré con la primera solución.
Markus Kottländer
1
Por favor, ¿puede compartir el enlace donde se encuentra el documento sobre este [x: x]?
BENARD Patrick
Siempre con los tres puntos allí ... realmente no responde la pregunta.
dmmd
17

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.


fuente
10

Solución @olegkhuss con elipsis UTF-8 con nombre: {{ (my.text|length > 50 ? my.text|slice(0, 50) ~ '…' : my.text) }}

Matthias Schobner
fuente
2
Tenga en cuenta que esta solución permite la inyección de HTML a través de la textvariable.
emix
1
@ michael-zukowski Tienes razón. He cambiado mi solución.
Matthias Schobner
8

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

Graftak
fuente
6

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 %}
Julius B.
fuente
y sin necesidad de complementos !!! justo lo que necesitaba, dividido por espacios y rebanadas por palabras, ¡gracias!
Vladimir Ch
Funciona como un encanto
VDarricau
2

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] }}**
Zaheer Babar
fuente
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 ??

ir
fuente
1

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
Danil Pyatnitsev
fuente
0

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) }}
Jamón L.
fuente
0

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

Jeff Brewster
fuente
-1

Es mejor usar un caracter HTML

{{ entity.text[:50] }}&#8230;
Théo Attali
fuente
¿Puedes agregar alguna explicación a tu respuesta? ¿Por qué debería uno usar una entidad HTML? ¿Y por qué lo agrega al texto en todos y cada uno de los casos, incluso si el texto tiene menos de 50 caracteres?
Nico Haase
Hola, si escribes tres puntos, son tres puntos separados, pero el carácter de "tres puntos" se llama puntos suspensivos. La entidad html de puntos suspensivos es &#8230;.
Théo Attali
¿Y por qué no usar el carácter unicode para esa elipsis?
Nico Haase
Tú puedes usarlo también ! este comentario fue una respuesta a ese comentario stackoverflow.com/a/17118915/5923187 pero ese movimiento fue bloqueado debido a mi reputación
Théo Attali