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.