Come posso ottenere l'URI del file da un oggetto EntityMetadataWrapper?


11

Ottenere oggetti file relativi ai nodi attraverso un campo è facile usando un EntityMetadataWrapper:

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

Quindi è fantastico. Tuttavia, desidero utilizzare alcune delle proprietà dell'oggetto file standard e non sono disponibili. Quando guardo le proprietà disponibili $images[0]->filesull'uso del codice sopra, vedo queste:

  • fid
  • nome
  • mimo
  • dimensione
  • url
  • timestamp
  • proprietario

In particolare, urimanca e al suo posto c'è una urlproprietà, che è l'URL esterno completo del file di immagine. Voglio manipolare queste immagini tramite il loro URI (creare pollici, ecc.), Quindi mi rimane questo:

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

Il che sembra negare tutto il punto di usare un EntityMetadataWrapperin primo luogo.

Cosa mi sto perdendo? Dov'è l'URI sull'oggetto file avvolto? Se non è disponibile, per l'amore di tutte le cose buone e pure, perché no ?!

Sono consapevole di poter decostruire l'URL in un URI, ma anche questo mi sembra molto inutile.


1
Stai usando file_entity?
mpdonadio

@MPD Ahhhh, bella chiamata, no non lo sono ... forse non dovrei aspettarmi di vedere cosa considererei "proprietà" se l'oggetto non si comporta come un'entità. Tuttavia, l'URL sembra una scelta strana invece dell'URI che il modulo Entity deve aver scelto. Se la risposta è "dovrai implementare hook_entity_property_info_alter()", allora va bene, volevo solo sapere
Clive

In realtà non sono sicuro se questo farà la differenza, ma avere quel modulo abilitato finisce con alcune sottili differenze qua e là. Ho trovato che l'integrazione dei file con EMW è un po 'carente in altri posti, ma non mi ha infastidito abbastanza da inviare una patch.
mpdonadio

@MPD Penso che lo farà - ho appena scoperto che è 'l'autore del reato' entity_metadata_system_entity_property_info(), in cui un sacco di nuove proprietà vengono attaccate $info['file']['properties']. Sono disposto a scommettere se file_entity fosse lì, quell'array avrebbe già le proprietà dell'entità. Cercherò di scrivere una risposta più tardi o domani se nessuno lo ha già fatto
Clive

1
Ha fatto un test rapido ed uriè lì con file_entity.
mpdonadio

Risposte:


9

Grazie mille a MPD per avermi indicato nella giusta direzione. In breve, senza il modulo Entità file, i file non sono entità, quindi non hanno naturalmente le "proprietà" che mi aspettavo.

Il modulo Entity fornisce alcuni per loro conto, ma URI non è uno di questi. Fortunatamente è molto semplice renderlo disponibile utilizzando hook_entity_property_info_alter()e un callback di proprietà personalizzato:

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

Successivamente, $images[0]->file->uri->value()è disponibile come previsto.


8

Di seguito funziona senza l'hack:

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

2
È bene sottolineare che questo è supportato da PHP 5.4 in poi.
Ales Rebec,

3

Questo è ciò che funziona per me per ottenere il percorso completo di una singola immagine ...

// 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);

In alternativa ...

  $image = $wrapper->field_image->value();
  $image_path = $image ? file_create_url($image['uri']) : '';
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.