Ottieni un'immagine da un articolo / entità


8

Come posso ottenere un'immagine (il suo percorso) più facilmente dal tipo di contenuto dell'articolo incluso in Drupal 8?

Quello che ho è un'entità. L'uso però $image = $node->fields['field_image']mi dà una struttura infernale.

Non esiste un modo più semplice per ottenere il percorso dell'immagine? Inoltre non riesco a trovare l'URL in questo, quello che ottengo è una sorta di target_id (l'ID file?).


Cosa get_class ($node->fields['field_image'])ti dà?
Clive

Drupal \ file \ Plugin \ Field \ FieldType \ FileFieldItemList è ciò che mi dà, questo sembra contenere solo le proprietà di ciò che è consentito caricare.
Undrium,

Se ripeti l'elenco quali tipi sono i suoi membri? Non ho controllato, ma spero in qualche digitazione abbastanza forte del campo. Se tutto il resto fallisce è possibile utilizzare file_load()e uno dei metodi disponibili suDrupal\file\FileInterface
Clive

Drupal \ image \ Plugin \ Field \ FieldType \ ImageItem è quello che ottengo, non sono sicuro di come gestirlo correttamente, però.
Undrium,

file_load è l'ultima risorsa, ma è deprivato e sembra così sbagliato.
Undrium,

Risposte:


17

Non l'ho visto prima.

Il modo più breve per ottenere l'entità referenziata per un campo a valore singolo è questo:

$node->field_image->entity->url()

È inoltre possibile specificare esplicitamente il delta:

$node->field_image[0]->entity->url()

Funziona con molta magia ArrayAccess e __get ().

Vedi anche l'ottimo cheat sheet su http://wizzlern.nl/drupal/drupal-8-entity-cheat-sheet . e https://www.drupal.org/node/1795854 e le altre pagine di documentazione lì per ulteriori informazioni (ancora molto lavori in corso).


Bello! Mi chiedevo come possiamo ottenere l'immagine alt. Ho provato $ node-> field_image [0] -> entity-> alt e $ node-> field_image [0] -> entity-> image-> alt; che ho trovato nella documentazione che hai citato ma non funziona con l'entità nodo penso.
Hedeshy,

1
alt / title non si trova sull'entità file di riferimento ma sull'elemento campo stesso. Solo $ node-> field_image [0] -> alt dovrebbe funzionare bene.
Berdir,

3

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) }}" />

1

Quindi la mia soluzione è stata quella di utilizzare il metodo "referencedEntities ()" trovato nell'oggetto nodo. Questo mi ha dato un array di oggetti File che ho potuto scorrere e utilizzare il metodo "url ()" dagli oggetti file per recuperare un percorso valido.


0

Se il tuo nodo ha più di un'immagine, puoi usarlo per ottenere una matrice di URL di immagini (utile per creare moduli di presentazione tra molte altre cose utili)

$allImagesFound = false;
$imageUrls = array();
$numberOfImages = 0;
while(!$allImagesFound)
{
    //make sure we are not calling a null value, if so then we have found all images
    if($node->get('your_image_field_name')[$numberOfImages] != null) {
        $imageUrls[] = $node->get('your_image_field_name')[$numberOfImages]->entity->url();
        $numberOfImages++;
    } else {
        $allImagesFound = true;
        break;
    }
}

L'array imageUrls conterrà tutti gli URL per tutte le immagini associate al campo nodi. Spero che sia di aiuto.

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.