Jak uzyskać identyfikator URI pliku z obiektu EntityMetadataWrapper?

11

Przechwytywanie obiektów plików związanych z węzłami przez pole jest łatwe przy użyciu EntityMetadataWrapper:

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

To wspaniale. Chcę jednak użyć niektórych właściwości standardowego obiektu pliku i nie są one dostępne. Kiedy patrzę na właściwości dostępne przy $images[0]->fileużyciu powyższego kodu, widzę te:

  • fid
  • imię
  • mim
  • rozmiar
  • adres URL
  • znak czasu
  • właściciel

Co najważniejsze, uribrakuje, a na jego miejscu znajduje się urlwłaściwość, która jest pełnym zewnętrznym adresem URL pliku obrazu. Chcę manipulować tymi obrazami za pomocą ich identyfikatora URI (twórz kciuki itp.), Więc zostawiam to:

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

Co wydaje się negować cały sens używania EntityMetadataWrapperna pierwszym miejscu.

czego mi brakuje? Gdzie jest URI na zawiniętym obiekcie pliku? Jeśli nie jest dostępny, z miłości do wszystkich rzeczy dobrych i czystych, dlaczego nie ?!

Wiem, że mogę zdekonstruować adres URL z powrotem do identyfikatora URI, ale to również wydaje się bardzo niepotrzebne.

Clive
źródło
1
Czy używasz file_entity?
mpdonadio
@MPD Ahhhh, świetne wezwanie, nie, nie jestem ... może nie powinienem oczekiwać, że zobaczę, co uważam za „właściwości”, jeśli obiekt nie zachowuje się jak byt. Jednak adres URL wydaje się dziwnym wyborem zamiast identyfikatora URI dla facetów z modułu Entity. Jeśli odpowiedź brzmi: „będziesz musiał wdrożyć hook_entity_property_info_alter()”, to w porządku, chciałem tylko wiedzieć
Clive
Właściwie nie jestem pewien, czy to coś zmieni, ale włączenie tego modułu powoduje pewne subtelne różnice tu i tam. Zauważyłem, że integracji plików z EMW brakuje trochę w innych miejscach, ale nie przeszkadzało mi to, aby przesłać łatkę.
mpdonadio
@MPD Myślę, że tak - właśnie dowiedziałem się, że „sprawcą” jest miejsce entity_metadata_system_entity_property_info(), w którym wkracza szereg nowych właściwości $info['file']['properties']. Jestem gotów się założyć, że jeśli plik_entity tam był, to tablica miałaby już same właściwości encji. Postaram się napisać odpowiedź później lub jutro, jeśli nikt już tego nie zrobił
Clive
1
Zrobiłem szybki test i urijest tam z file_entity.
mpdonadio

Odpowiedzi:

9

Ogromne podziękowania dla MPD za skierowanie mnie we właściwym kierunku. Krótko mówiąc, bez modułu File Entity pliki nie są bytami, więc nie mają naturalnie „właściwości”, których się spodziewałem.

Moduł Entity udostępnia niektóre w ich imieniu, ale URI nie jest jednym z nich. Na szczęście udostępnienie go za pomocą hook_entity_property_info_alter()i wywołanie zwrotne właściwości niestandardowej jest bardzo proste :

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

Następnie $images[0]->file->uri->value()jest dostępny zgodnie z oczekiwaniami.

Clive
źródło
8

Poniżej działa bez włamania:

 $node_wrapper->field_media[0]->value()['uri'];
duru
źródło
2
Warto zauważyć, że jest to obsługiwane od wersji PHP 5.4.
Ales Rebec
3

To właśnie działa dla mnie, aby uzyskać pełną ścieżkę pojedynczego obrazu ...

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

Alternatywnie...

  $image = $wrapper->field_image->value();
  $image_path = $image ? file_create_url($image['uri']) : '';
chim
źródło