Utilizzo di un valore di campo come attributo Twig


8

Devo impostare un valore di campo come classe CSS in un modello di pagina. Come posso farlo nel modo Ramoscello?

{{attributes.addClass('class-name')}} è il modo di impostare manualmente la classe.

Ho un campo elenco per consentire all'utente di impostare un colore di sfondo per una parte del sito. In Drupal 7 ho usato questo codice.

<div class="<?php print render($content['field_background']); ?>">

In Drupal 8, posso stampare il campo con {{ content.field_background }}, ma <div class="{{ content.field_background }}">non funziona.


Esistono diversi modi per eseguire questa operazione nel file modello con Twig utilizzando il nuovo codice di classi di set, ovvero, {% set classes = [ ... quindi, stampare le classi così come <article{{ attributes.addClass(classes) }}>è possibile fare qualcosa di simile <div{{ content_attributes.addClass('foobar' | clean_class) }}>. Come dice la nota sopra, penso che abbiamo bisogno di maggiori informazioni. Se si desidera un valore di campo come classe, sarebbe utile utilizzare anche il debug di Kint e Twig e potrebbe essere necessario impostare un var con una funzione di preelaborazione, ma forse non necessario.
Danny Englander,

Ho modificato la mia domanda.
Deelite il

Quale modello è questo, pagina, nodo, campo?
4k4

Pagina. Il contenuto del campo che ho già ottenuto con preprocess_page. Penso di aver bisogno solo di un po 'di conoscenza del ramoscello ...
Deelite il

Cosa c'è nella pagina preprocess?
4k4

Risposte:


6

Questo può essere fatto in diversi modi, puoi fare tutto nel modello di nodo con Twig oppure puoi creare una funzione di pre-elaborazione e creare una variabile da usare nel modello di nodo. La chiave per apprendere ciò che è nell'array è usare Devel Kint. Senza quello, non saprai cosa c'è nell'array.

Per prima cosa installa Kint che viene fornito con il modulo Devel per Drupal 8. Successivamente, scegli il tuo modello di nodo (ma questo può essere fatto in qualsiasi tipo di modello) ed esamina la variabile di contenuto in questo modo (idealmente nella parte inferiore del modello).

{{ kint (content) }}

inserisci qui la descrizione dell'immagine

Da questo, otteniamo le informazioni di debug stampate sulla pagina e se espandi l'array, vedrai un'intera serie di informazioni. Vedo subito il mio valore di sfondo e posso costruire un percorso per stamparlo come

{{ content.field_background[0]['#markup'] }}

Ora puoi stamparlo come sfondo o classe in un div

<div style="background-color: {{ '#' }}{{ content.field_background[0]['#markup'] }};" class="color-{{ content.field_background[0]['#markup'] }}">
<h2>Hello</h2>
</div>

Ho provato questo e funziona alla grande, il div ha reso il colore di sfondo che avevo selezionato nella mia lista di campi sulla modifica del nodo.

Ora questo non è l'ideale quindi probabilmente vogliamo creare una variabile per questo in un preprocess_node nel file .theme del nostro tema.

function MYTHEME_preprocess_node(&$vars) {
  $vars['bgcolor'] = '#' . $vars['content']['field_background'][0]['#markup'];
}

Ora che ho creato un var, è molto più pulito stamparlo:

 <div style="background-color: {{ bgcolor }};" >
      <h2>Hello</h2>
    </div>

Una nota sopra, probabilmente dovresti racchiuderla con un'istruzione if per verificare se è vuota o meno.

Questo funzionerebbe o strutturerebbe l'istruzione if dove ti piace

   {% if bgcolor %}
    <div style="background-color: {{ bgcolor }};" >
      <h2>Hello</h2>
    </div>
    {% endif %}

3

In un modello di nodo sono presenti i campi {{ content }}. In un modello di pagina non è presente alcuna variabile di contenuto, ma esiste una variabile di pagina che contiene aree {{ page.region }}.

Poiché hai chiesto informazioni sul modello di pagina, non possiamo utilizzarlo content.

Ma puoi usare {{node}} in entrambi i modelli. L'oggetto nodo si trova sempre in un modello di nodo e nel modello di pagina, quando la pagina visualizza un nodo.

Quindi questo dovrebbe funzionare in entrambi i modelli:

<div class="{{ node.field_background.value|clean_class }}">

Per quanto ne so con i test che ho eseguito con Devel Kint, il "valore" non funziona.
Danny Englander,

Questo è difficile da scoprire con kint (), vedrai solo a fielditemlist. valueottiene con un po 'di magia il ramoscello e l'oggetto campo il valore del primo oggetto. In un campo multivalore puoi accedere a qualsiasi elemento inserendo un numero che inizia da zero:node.field_myfield.0.value
4k4
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.