Bagaimana cara mendapatkan file URI dari objek EntityMetadataWrapper?


11

Memegang objek file yang terkait dengan node melalui bidang mudah menggunakan EntityMetadataWrapper:

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

Jadi itu bagus. Namun, saya ingin menggunakan beberapa properti dari objek file standar, dan mereka tidak tersedia. Ketika saya melihat properti yang tersedia $images[0]->filemenggunakan kode di atas, saya melihat ini:

  • fid
  • nama
  • pantomim
  • ukuran
  • url
  • cap waktu
  • pemilik

Terutama, uritidak ada, dan sebagai gantinya ada urlproperti, yang merupakan URL eksternal penuh untuk file gambar. Saya ingin memanipulasi gambar-gambar ini melalui URI mereka (buat jempol, dll), jadi saya tetap melakukan ini:

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

Yang tampaknya meniadakan seluruh titik menggunakan EntityMetadataWrapperdi tempat pertama.

Apa yang saya lewatkan? Di mana URI pada objek file yang dibungkus? Jika tidak tersedia, untuk cinta semua hal baik dan murni, mengapa tidak ?!

Saya sadar saya bisa mendekonstruksi URL kembali ke URI, tetapi itu juga terasa sangat tidak perlu.


1
Apakah Anda menggunakan file_entity?
mpdonadio

@MPD Ahhhh, panggilan bagus, tidak, saya tidak ... mungkin saya seharusnya tidak mengharapkan untuk melihat apa yang saya anggap 'properti' jika objek tidak bertindak seperti entitas. URL tampaknya merupakan pilihan yang aneh, alih-alih URI untuk modul Entity yang telah dipilih orang. Jika jawabannya adalah "Anda harus menerapkan hook_entity_property_info_alter()" maka itu baik-baik saja, hanya ingin tahu
Clive

Saya sebenarnya tidak yakin apakah itu akan membuat perbedaan, tetapi memiliki modul yang diaktifkan tidak berakhir di beberapa perbedaan halus di sana-sini. Saya telah menemukan integrasi File dengan EMW agak kurang di tempat lain, tetapi belum cukup terganggu untuk mengirimkan tambalan.
mpdonadio

@ MPD Saya pikir itu akan - baru tahu 'pelaku' adalah entity_metadata_system_entity_property_info(), di mana sekelompok properti baru ditempelkan ke $info['file']['properties']. Saya berani bertaruh jika file_entity ada di sana, array itu sudah memiliki properti entitas sendiri di sana. Saya akan mencoba menulis jawaban nanti atau besok jika belum ada yang melakukannya
Clive

1
Melakukan tes cepat dan uriada di sana dengan file_entity.
mpdonadio

Jawaban:


9

Terima kasih banyak kepada MPD karena menunjuk saya ke arah yang benar. Singkatnya, tanpa modul Entitas File , file bukan entitas, jadi mereka tidak secara alami memiliki 'properti' yang saya harapkan.

Modul Entity menyediakan beberapa atas nama mereka, tetapi URI bukan salah satunya. Untungnya sangat mudah untuk membuatnya tersedia menggunakan hook_entity_property_info_alter()dan panggilan balik properti kustom:

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

Setelah itu, $images[0]->file->uri->value()tersedia sesuai yang diharapkan.


8

Di bawah ini berfungsi tanpa peretasan:

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

2
Baik untuk menunjukkan bahwa ini didukung dari PHP 5.4 pada.
Ales Rebec

3

Inilah yang berfungsi bagi saya untuk mendapatkan path lengkap dari satu gambar ...

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

Kalau tidak...

  $image = $wrapper->field_image->value();
  $image_path = $image ? file_create_url($image['uri']) : '';
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.