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?).


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).


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

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.


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.

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.