Как получить URI файла из объекта EntityMetadataWrapper?

11

Получение файловых объектов, связанных с узлами, через поле легко с помощью EntityMetadataWrapper:

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

Ну и замечательно. Однако я хочу использовать некоторые свойства стандартного файлового объекта, и они недоступны. Когда я смотрю на свойства, доступные при $images[0]->fileиспользовании приведенного выше кода, я вижу это:

  • шлагтов
  • название
  • мим
  • размер
  • URL
  • отметка времени
  • владелец

В частности, uriотсутствует, и на его месте есть urlсвойство, которое является полный внешний URL-адрес файла изображения. Я хочу манипулировать этими изображениями через их URI (создавать большие пальцы и т. Д.), Поэтому мне осталось сделать это:

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

Что, кажется, сводит на нет весь смысл использования EntityMetadataWrapperв первую очередь.

Что мне не хватает? Где находится URI в обернутом файловом объекте? Если это не доступно, ради любви ко всему хорошему и чистому, почему бы и нет ?!

Я знаю, что могу деконструировать URL обратно в URI, но это также кажется очень ненужным.

Клайв
источник
1
Вы используете file_entity?
mpdonadio
@MPD Аааа, отличный вызов, нет, я не ... может быть, я не ожидал увидеть то, что я бы посчитал «свойствами», если объект не действует как сущность. Тем не менее, URL кажется странным выбором вместо URI для парней из модуля Entity. Если ответ «вам нужно будет реализовать hook_entity_property_info_alter()», то это хорошо, просто хотел знать
Клайв
Я на самом деле не уверен, будет ли это иметь значение, но включение этого модуля может привести к некоторым тонким различиям здесь и там. Я обнаружил, что интеграции файлов с EMW в других местах немного не хватает, но он недостаточно обеспокоен, чтобы представить патч.
mpdonadio
@MPD Я думаю, что так и будет - только что выяснилось, что «преступник» - entity_metadata_system_entity_property_info()это набор новых свойств $info['file']['properties']. Я готов поспорить, если бы file_entity был там, в этом массиве уже были бы свойства сущности. Я постараюсь написать ответ позже или завтра, если никто еще не сделал этого
Клайв
1
Сделал быстрый тест и uriесть с file_entity.
mpdonadio

Ответы:

9

Большое спасибо MPD за то, что он указал мне правильное направление. Короче говоря, без модуля File Entity файлы не являются сущностями, поэтому они, естественно, не имеют «свойств», которые я ожидал.

Модуль Entity предоставляет некоторые от их имени, но URI не является одним из них. К счастью, сделать его доступным с hook_entity_property_info_alter()помощью обратного вызова настраиваемого свойства очень просто :

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

После этого $images[0]->file->uri->value()доступно как положено.

Клайв
источник
8

Ниже работает без взлома:

 $node_wrapper->field_media[0]->value()['uri'];
Дуру
источник
2
Хорошо отметить, что это поддерживается в PHP 5.4 и выше.
Алесь Ребек
3

Это то, что работает для меня, чтобы получить полный путь одного изображения ...

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

С другой стороны ...

  $image = $wrapper->field_image->value();
  $image_path = $image ? file_create_url($image['uri']) : '';
Хим
источник