Como definir o valor do campo do arquivo com entity_metadata_wrapper


24

Como você define o valor de um campo de arquivo ao usar o entity_metadata_wrapper?

Eu tentei fazer isso no código:

$file = new stdClass();
$file->uid = 1;
$file->uri = $file_path;
$file->filename = basename($file_path);
$file->filemime = file_get_mimetype($file_path);
$file->filesize = filesize($file_path);
$file->status = FILE_STATUS_PERMANENT;
$file->display = '1';
file_save($file); // I also tried: $file = file_save($file);

$node = array(
  'type' => 'news_item',
  'uid' => 1,
  'status' => 1,
  'comment' => 0,
  'promote' => 0,
  'language' => 'en',
);

$entity = entity_create('node', $node);

$ewrapper = entity_metadata_wrapper('node', $entity);

$ewrapper->field_document->set((array) $file); // I also tried: $ewrapper->field_document->set($file);

$ewrapper->save(true);
entity_save('node', $entity);

Mas eu recebo esta exceção:

EntityMetadataWrapperException: Invalid data value given. Be sure it matches the required data type and format. in EntityMetadataWrapper->set() (line 122 of C:\wamp\www\drupal\sites\all\modules\entity\includes\entity.wrapper.inc).

Qualquer ajuda é muito apreciada.

Respostas:


14

O agrupamento da matriz de arquivos em outra matriz parece fazer o truque para mim:

$file = (array) $file;
$items = array($file);
$ewrapper->field_document->set($items);

Mas ainda não descobri o porquê ...


Isso realmente funciona. Muito obrigado pela sua ajuda, agradeço!
Smos

5
Acredito que tenha algo a ver com o índice delta do campo. Se você não atribuir um índice delta ao seu campo (por exemplo, $ ewrapper-> field_name-> set ();), será necessário agrupar outra matriz em torno dele. Se você atribuir um índice delta ao seu campo (por exemplo, $ ewrapper-> field_name [0] -> set ();), basta usar $ file = (array) $ file.
Smos 12/04

Sim, isso faz muito sentido, obrigado por acompanhar
Clive

19

Bem, acabei de descobrir uma maneira mais simples e menos feia de definir uma imagem .

$image_file = A FILE OBJECT; //Lot of choices here : new stdClass(), file_load, etc
$wrapper->FIELD_NAME->file->set($image_file);

Assim como a taxonomia ou referência de nó / entidade, o nome do campo do arquivo aponta para um objeto carregado, é assim que eu descubro.


:: EDIT a posteriori ::

Aqui como eu faria isso com a pergunta OP.

// Get the file
$file = file_save_data(file_get_contents('/my_local_path/img1.jpg'), 'public://remote_name.jpg');

// Wrap' it like one of your French girls
$wrapper = entity_metadata_wrapper('node', $node);

// And set the photo
$wrapper->field_photo->file->set($file);

// And save the node
$wrapper->save();

Erro fatal: Chamada a um conjunto de funções membro () no nulo ... Eu sou capaz de adicionar alguns campos de texto, mas acrescentando um arquivo simplesmente não funciona
Patricks

@PatrickS Tem certeza de que criou um objeto de arquivo? Até o método de Clive não funcionou?
JudaPriest

Estou tentando migrar algum conteúdo do Joomla para o Drupal. A primeira vez que migro os arquivos, ele funciona. Se eu apagar todos os produtos e tentar outra migração, ele não funcionará mais. A única maneira de fazê-lo funcionar é a partir de uma nova instalação. Eu armazenei os dados do Joomla em um arquivo JSON, que eu uso para criar as entidades. No momento em que deixei o comentário, ainda não tinha percebido que apenas a primeira importação estava funcionando e estava tentando todo tipo de método para criar as entidades. Eu não tinha ideia do que estava acontecendo desde que eu era capaz de criar todos os campos, exceto as imagens!
22415 PatrickS

11
O new stdClass()comentário me enganou um pouco, supondo que eu pudesse atribuir um objeto de arquivo recém-criado a um campo diretamente. Ao usar isso, verifique se o arquivo foi atribuído com fid (ou seja, ele foi salvo pelo menos uma vez), caso contrário, isso não funcionará.
Neograph734

Como você aplicaria isso a vários campos de arquivo? Eu acho que deveria ser algo assim, $wrapper->field_photo[]->file->set($file)mas não tenho certeza. Você já enfrentou essa situação?
Miquel Correa Casablanca

5

Meu nó já existia e eu tive que definir os seguintes parâmetros:

$wrapper->field_pdf->set(array('fid'=>$fid, 'display'=>1, 'description'=>'This is a PDF'));

Diferentes configurações podem exigir parâmetros diferentes, suponho. Se você procurar em seus logs de erro (admin / reports / dblog), poderá ver quais parâmetros são necessários.


11
Isso funcionou para mim. Eu poderia adicionar o campo de arquivo nenhum problema, mas não iria mostrar como displayfoi 0por algum motivo.
aross

0

Apenas no caso de alguém achar isso útil:

Se você não possui um identificador de arquivo real e sabe apenas o fidque pode usar:

$wrapper->field_file->set( array( 'fid'=>1234 ) );

E (supondo que exista um arquivo com esse fid), o Drupal anexará o arquivo correto $wrapper->save().


Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.