Obtenir une image d'un article / entité

8

Comment puis-je obtenir plus facilement une image (son chemin) à partir du type de contenu d'article inclus dans Drupal 8?

Ce que j'ai, c'est une entité. L'utilisation $image = $node->fields['field_image']me donne une sacrée structure, cependant.

N'y a-t-il pas un moyen plus simple d'obtenir le chemin de l'image? Je ne trouve pas non plus l'URL ici, ce que j'obtiens est une sorte de target_id (l'ID de fichier?).

Undrium
la source
Qu'est-ce que ça get_class ($node->fields['field_image'])vous donne?
Clive
Drupal \ file \ Plugin \ Field \ FieldType \ FileFieldItemList est ce qu'il me donne, cela ne semble contenir que les propriétés de ce qui est autorisé à télécharger.
Undrium
Si vous parcourez la liste, quels types sont ses membres? Je n'ai pas vérifié, mais j'espère un typage assez fort du champ. Si tout le reste échoue, vous pouvez utiliser l' file_load()une des méthodes disponibles surDrupal\file\FileInterface
Clive
Drupal \ image \ Plugin \ Field \ FieldType \ ImageItem est ce que j'obtiens, je ne sais pas comment gérer correctement cela, cependant.
Undrium
file_load est un dernier recours, mais il est privé et se sent tellement mal.
Undrium

Réponses:

17

Je n'ai pas vu ça avant.

Le moyen le plus court d'obtenir l'entité référencée pour un champ à valeur unique est le suivant:

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

Vous pouvez également spécifier explicitement le delta:

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

Cela fonctionne avec beaucoup de magie ArrayAccess et __get ().

Voir également la grande feuille de triche à http://wizzlern.nl/drupal/drupal-8-entity-cheat-sheet . et https://www.drupal.org/node/1795854 et les autres pages de documentation là-bas pour plus d'informations (encore beaucoup de travail en cours).

Berdir
la source
Agréable! Je me demandais comment nous pouvons obtenir l'image alt. J'ai essayé $ node-> field_image [0] -> entity-> alt et $ node-> field_image [0] -> entity-> image-> alt; que j'ai trouvé dans la documentation que vous avez mentionnée, mais cela ne fonctionne pas avec l'entité de nœud, je pense.
Hedeshy
1
l'alt / title n'est pas sur l'entité de fichier référencée mais sur l'élément de champ lui-même. Juste $ node-> field_image [0] -> alt devrait fonctionner correctement.
Berdir
3

Ce qui a fini par fonctionner pour moi en D8 est:

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

L'utilisation kint($node->get('field_image')->entity)et la recherche dans le tableau ont été très utiles

entrez la description de l'image ici

Ensuite, dans mon fichier de brindilles, j'ai utilisé:

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

Ma solution a donc été d'utiliser la méthode "referencedEntities ()" trouvée dans le nodeobject. Cela m'a donné un tableau d'objets File que je pouvais parcourir et utiliser la méthode "url ()" à partir des objets fichier pour récupérer un chemin valide.

Undrium
la source
0

Si votre nœud a plus d'une image, vous pouvez l'utiliser pour obtenir un tableau des URL des images (utile pour créer des modules de diaporama parmi beaucoup d'autres choses utiles)

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

Le tableau imageUrls contiendra toutes les URL pour toutes les images associées au champ de nœuds. J'espère que cela t'aides.

Trey Ellis
la source