it-swarm.it

Ottenere l'URL dell'immagine da un field_image su un nodo

Quindi ho questo nodo:

object(Drupal\node\Entity\Node)[1862]
  protected 'values' => 
    array (size=17)
      'vid' => 
        array (size=1)
          'x-default' => string '7' (length=1)
      'langcode' => 
        array (size=1)
          'x-default' => 
            array (size=1)
              0 => 
                array (size=1)
                  'value' => string 'en' (length=2)
      ... (more fields)
      'field_image' => 
        array (size=1)
          'x-default' => 
            array (size=1)
              0 => 
                array (size=5)
                  'target_id' => string '1' (length=1)
                  'alt' => string '' (length=0)
                  'title' => string '' (length=0)
                  'width' => string '150' (length=3)
                  'height' => string '120' (length=3)

Ora field_image ha un array con x-default e alcuni dati immagine di base. Come faccio a mostrare l'immagine o creare un collegamento all'immagine all'interno del modello Twig?

44
Rias

Ecco una versione di aggiornamento di per questa risposta dopo 8.0.x. Questa base su @ joelpittet commento.

{{ file_url(node.field_image.entity.fileuri) }}
52
itsdarrylnorris

Non conosco Twig, ma ottieni l'URI del file con $node->field_image->entity->getFileUri() in PHP e devi chiamare file_create_url() su questo:

file_create_url($node->field_image->entity->getFileUri())

Non so se sia possibile in ramoscello. Se non è possibile, puoi sempre calcolarlo in preelaborazione e aggiungerlo come nuova variabile.

39
Berdir

Se qualcuno avesse bisogno di un'immagine in stile:

$styled_image_url = ImageStyle::load('large')->buildUrl($node->field_image->entity->getFileUri());
27
VladimirM

Nessuna delle precedenti twig hanno funzionato per me (forse quelle hanno funzionato per le versioni precedenti di 8.x ma non per la versione 8.5

{{ file_url(node.field_image['#items'].entity.uri.value) }}

NOTA: dovrebbe funzionare per Drupal 8.5 +

11
GiorgosK

Quindi ho scoperto la risposta con l'aiuto di Clive .

Ottenere l'URI dell'immagine in Twig viene fatto usando node.field_image.0.entity.uri.value

È possibile ottenere l'URL completo per l'immagine utilizzando file_create_url(node.field_image.0.entity.uri.value)

Fare questo in Twig non è ancora possibile ma ci stanno lavorando -> vedi qui

7
Rias

Ciò che ha finito per funzionare per me in D8 è:

$imageUrl = $node->get('field_image')->entity->uri->value;

Usare kint($node->get('field_image')->entity) e guardare l'array è stato molto utile

enter image description here

Quindi nel mio file twig ho usato:

<img class="top-article-image" src="{{ file_url(imageUrl) }}" />
6
crobicha

Questo è il modo se si desidera ottenere l'URL dell'immagine con lo stile immagine associato per qualsiasi campo immagine in un modello twig:

Innanzitutto installa il modulo Twig Tweak

Quindi impostare l'URI dell'immagine come variabile. Con l'URI, puoi utilizzare un modello di modifiche twig per ottenere il percorso con qualunque stile di immagine desideri. Vedi sotto:

{% set image_uri = content.field_feature_row_image['#items'].entity.uri.value %}

<img src="{{ image_uri|image_style('image1200x1103') }}"/>

Twig Tweak v2.4 + offre il filtro file_url Per estrarre l'URL del file da un'entità.

<img src="{{ node.field_image|file_url|image_style('image1200x1103') }}"/>
3
Robb Davis

puoi ottenere l'URL direttamente utilizzando field_image.entity.url

2
Adrian Kremer

Uso sempre una funzione di supporto

  /**
   * Get the Image URI.
   *
   * @param \Drupal\Core\Entity\Entity $entity
   * @param $fieldName
   * @param bool $imageStyle
   * @return mixed
   */
  public function getImageUri(\Drupal\Core\Entity\Entity $entity, $fieldName, $imageStyle = FALSE) {
    $imageField = $entity->get($fieldName)->getValue();
    if (!empty($imageField[0]['target_id'])) {
      $file = File::load($imageField[0]['target_id']);
      if ($imageStyle) {
        return ImageStyle::load($imageStyle)->buildUrl($file->getFileUri());
      }

      // Original URI.
      return file_create_url($file->getFileUri());
    }
  }
2
hugronaphor

Puoi usare il metodo url() che si trova sulla classe File come scorciatoia, quindi:

{{ file_url(node.field_image.entity.fileuri) }}

può essere abbreviato in:

{{ node.field_image.entity.url }}

Funziona con le funzioni di preelaborazione ma attiva un Twig_Sandbox_SecurityError Quando viene chiamato in un modello twig.

Se ricevi Twig_Sandbox_SecurityError Puoi dire a twig di consentire url nel tuo file settings.php come menzionato in questo Stackoverflow post

Consulta la documentazione su File :: Url () https://api.drupal.org/api/drupal/core%21modules%21file%21src%21Entity%21File.php/function/File%3A%3Aurl/8.6 .x

0
Kiee

Ho avuto lo stesso problema, quindi ho creato una funzione get_image_path() Twig e l'ho aggiunta con un sacco di altre cose utili al mio modulo Starter sulla piastra di caldaia:

https://github.com/brynj-digital/starter

La funzione accetta il campo immagine e il nome della macchina di uno stile di immagine, quindi restituisce quel percorso dell'immagine.

Funziona in molti contesti: puoi passare node.field_name, content.field_name o row._entity.field_name (nel caso di un modello di campi Visualizza).

0
user34185

in qualche modo correlato, ecco quello che ho usato (grazie a tutte le risposte precedenti per portarmi lì) per ottenere un URL del file di immagine dal campo immagine di un'entità multimediale in un ramoscello:

{% set media_img_url = file_url(content.field_media_image.0['#item'].entity.uri.value) %}

ora posso usare questa variabile nel mio modello twig

{{ media_img_url }}
0
bdanin

Accidenti, in realtà ci sono voluti i miei anni per scoprire perché i miei URL risultanti non funzionavano. Il tutto 404 '. Devi prima creare un derivato se non esiste già.

Quindi, ad esempio, quando aggiungi uno stile di immagine in un secondo momento, dopo che l'immagine originale è stata caricata, non esiste ancora un file di immagine con stile (derivata dell'immagine). Deve essere creato prima.

Sostituisci field_MYIMAGE e MYSTYLE di cui hai bisogno.

$original_image = $node->field_MYIMAGE->entity->getFileUri();
$style = \Drupal::entityTypeManager()->getStorage('image_style')->load('MYSTYLE');

$destination = $style->buildUri($original_image);
if (!file_exists($destination)) {
  $style->createDerivative($original_image, $destination);
}

$url = $style->buildUrl($original_image);

Vorrei che ciò accadesse automaticamente.

0
leymannx