web-dev-qa-db-fra.com

Comment obtenir l'URI du fichier à partir d'un objet EntityMetadataWrapper?

Il est facile de mettre la main sur des objets fichier liés aux nœuds via un champ en utilisant un EntityMetadataWrapper:

$wrapper = entity_metadata_wrapper('node', $node);
$images = $wrapper->field_images;

C'est super. Cependant, je veux utiliser certaines des propriétés de l'objet fichier standard, et elles ne sont pas disponibles. Quand je regarde les propriétés disponibles sur $images[0]->file en utilisant le code ci-dessus, je vois ceux-ci:

  • fid
  • nom
  • mime
  • taille
  • url
  • horodatage
  • propriétaire

Plus particulièrement, uri est manquant, et à sa place il y a une propriété url, qui est l'URL externe complète du fichier image. Je veux manipuler ces images via leur URI (créer des pouces, etc.), donc je reste à faire ceci:

$fid = $images[0]->file->fid->value();
$uri = file_load($fid)->uri;

Ce qui semble nier tout l'intérêt d'utiliser un EntityMetadataWrapper en premier lieu.

Qu'est-ce que je rate? Où est l'URI sur l'objet fichier encapsulé? Si ce n'est pas disponible, pour l'amour de toutes choses bonnes et pures, pourquoi pas?!

Je suis conscient que je pourrais déconstruire l'URL en URI, mais cela semble également très inutile.

11
Clive

Un grand merci à MPD pour m'avoir pointé dans la bonne direction. En bref, sans le module Entité fichier , les fichiers ne sont pas des entités, ils n'ont donc pas naturellement les "propriétés" que j'attendais.

Le module Entité en fournit en leur nom, mais l'URI n'en fait pas partie. Heureusement, il est très simple de le rendre disponible en utilisant hook_entity_property_info_alter() et un rappel de propriété personnalisé:

function MYMODULE_entity_property_info_alter(&$info) {
  $info['file']['properties']['uri'] = array(
    'label' => t("URI"),
    'description' => t("The URI of the file."),
    'getter callback' => 'MYMODULE_entity_get_file_properties',
    'schema field' => 'uri',
  );
}

function MYMODULE_entity_get_file_properties($file, array $options, $name) {
  switch ($name) {
    case 'uri':
      return $file->uri;
      break;
  }
}

Après cela, $images[0]->file->uri->value() est disponible comme prévu.

9
Clive

Ci-dessous fonctionne sans le piratage:

 $node_wrapper->field_media[0]->value()['uri'];
8
duru

C'est ce qui fonctionne pour moi pour obtenir le chemin complet d'une seule image ...

// wrap it
$wrapper = entity_metadata_wrapper('node', node_load(16));
// get the value
$image = $wrapper->field_image->value();
// check it
if ($image) {
   // get the full path
   $path = file_create_url($image['uri']);
}
print_r($path);

Alternativement ...

  $image = $wrapper->field_image->value();
  $image_path = $image ? file_create_url($image['uri']) : '';
3
chim