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

11

Il est facile de mettre la main sur des objets fichier liés aux noeuds via un champ en utilisant 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 l' $images[0]->fileutilisation du code ci-dessus, je vois celles-ci:

  • fid
  • Nom
  • mime
  • Taille
  • url
  • horodatage
  • propriétaire

Plus particulièrement, il urimanque, et à sa place il y a une urlpropriété, 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 EntityMetadataWrapperen 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.

Clive
la source
1
Utilisez-vous file_entity?
mpdonadio
@MPD Ahhhh, super appel, non, je ne le suis pas ... peut-être que je ne devrais pas m'attendre à voir ce que je considérerais comme des "propriétés" si l'objet n'agit pas comme une entité. L'URL semble un choix étrange au lieu de l'URI pour les gars du module Entité, cependant. Si la réponse est "vous allez avoir besoin de l'implémenter hook_entity_property_info_alter()" alors c'est bien, je voulais juste savoir
Clive
Je ne sais pas vraiment si cela fera une différence, mais avoir ce module activé finit par quelques différences subtiles ici et là. J'ai trouvé que l'intégration de fichiers avec EMW manquait un peu ailleurs, mais je n'ai pas été suffisamment gêné par elle pour soumettre un correctif.
mpdonadio
@MPD Je pense que ça va - vient de découvrir que le «contrevenant» est entity_metadata_system_entity_property_info(), où un tas de nouvelles propriétés sont clouées $info['file']['properties']. Je suis prêt à parier que si file_entity était là, ce tableau aurait déjà les propriétés d'entité elles-mêmes. J'essaierai de rédiger une réponse plus tard ou demain si personne ne l'a déjà fait
Clive
1
A fait un test rapide et uriest là avec file_entity.
mpdonadio

Réponses:

9

Un grand merci à MPD pour m'avoir pointé dans la bonne direction. En bref, sans le module File Entity , 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 à l'aide d' hook_entity_property_info_alter()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.

Clive
la source
8

Ci-dessous fonctionne sans le piratage:

 $node_wrapper->field_media[0]->value()['uri'];
duru
la source
2
Il est bon de souligner que cela est pris en charge à partir de PHP 5.4.
Ales Rebec
3

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']) : '';
chim
la source