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.

Smos
fonte

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ê ...

Clive
fonte
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();
JudaPriest
fonte
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.

gillarf
fonte
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().

reor
fonte