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

Pregunta:

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

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

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 en $images[0]->file usando el código anterior, veo estas:

  • defensor
  • nombre
  • mímica
  • Talla
  • url
  • marca de tiempo
  • dueño

En particular, falta uri , y en su lugar hay una propiedad url , 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 EntityMetadataWrapper en primer lugar.

¿Qué me estoy perdiendo? ¿Dónde está el URI en el objeto de archivo empaquetado? 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 de nuevo a un URI, pero eso también se siente muy innecesario.

Respuesta:

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

El módulo Entity proporciona algunos en su nombre, pero URI no es uno de ellos. Afortunadamente, es muy simple hacer que esté disponible usando hook_entity_property_info_alter() y 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.

Leave a Comment

Your email address will not be published.

Scroll to Top

istanbul avukat

-

web tasarım