Як отримати 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є там файл_entity.
mpdonadio

Відповіді:


9

Велика подяка MPD за те, що він направив мене в правильному напрямку. Коротше кажучи, без модуля Entity File файли не є сутностями, тому вони, природно, не мають "властивостей", яких я очікував.

Модуль 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()доступний, як очікувалося.



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']) : '';
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.