¿Cómo obtengo el URI del archivo de un objeto EntityMetadataWrapper?

11

Obtener archivos de objetos relacionados con nodos a través de un campo es fácil usando EntityMetadataWrapper:

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

Entonces eso es genial. Sin embargo, quiero usar algunas de las propiedades del objeto de archivo estándar, y no están disponibles. Cuando miro las propiedades disponibles al $images[0]->fileusar el código anterior, veo estas:

  • defensor
  • nombre
  • mímica
  • Talla
  • url
  • marca de tiempo
  • propietario

Lo más notable uries que falta, y en su lugar hay una urlpropiedad, que es la URL externa completa del archivo de imagen. Quiero manipular estas imágenes a través de su URI (crear pulgares, etc.), así que me quedo haciendo esto:

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

Lo que parece negar todo el punto de usar un EntityMetadataWrapperen primer lugar.

¿Qué me estoy perdiendo? ¿Dónde está el URI en el objeto de archivo envuelto? Si no está disponible, por amor a todas las cosas buenas y puras, ¿por qué no?

Soy consciente de que podría deconstruir la URL a un URI, pero eso también se siente muy innecesario.

Clive
fuente
1
¿Estás usando file_entity?
mpdonadio
@MPD Ahhhh, gran llamada, no, no lo estoy ... tal vez no debería esperar ver lo que consideraría 'propiedades' si el objeto no actúa como una entidad. Sin embargo, la URL parece una elección extraña en lugar de URI para que los chicos del módulo de entidad hayan elegido. Si la respuesta es "vas a necesitar implementar hook_entity_property_info_alter()", entonces está bien, solo quería saber
Clive
En realidad, no estoy seguro de si eso hará la diferencia, pero tener ese módulo habilitado termina en algunas diferencias sutiles aquí y allá. He encontrado que la integración de archivos con EMW es un poco escasa en otros lugares, pero no me ha molestado lo suficiente como para enviar un parche.
mpdonadio
@MPD Creo que lo hará: acabo de descubrir que el 'delincuente' es entity_metadata_system_entity_property_info()donde se agregan un montón de nuevas propiedades $info['file']['properties']. Estoy dispuesto a apostar si file_entity estaba allí, esa matriz ya tendría las propiedades de la entidad. Intentaré escribir una respuesta más tarde o mañana si nadie ya lo ha hecho
Clive
1
Hice una prueba rápida y uriestá ahí con file_entity.
mpdonadio

Respuestas:

9

Muchas gracias a MPD por señalarme en la dirección correcta. En resumen, sin el módulo de entidad de archivo , los archivos no son entidades, por lo que, naturalmente, no tienen las 'propiedades' que esperaba.

El módulo de entidad proporciona algunos en su nombre, pero URI no es uno de ellos. Afortunadamente, es muy simple hacerlo disponible mediante hook_entity_property_info_alter()una devolución de llamada de propiedad personalizada:

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

Después de eso, $images[0]->file->uri->value()está disponible como se esperaba.

Clive
fuente
8

A continuación funciona sin el truco:

 $node_wrapper->field_media[0]->value()['uri'];
duru
fuente
2
Es bueno señalar que esto es compatible con PHP 5.4 en adelante.
Ales Rebec
3

Esto es lo que funciona para mí para obtener el camino completo de una sola imagen ...

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

Alternativamente...

  $image = $wrapper->field_image->value();
  $image_path = $image ? file_create_url($image['uri']) : '';
chim
fuente