web-dev-qa-db-fra.com

Itérer sur les éléments de FieldItemList?

En d'autres termes: comment puis-je obtenir l'URI pour chacun des fichiers dans un champ de fichier qui se trouve sur une entité de contenu personnalisé appelée "liste".

En ce moment, j'ai:

$images = $variables['elements']['photos']['#items'];

Où $ images est un FieldItemList

Comment puis-je parcourir mon FieldItemList pour récupérer l'URI de chacun des fichiers qui y sont référencés?

Ok compris la première partie avec:

 $images = $variables['elements']['photos']['#items'];
   $photos = $images->getIterator();
   foreach ($photos as $photo) {
     xdebug_break();
   }

Maintenant, la question est:

Comment obtenir l'URI pour chacun des $ photo, et l'affecter en tant que variable ...?


Mise à jour

Après le commentaire de Berdir et ma propre enquête, c'est ce que j'ai fait.

  if (isset($variables['elements']['photos']['0'])) {
    $number_of_photos = count($variables['elements']['photos']['#items']);
    $listing_pics = [];
    for ($i = 0; $i < $number_of_photos; $i++) {
      $pic = file_create_url($variables['elements']['photos'][$i]['#file']->getFileUri());
      $listing_pics[] = $pic;
    }
  $variables['elements']['listing_photos'] = $listing_pics;
  }

C'est dans un Hook_template_preprocess_HOOK (), et maintenant toutes les URL de mon champ de fichier à valeurs multiples sont disponibles pour le modèle comme ceci {{elements.listing_photos}}

6
iain maitland

PHP appelle getIterator () pour vous, vous n'avez pas à le faire. Utilisez également $ variables ['node'], beaucoup plus facile d'accès.

File/Image fait référence à une extension des références d'entité, ce qui signifie qu'elles héritent de la propriété d'entité calculée ->, qui charge automatiquement l'entité référencée. Assurez-vous de vérifier si le fichier peut être chargé, ou des données incohérentes (si, pour une raison quelconque, le fichier est supprimé. Moins probable pour les fichiers mais pourrait se produire pour le nœud ou d'autres références) entraînerait une erreur fatale.

foreach ($variables['node']->photos as $item) {
  if ($item->entity) {
    $uri = $item->entity->getFileUri();
  }
}

$ uri est quelque chose comme 'public: //your_file.jpg'. Vous pouvez créer une URL publique avec file_create_url () ou vous pouvez également la transmettre à la méthode buildUrl () d'une entité de style d'image pour obtenir l'URL d'un style d'image donné.

Voir http://wizzlern.nl/drupal/drupal-8-entity-cheat-sheet pour des moyens courants d'accéder aux valeurs des champs, quelles propriétés existent pour chaque type de champ et bien plus encore.

11
Berdir