Comment définissez-vous la valeur d'un champ de fichier lorsque vous utilisez l'entité_metadata_wrapper?
J'ai essayé de faire cela dans le code:
$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);
Mais je reçois cette exception:
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).
Toute aide est très appréciée.
Envelopper le tableau de fichiers dans un autre tableau semble faire l'affaire pour moi:
$file = (array) $file;
$items = array($file);
$ewrapper->field_document->set($items);
Mais je n'ai pas encore découvert pourquoi encore ...
Eh bien, je viens de découvrir un moyen de recherche d'image plus simple et moins laid.
$image_file = A FILE OBJECT; //Lot of choices here : new stdClass(), file_load, etc
$wrapper->FIELD_NAME->file->set($image_file);
Tout comme la taxonomie ou la référence de nœud/entité, le nom du champ de fichier pointe sur un objet chargé, c'est ainsi que je le découvre.
:: MODIFIER a posteriori ::
Voici comment je l'aurais fait avec la question 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();
Mon nœud existait déjà et j'ai dû définir les paramètres suivants:
$wrapper->field_pdf->set(array('fid'=>$fid, 'display'=>1, 'description'=>'This is a PDF'));
Différentes configurations peuvent nécessiter des paramètres différents, je suppose. Si vous regardez dans vos journaux d'erreurs (admin/reports/dblog), vous pouvez voir quels paramètres sont nécessaires.
Juste au cas où quelqu'un trouverait cela utile:
Si vous n'avez pas de descripteur de fichier réel et ne connaissez que le fid
que vous pouvez utiliser:
$wrapper->field_file->set( array( 'fid'=>1234 ) );
Et (en supposant qu'un fichier avec ce fid existe) Drupal attachera le fichier correct sur $wrapper->save()
.
Vous avez deux façons de procéder:
// By loading the file object in any way
$file_obj = file_load($fid);
$w_containing_node->field_attachment_content->file->set( $file_obj );
// By passing an array with the fid
$w_containing_node->field_attachment_content->set( array('fid' => $fid) );
Voici la source des informations: https://www.drupal.org/docs/7/api/entity-api/entity-metadata-wrappers#example-value-set-save