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


42

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 posso mostrare l'immagine o creare un collegamento all'immagine all'interno del modello Twig?


Non ho tempo di controllare ma forse è semplice come url(node.field_image.0.entity.uri)( problema rilevante )
Clive

@Clive Ho provato questo e mi dà questo errore: Recoverable fatal error: Object of class Drupal\Core\Field\FieldItemList could not be converted to string quindi l'ho provato con questo: url(node.field_image.0.entity.uri.value)ma poi mi dice solo questo:Twig_Error_Runtime: An exception has been thrown during the rendering of a template ("Route "public://image.png" does not exist.")
Rias

Errr ... Immagino che debba essere fatto in un hook di preelaborazione, a meno che non ci sia una funzione di aiuto Twig per convertire FieldItemLists in una rappresentazione di stringa (che non riesco a trovare)
Clive

Oh vedo, url()vuole un percorso. Che ne dici url_from_path(node.field_image.0.entity.uri.value)?
Clive

Hmm url_from_path()sembra generare questo: http://mywebsite.local/public%3A//image.pngquindi sembra essere urlencoding e aggiungere il valore esatto all'URL
Rias

Risposte:


49

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

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

2
Tieni presente che otterrai l'URL dell'immagine originale "non modificata" e non l'URL specifico dello stile di immagine (ad es. Anteprima). A parte la risposta di VladimirM, non c'è modo di ottenere l'URL dell'immagine corretta in un ramoscello. Almeno attualmente ...
Philipp Michael,

2
... gli stili di immagine sono ora disponibili in Twig Tweak - drupal.org/project/twig_tweak
4k4

1
La classe File ha un url()metodo, quindi puoi semplicemente chiamare entity.url()anziché passare entity.fileuriafile_url()
Kiee

36

Non conosco Twig, ma ottieni l'URI del file $node->field_image->entity->getFileUri()in PHP e devi fare appello file_create_url()a 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.


2
Stiamo cercando di inserire file_create_url () nel core, ma la mancanza di interesse ha reso stantio il problema. drupal.org/node/2168231 Anche se ciò dovesse entrare, dovrebbe essere {{file_url (node.field_image.entity.fileuri)}}
joelpittet

27

Se qualcuno avesse bisogno di un'immagine in stile:

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

4
Questa è un'ottima risposta Nota che nel tuo file .theme o .module vorrai aggiungerlo all'inizio:use Drupal\image\Entity\ImageStyle;
mikeDOTexe

2
Ho riscontrato un problema con https, in cui Safari non mostra l'immagine in quanto utilizza invece l'IP. Potresti voler aggiungere $relative = file_url_transform_relative($styled_image_url);per assicurarti che sia relativo. API qui
mikeDOTexe,

9

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

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

NOTA: dovrebbe funzionare per Drupal 8.5+


Penso che sia negativo che questo genere di cose venga deprecato dopo un po '. L'aggiornamento di Drupal dovrebbe far funzionare quelli! Questo funziona per me in Drupal 8.6, grazie.
Stef Van Looveren,

7

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

Ottenere l'URI di immagine in Twig è 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


6

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

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

L'utilizzo kint($node->get('field_image')->entity)e la visualizzazione dell'array è stato molto utile

inserisci qui la descrizione dell'immagine

Quindi nel mio file ramoscello ho usato:

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

cosa succede se non è stata inserita alcuna immagine e abbiamo impostato il valore predefinito.
amol


2

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());
    }
  }

1

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

Innanzitutto installare il modulo Twig Tweak

Quindi impostare l'URI dell'immagine come variabile. Con l'URI, è possibile utilizzare un motivo di twig twig per ottenere il percorso con qualsiasi stile di immagine desiderato. 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 un file_urlfiltro per estrarre l'URL del file da un'entità.

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

0

Ho avuto lo stesso problema, quindi ho creato una get_image_path()funzione Twig e l'ho aggiunta con un sacco di altre cose utili al mio modulo Starter della 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 un sacco di contesti - si può passare node.field_name, content.field_nameo row._entity.field_name(nel caso di un modello di vista campi).


0

Accidenti, in realtà ci sono voluti i miei anni per scoprire perché i miei URL risultanti non funzionavano. Il tutto 404 '. È necessario creare prima 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_MYIMAGEe MYSTYLEse necessario.

$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

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

{{ media_img_url }}

0

Per ottenere l'attributo di immagine come URI, alt, titolo ecc. Usa la sintassi come sotto il modello saggio

Nel modello di ramoscello del nodo

{{node.field_name.entity.fileuri}}

Nel modello di ramoscello in campo

{{content.field_name.entity.fileuri}}

Nell'altro campo modello di ramoscello

{{element['#object'].field_name.entity.fileuri}}

Nota: controllare anche il cheat sheet del modulo twig_tweaks per i dettagli relativi al problema relativo al ramoscello.


0

È possibile utilizzare il url()metodo che si trova nella classe File come collegamento in modo da:

{{ 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_SecurityErrorquando viene chiamato in un modello di ramoscello.

Se ricevi Twig_Sandbox_SecurityErrorpuoi dire a ramoscello di consentire urlnel tuo file settings.php come menzionato in questo post Stackoverflow

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


-4

Puoi farlo in due modi!

1) file_create_url (---------) // inside scrive il percorso del nodo

2) file_url (-------) // inside scrive il percorso del nodo

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.