Come tagliare il testo del corpo (field_body)?


10

Ho creato una vista per un nodo che mostra il contenuto come entità renderizzata. Tra l'altro, ho generato il campo del corpo nel modello di ramoscello:

{{ content.field_body }}

Ora, vorrei limitare il testo a 200 caratteri e mettere tre punti. Ho provato tre modi diversi per farlo, ma nulla ha funzionato. Il problema è che ogni modo conta e taglia anche i caratteri HTML.

1: Ho aggiunto il formato "Rifilato" in "Gestisci display" => Il testo è limitato ma non corretto. E non ho i tre punti.

2: ho ritagliato il testo nel modello del ramoscello. Ma per contare il testo devo prima renderlo. Quindi, ramoscello genera il testo come HTML (vedo i tag HTML sulla mia pagina!)

{% set text = content.field_body|render %}
{{ text|length > 200 ? text|slice(0, 200) ~ '...' : text }}

3: ho provato a risolvere il problema in template_preprocess_node (). Qui ho lo stesso problema anche con il conteggio del markup HTML.

$body_text = $node->get('field_body')->getValue()[0]['value'];
$trimmed_text = substr($body_text, 0, 200) . '...';

Come posso tagliare il mio testo giusto?

Grazie mille per il tuo aiuto!

Risposte:


18

Ci sono alcune soluzioni che puoi provare, ma prendi nota che troncare le stringhe con html è generalmente una cattiva idea a causa del potenziale tag non chiuso o non valido.

1. Utilizzare | raw per generare l'html come html, può produrre tag non validi:

{% set text = content.field_body|render %}
{{ text|length > 200 ? text|slice(0, 200)|raw ~ '...' : text|raw }}

2. Strip HTML prima, più pulito:

{% set text = content.field_body|render|striptags %}
{{ text|length > 200 ? text|slice(0, 200) ~ '...' : text }}

3. Registrare un'estensione ramoscello (non testata):

https://gist.github.com/leon/2857883

Un'altra utile estensione che puoi consultare è l'estensione di testo, che ti aiuta a evitare di tagliare le parole:

http://twig.sensiolabs.org/doc/extensions/text.html


2
tag della prima soluzione non validi e seconda soluzione rimuovono tutti i tag HTML.
Yusef,

1
@zhilevan sì, come descritto nella risposta.
squall3d

1
@ squall3d qual è la tua soluzione per tagliarla senza strip htmls?
Yusef,

1
@zhilevan di solito quando voglio visualizzare il testo troncato è per lo scopo di un teaser, dove raramente voglio HTML. Ma se hai bisogno di conservare l'html, puoi provare questa estensione: gist.github.com/leon/2857883
squall3d

1
Se uso l'immagine nel campo del corpo. No 2, non funziona per le immagini. C'è qualche altro codice, stamperà anche l'immagine
logeshvaran il

5

Ora puoi farlo con il modulo twig_extender e utilizzarlo |truncate.

Ecco un esempio di come usarlo nel modello .twig, nota che sto anche usando twig_field_value :

{{ content.field_name|field_value|first['#text']|truncate(15, true, '....') }}

nota: di solito mantengo le mie impostazioni di sviluppo (./admin/config/development/devel) impostate per usare Symfony var-dumper e posso capire la catena con

vale a dire: {{ devel_dump(content.field_name|field_value) }}


4

miglioramenti:

  1. se si striscia tag si dovrebbe |trima sbarazzarsi di spazio bianco
  2. tagliare il confine della parola - vedi sotto slice()esplit()
  3. Usa i puntini di sospensione ( …) anziché "..."
  4. |raw L'output

{% set text = content.field_header_intro|render|striptags|trim %}

{{ (text|length > 200 ? text|slice(0, 201)|split(' ')|slice(0, -1)|join(' ') ~ '&hellip;' : text)|raw }}</code>


3

Questo è come l'ho gestito.

Esempio:
field - node - body - article.html.twig

{% set mode = element['#view_mode'] %}
...
{% for item in items %}
  {% if mode == 'full' %}
    <div{{ attributes.addClass('texto') }}>{{ item.content }}</div>
  {% elseif mode == 'teaser' %}
    {# if there is something about trim_length in field formatter #}
    {% if item.content['#text_summary_trim_length'] %}
      {# first remove html tags then you slice with trim_length #}
      {% set texto = item.content['#text']|striptags|slice(0, item.content['#text_summary_trim_length']) %}
      <p {{ attributes }}>{{ texto }}...</p>
    {% else %}
      <p {{ attributes }}>{{ item.content }}</p>
    {% endif %}
  {% endif %}
{% endfor %}
...
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.