O symfony 2 galho limita o comprimento do texto e coloca três pontos


128

Como posso limitar o comprimento do texto, por exemplo, 50, e colocar três pontos no visor?

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

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

{%endif%}

4
Os "três pontos" são na verdade um único personagem chamado reticências. Isso é três pontos finais ...e esta é uma elipse
Luke Cousins

Respostas:


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

Você precisa do Twig 1.6


esta deve ser a resposta, ainda trabalhando até agora;)
whalesingswee

Como podemos adicionar um link para ...?
mburakergenc

11
Além disso, se você deseja cortar em uma palavra, você pode fazê-lo como este: {{ text > 50 ? text|slice(0, 51)|split(' ')|slice(0, -1)|join(' ') ~ '…' : text }}. Eu também recomendo usar o personagem de reticências ( ) em vez de 3 pontos reais ( ...)
Nemo64

2
Mais curto:{{ myentity.text[:50] ~ (myentity.text|length > 50 ? '...') }}
mts knn

1
@ Nemo64, você está perdendo o |lengthdepois do primeiro, textmas isso é perfeito, obrigado!
Mtefi 24/10/19

116

por que não usar o filtro truncado ou wordwrap do galho? Pertence a extensões de galhos e lib faz parte do Symfony2.0, como eu vejo.

{{ text|truncate(50) }}

5
Estou usando o Symfony 2.3 e o filtro truncado não faz parte das extensões padrão. Portanto, recorri à solução de Manuel.
Maurits

8
Para ativar a extensão no Symfony, adicione-o a um dos seus arquivos de configuração: gist.github.com/pschultz/f33bfff72692ca0b6916
Peter

1
Para acrescentar ..., o segundo parâmetro deve ser definido truecomo{{ text|truncate(50, true)
Sithu

Definir o segundo parâmetro como true faria preservar palavras inteiras. Ele adiciona as elipses por padrão. O terceiro parâmetro pode alterar as elipses para o que você quiser. twig-extensions.readthedocs.io/en/latest/…
beta

1
Usando o Symfony 2.8, tive que instalar esta extensão para usá-la. require twig/extensions
beta

35

Outro é:

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

7
o único problema é que ele sempre mostra os pontos ...: / Acho que vou com a primeira solução.
Markus Kottländer 13/08/14

1
Por favor, você pode compartilhar o link em que o documento sobre este [x: x] está localizado?
BENARD Patrick

Sempre com os três pontos lá ... realmente não responde à pergunta.
Dmmd 08/08/19

17

Eu sei que essa é uma pergunta muito antiga, mas do twig 1.6 você pode usar o filtro de fatia;

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

A segunda parte do til é opcional, se você quiser adicionar algo, por exemplo, reticências.

Edit: Meu mal, eu vejo a resposta mais votada fazer uso do filtro de fatia.


10

solução @olegkhuss com reticências UTF-8 nomeadas: {{ (my.text|length > 50 ? my.text|slice(0, 50) ~ '…' : my.text) }}


2
Lembre-se de que esta solução permite a injeção de HTML através da textvariável
Emix

1
@ Michael-zukowski Você está certo. Eu mudei minha solução.
Matthias Schobner 20/0318

8

Solução @mshobnr / @olegkhuss transformada em uma macro simples:

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

Exemplo de uso:

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

Nota: Eu importo um modelo Twig contendo macros e importo-o como 'ferramentas' como esta (Symfony):

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

Além disso, substituí o código de caractere html pelo caractere real. Isso não deve ser problema ao usar UTF-8 como codificação de arquivo. Dessa forma, você não precisa usá- |rawlo (pois isso pode causar um problema de segurança).


6

Uma solução ainda mais elegante é limitar o texto pelo número de palavras (e não pelo número de caracteres). Isso evita rasgos feios (por exemplo, 'Stackov ...').

Aqui está um exemplo em que encurto apenas blocos de texto com mais de 10 palavras:

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

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

e sem necessidade de complementos !!! exatamente o que eu precisava, dividido por espaços e fatias por palavras, thx !!!
Vladimir Ch

Funciona como um encanto
VDarricau

2

Você pode limitar da seguinte maneira. O primeiro é o índice inicial e o segundo é o número de caracteres.

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

2

Use o filtro truncado para cortar uma corda depois que o limite for atingido

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

Olá...

Você também pode dizer ao truncado para preservar palavras inteiras, definindo o segundo parâmetro como true. Se a última palavra estiver no separador, truncar imprimirá a palavra inteira.

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

Aqui Olá Mundo!

Se você deseja alterar o separador, basta definir o terceiro parâmetro para o separador desejado.

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

Olá W ??


1

Atualização para o Twig 2 e Twig 3.

filtro truncado não está disponível; em vez disso, você pode usar o filtro u

aqui está um exemplo:

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

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

Nota: esse filtro faz parte do StringExtension que pode ser solicitado por

twig/string-extra

0

Eu escrevi este marco simples para o mesmo propósito, espero que ajude:

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

Exemplo de uso # 1 (Saída: "minha longa string aqui ..."):

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

Exemplo de uso # 2 (Saída: "string mais curta!"):

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

0

O Bugginess * nos novos recursos do Drupal 8 aqui nos inspirou a escrever nossos próprios:

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

Isso leva em consideração palavras e caracteres (* a configuração "limite de palavras" em D8 não exibia nada).


-1

É melhor usar um caractere HTML

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

Você pode adicionar alguma explicação à sua resposta? Por que alguém deveria usar uma entidade HTML? E por que você o anexa ao texto em todos os casos, mesmo que o texto tenha menos de 50 caracteres?
Nico Haase

Olá, se você escrever três pontos, são três pontos separados, mas o caractere "três pontos" é chamado de reticências. A entidade reticências html é &#8230;.
Théo Attali

E por que não usar o caractere unicode para essas reticências?
Nico Haase

Você pode usá-lo também! este comentário foi uma resposta a esse comentário stackoverflow.com/a/17118915/5923187 mas esse movimento foi fechada devido à minha reputação
Théo Attali
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.