EntityMetadataWrapper nesnesinden dosya URI'sini nasıl alabilirim?


11

Bir alandaki düğümlerle ilgili dosya nesnelerini elde etmek aşağıdakileri kullanarak kolaydır EntityMetadataWrapper:

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

Bu harika. Ancak, standart dosya nesnesinin bazı özelliklerini kullanmak istiyorum ve kullanılabilir değil. $images[0]->fileYukarıdaki kodu kullanarak kullanılabilir özelliklere baktığımda, bunları görüyorum:

  • kama
  • isim
  • mim
  • boyut
  • uRL
  • Zaman damgası
  • sahip

En önemlisi, urieksiktir ve onun yerine urlgörüntü dosyasının tam harici URL'si olan bir özellik vardır . Onların URI (başparmak oluşturmak, vb) aracılığıyla bu görüntüleri manipüle etmek istiyorum, bu yüzden bunu yapıyorum:

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

Hangi bir bütün olarak kullanım noktasını reddetmek gibi görünüyor EntityMetadataWrapper.

Neyi kaçırıyorum? Sarılmış dosya nesnesindeki URI nerede? Eğer mevcut değilse, iyi ve saf her şeyin aşkı için neden olmasın ?!

URL'yi bir URI'ye geri yapılandırabileceğimin farkındayım, ancak bu da çok gereksiz geliyor.


1
File_entity kullanıyor musunuz?
mpdonadio

@MPD Ahhhh, büyük çağrı, hayır ben değilim ... belki nesne bir varlık gibi davranmıyorsa 'özellikler' olarak değerlendireceğimi görmeyi beklememeliydim. Varlık modülü çocuklarının seçmesi için URL, URI yerine garip bir seçim gibi görünüyor. Eğer cevap "uygulamanız gerekecek hook_entity_property_info_alter()" ise, sorun değil, sadece bilmek istedim
Clive

Aslında bunun bir fark yaratıp yaratmayacağından emin değilim, ancak bu modülün etkinleştirilmesi burada ve orada bazı ince farklarla sonuçlanıyor. EMW ile Dosya entegrasyonunun başka yerlerde biraz eksik olduğunu gördüm, ancak bir yama göndermek için yeterince rahatsız olmadım.
mpdonadio

@MPD Bence - sadece 'suçlu' olduğunu öğrendim entity_metadata_system_entity_property_info(), burada bir sürü yeni özellik tacked $info['file']['properties']. Eğer file_entity orada dizi zaten varlık özellikleri kendilerini orada olurdu eğer bahis istekli. Kimse daha önce yapmadıysa, daha sonra veya yarın bir cevap yazmaya çalışacağım
Clive

1
Hızlı bir test yaptı ve urifile_entity ile orada.
mpdonadio

Yanıtlar:


9

Beni doğru yöne yönlendirdiği için MPD'ye çok teşekkürler. Kısacası, Dosya Varlığı modülü olmadan dosyalar varlık değildir, bu yüzden doğal olarak beklediğim 'özelliklere' sahip değildir.

Varlık modülü kendi adına bazılarını sağlar, ancak URI bunlardan biri değildir. Neyse ki kullanarak hook_entity_property_info_alter()ve özel bir özellik geri arama kullanılabilir hale getirmek çok basit :

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

Bundan sonra, $images[0]->file->uri->value()beklendiği gibi kullanılabilir.


8

Aşağıda saldırı olmadan çalışır:

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

2
Bunun PHP 5.4 sürümünden desteklendiğini belirtmek iyi olur.
Ales Rebec

3

Tek bir görüntünün tam yolunu elde etmek benim için işe yarıyor ...

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

Alternatif ...

  $image = $wrapper->field_image->value();
  $image_path = $image ? file_create_url($image['uri']) : '';
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.