Holen Sie sich ein Bild von einem Artikel / einer Entität

8

Wie erhalte ich am einfachsten ein Bild (seinen Pfad) aus dem in Drupal 8 enthaltenen Artikelinhaltstyp?

Was ich habe, ist eine Einheit. Die Verwendung $image = $node->fields['field_image']gibt mir jedoch eine verdammt gute Struktur.

Gibt es keinen einfacheren Weg, um den Bildpfad zu erhalten? Außerdem kann ich die URL darin nicht finden. Ich erhalte eine Art Ziel-ID (die Datei-ID?).

Undrium
quelle
Was gibt get_class ($node->fields['field_image'])es dir?
Clive
Drupal \ file \ Plugin \ Field \ FieldType \ FileFieldItemList ist das, was es mir gibt. Dies scheint nur Eigenschaften dessen zu enthalten, was hochgeladen werden darf.
Undrium
Wenn Sie die Liste durchlaufen, welche Typen sind ihre Mitglieder? Ich habe nicht nachgesehen, aber ich hoffe auf eine einigermaßen starke Eingabe des Feldes. Wenn alles andere fehlschlägt, können Sie file_load()eine der verfügbaren Methoden verwendenDrupal\file\FileInterface
Clive
Drupal \ image \ Plugin \ Field \ FieldType \ ImageItem ist das, was ich bekomme, aber nicht sicher, wie ich damit richtig umgehen soll.
Undrium
file_load ist ein letzter Ausweg, aber es ist beraubt und fühlt sich so falsch an.
Undrium

Antworten:

17

Hab das vorher nicht gesehen.

Der kürzeste Weg, um die referenzierte Entität für ein Feld mit einem Wert zu erhalten, ist folgender:

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

Sie können das Delta auch explizit angeben:

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

Dies funktioniert mit viel ArrayAccess und __get () Magie.

Siehe auch den tollen Spickzettel unter http://wizzlern.nl/drupal/drupal-8-entity-cheat-sheet . und https://www.drupal.org/node/1795854 und die anderen Dokumentationsseiten dort für weitere Informationen (noch sehr viel in Arbeit).

Berdir
quelle
Nett! Ich habe mich gefragt, wie wir das Bild alt bekommen können. Ich habe versucht, $ node-> field_image [0] -> entity-> alt und $ node-> field_image [0] -> entity-> image-> alt; Das habe ich in der von Ihnen erwähnten Dokumentation gefunden, aber es funktioniert nicht mit der Knotenentität, die ich denke.
Hedeshy
1
Der Alt / Titel befindet sich nicht in der referenzierten Dateientität, sondern im Feldelement selbst. Nur $ node-> field_image [0] -> alt sollte gut funktionieren.
Berdir
3

Was in D8 für mich gearbeitet hat, ist:

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

Das Verwenden kint($node->get('field_image')->entity)und Durchsuchen des Arrays war sehr hilfreich

Geben Sie hier die Bildbeschreibung ein

Dann habe ich in meiner Zweigdatei Folgendes verwendet:

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

Meine Lösung bestand also darin, die im Knotenobjekt gefundene Methode "referencedEntities ()" zu verwenden. Dies gab mir ein Array von Dateiobjekten, die ich durchlaufen und die Methode "url ()" aus den Dateiobjekten verwenden konnte, um einen gültigen Pfad abzurufen.

Undrium
quelle
0

Wenn Ihr Knoten mehr als ein Bild hat, können Sie dies verwenden, um ein Array der Bild-URLs abzurufen (hilfreich, um Diashow-Module unter vielen anderen nützlichen Dingen zu erstellen).

$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;
    }
}

Das imageUrls-Array enthält alle URLs für alle Bilder, die dem Knotenfeld zugeordnet sind. Hoffe das hilft.

Trey Ellis
quelle