Come trovare l'URL di stile dell'immagine all'interno del modello di ramoscello?


10

Sto implementando un modello di nodo che utilizza un'immagine due volte; una volta in un modo "normale" (cioè usando lo stile di immagine definito nella configurazione di visualizzazione del campo per quella modalità di visualizzazione), e l'altro è come una proprietà di immagine di sfondo CSS.

Ho bisogno di una di queste due cose:

  1. (idealmente) un modo per ottenere l'URL per un diverso stile di immagine della stessa immagine.

  2. un modo per ottenere l'URL per il campo immagine.

Sto lottando per usare dump()e kint()per aiutare me stesso a una risposta. Entrambi producono troppo (grazie ai collegamenti integrati a "parent" ecc.) E sembrano non avere le informazioni di cui ho bisogno. ad es. guardando l' dump(content.field_image)output dell'URL reale dell'immagine non c'è (quindi da dove proviene in modo che possa essere riprodotto con {{ content.field_image }}?!). kint()d'altra parte muore completamente se gli passo un argomento e la versione di livello superiore è di nuovo troppo grande per navigare. Il debug è stato molto più semplice con phptemplate + xdebug. (Sì, lo so che è bene che i temi non possano eliminare il database.)

C'è una risposta a (1) che implica che non puoi farlo , ma non capisco perché non riesco a ottenere l'URL esistente in (2)?

Risposte:


11

È possibile ottenere l'URL di stile dell'immagine in una funzione di preelaborazione e passarlo al modello di nodo. (nel mio caso, avevo bisogno a livello di pagina, suppongo che funzionerebbe ancora per il nodo)

Qualcosa del genere, con "myimagefield" come nome della macchina per il campo immagine e "myimagestyle" come nome della macchina per il tuo stile, assicurati anche di includere Entity \ ImageStyle.

use Drupal\image\Entity\ImageStyle;

/**
 * Implements hook_preprocess_page().
*/
function mytheme_preprocess_page(&$variables, $hook) {
  if ($variables['node']) {
    $node = $variables['node'];
    if($node->myimagefield[0]){
        $cover_image = $node->myimagefield[0]->entity->getFileUri();
        $image_url = ImageStyle::load('myimagestyle')->buildUrl($cover_image);
        $variables['my_image'] = $image_url;
    }
  }
}

1
la domanda dice di estrarre la modalità di visualizzazione dalla configurazione di visualizzazione del campo. Eseguendo $ image_url = ImageStyle :: load ('myimagestyle') -> buildUrl ($ cover_image); come stai tirando lo stile dell'immagine dalla configurazione del campo? Hai semplicemente aggiunto myimagestyle, ma cosa succede se lo stesso campo si trova su più entità (ad esempio nodi) dove richiede stili di immagine diversi?
usernameabc

14

Alla prima parte viene già fornita una risposta nella domanda collegata, dove è presente il codice su come eseguire questa operazione. Per rispondere alla seconda parte della domanda, è possibile accedere all'immagine originale nell'oggetto nodo:

{{ file_url(node.field_image.entity.uri.value) }}

Un'osservazione su content:

In un modello di nodo il campo immagine in contentnon è pronto per il rendering. Il campo contiene la configurazione come dovrebbe essere visualizzato e l'oggetto campo che contiene tutti i dati non elaborati. Più tardi questo sarà messo insieme nel campo, formattatore di immagini e modelli di immagine. Questo è il motivo per cui non trovi l'URL che stai cercando contenta questo punto.

Nel modello di nodo è possibile utilizzare i campi al livello superiore dell'array di contenuti, ad esempio visualizzare il campo immagine

{{ content.field_image }}

come configurato nella modalità di visualizzazione.

Modificare:

C'è un nuovo filtro nel modulo Twig Tweak . Ora puoi generare l'URL di stile dell'immagine in un ramoscello direttamente da un uri o url dell'immagine originale:

{{ node.field_image.entity.uri.value | image_style('thumbnail') }} 

Grazie. Quindi tutti gli hook di preelaborazione vengono chiamati quando le chiamate del ramoscello vengono visualizzate, ad esempio nel punto in cui si va {{ content.field_image }}e non prima? Inoltre, penso che l'URL che riceverò dal tuo suggerimento sia l'URL originale - la parte 2 del mio Q chiedeva l'url dello stile dell'immagine, come configura dalla modalità di visualizzazione. È possibile?
artfulrobot

Funziona solo con le normali immagini caricate e non con le immagini con riferimenti alle entità. Come può essere fatto funzionare con immagini referenziate di entità?
paulcap1,

@ paulcap1, non so esattamente cosa intendi, perché un campo immagine è un campo di riferimento (a un'entità file). Se vuoi dire che hai l'immagine all'interno di un'entità referenziata, allora hai bisogno di .entitydue volte, prima di arrivare all'entità e poi all'immagine.
4k4,

1
@ paulcap1, ad esempio{{ node.field_ref.entity.field_image.entity.uri.value }}
4k4

@ 4K4. Sto usando il tipo di contenuto Pagina predefinito. Ho un campo referenziato entità chiamato field_global_image. Questo utilizza il pacchetto di immagini. Il campo immagine Bundles si chiama "" immagine "Ho provato a modo tuo utilizzando {{node.field_global_image.entity.image.entity.uri.value}} Ho anche provato a cambiare i campi in questo modo {{node.image.entity.field_global_image .entity.uri.value}} Né ha funzionato. Nella mia risposta in un post separato, questo è quello che ha funzionato per me.
paulcap1

6

Installa il modulo Twig Tweak https://www.drupal.org/project/twig_tweak

E questo modulo Twig Field https://www.drupal.org/project/twig_field_value

Se si utilizzano immagini di campi di caricamento di immagini regolari, utilizzare questo nel modello di nodo:

<img src="{{ node.field_regular_image.entity.uri.value | image_style('thumbnail') }} " >

Se si utilizza l'immagine di riferimento dell'entità, utilizzare questo:

<img src="{{ file_url(content.field_global_image|field_target_entity.image.entity.uri.value | image_style('thumbnail'))}} " >

Si noti che nell'esempio sull'uso di entità referenziate imagedopo si field_target_entityriferisce al campo immagine sull'entità referenziata. Potrebbe essere necessario modificarlo.
Daniels,

1
Grazie! L'esempio di riferimento dell'entità può anche essere realizzato senza il modulo twig_field_value:file_url(node.field_image.entity.field_referenced_image.entity.uri.value | image_style('thumbnail'))
John
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.