Como obtenho o URI do arquivo de um objeto EntityMetadataWrapper?

11

É fácil obter objetos de arquivo relacionados a nós por meio de um campo EntityMetadataWrapper:

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

Então isso é ótimo. No entanto, quero usar algumas das propriedades do objeto de arquivo padrão e elas não estão disponíveis. Quando olho para as propriedades disponíveis no $images[0]->fileuso do código acima, vejo estas:

  • fid
  • nome
  • mímica
  • Tamanho
  • url
  • timestamp
  • proprietário

Mais notavelmente, uriestá faltando e, em seu lugar, há uma urlpropriedade, que é a URL externa completa para o arquivo de imagem. Eu quero manipular essas imagens via URI (criar thumbs, etc), por isso estou fazendo isso:

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

O que parece negar todo o sentido de usar um EntityMetadataWrapperem primeiro lugar.

o que estou perdendo? Onde está o URI no objeto de arquivo agrupado? Se não está disponível, pelo amor de todas as coisas boas e puras, por que não ?!

Estou ciente de que poderia desconstruir o URL de volta para um URI, mas isso também parece muito desnecessário.

Clive
fonte
1
Você está usando file_entity?
mpdonadio
@MPD Ahhhh, ótima ligação, não, não estou ... talvez não devesse esperar ver o que consideraria 'propriedades' se o objeto não estivesse agindo como uma entidade. O URL parece uma escolha estranha, em vez do URI, para os caras do módulo Entity. Se a resposta for "você precisará implementar hook_entity_property_info_alter()", tudo bem, só queria saber
Clive
Na verdade, não tenho certeza se isso fará diferença, mas ter esse módulo ativado acaba em algumas diferenças sutis aqui e ali. Eu achei a integração de arquivos com o EMW um pouco ausente em outros lugares, mas não me incomodei o suficiente para enviar um patch.
mpdonadio
@ MPD Acho que sim - acabei de descobrir que o 'agressor' é o local entity_metadata_system_entity_property_info()onde várias novas propriedades são adornadas $info['file']['properties']. Estou disposto a apostar se file_entity estava lá nessa matriz já teria as propriedades da entidade lá. Vou tentar escrever uma resposta mais tarde ou amanhã, se ninguém já tiver feito isso.
Clive
1
Fiz um teste rápido e uriestá lá com file_entity.
mpdonadio

Respostas:

9

Muito obrigado ao MPD por me apontar na direção certa. Em resumo, sem o módulo Entidade de arquivo , os arquivos não são entidades, portanto, eles não têm naturalmente as 'propriedades' que eu esperava.

O módulo Entity fornece alguns em seu nome, mas o URI não é um deles. Felizmente, é muito simples disponibilizá-lo usando hook_entity_property_info_alter()e um retorno de chamada de propriedade 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;
  }
}

Depois disso, $images[0]->file->uri->value()está disponível conforme o esperado.

Clive
fonte
8

Abaixo funciona sem o hack:

 $node_wrapper->field_media[0]->value()['uri'];
duru
fonte
2
É bom ressaltar que isso é suportado a partir do PHP 5.4 em diante.
Ales Rabeca
3

É isso que funciona para eu obter o caminho completo de uma única imagem ...

// 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
fonte