Comment définir la valeur du champ de fichier avec entity_metadata_wrapper

24

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.

Smos
la source

Réponses:

14

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

Clive
la source
Cela fait effectivement l'affaire. Merci beaucoup pour votre aide, appréciez-la!
Smos
5
Je crois que cela a quelque chose à voir avec l'indice delta du champ. Si vous n'affectez pas d'index delta à votre champ (c'est-à-dire $ ewrapper-> field_name-> set ();), vous devez envelopper un autre tableau autour de lui. Si vous attribuez un index delta à votre champ (c'est-à-dire $ ewrapper-> field_name [0] -> set ();), vous pouvez simplement utiliser $ file = (array) $ file.
Smos
Oui, cela a beaucoup de sens, merci pour le suivi
Clive
19

Eh bien, je viens de découvrir un moyen plus simple et moins laid de définir l'image .

$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 comme ça 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();
JudaPriest
la source
Erreur fatale: appel à une fonction membre set () sur null ... Je suis capable d'ajouter des champs de texte, mais l'ajout d'un fichier ne fonctionne tout simplement pas
PatrickS
@PatrickS Vous êtes sûr d'avoir créé un objet fichier? Même la méthode de Clive n'a pas fonctionné?
JudaPriest
J'essaie de migrer du contenu Joomla vers Drupal. La première fois que je migre les fichiers, cela fonctionne. Si j'efface tous les produits et tente une autre migration, cela ne fonctionnera plus. La seule façon de le faire fonctionner est à partir d'une nouvelle installation. J'ai stocké les données Joomla dans un fichier JSON, que j'utilise pour créer les entités. Au moment où j'ai laissé le commentaire, je n'avais pas encore réalisé que seule la première importation fonctionnait et j'essayais toutes sortes de méthodes pour créer les entités. Je n'avais aucune idée de ce qui se passait puisque j'ai pu créer tous les champs, sauf les images!
PatrickS
1
Le new stdClass()commentaire m'a un peu induit en erreur, en supposant que je pouvais affecter directement un objet fichier nouvellement créé à un champ. Lorsque vous utilisez ceci, assurez-vous que le fichier a une assignation fid (c'est-à-dire qu'il a été enregistré au moins une fois), sinon cela ne fonctionnera pas.
Neograph734
Comment appliqueriez-vous cela pour plusieurs champs de fichiers? Je pense que cela devrait ressembler à quelque chose, $wrapper->field_photo[]->file->set($file)mais je ne suis pas sûr. Avez-vous déjà fait face à cette situation?
Miquel Correa Casablanca
5

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.

gillarf
la source
1
Cela a fonctionné pour moi. Je pourrais ajouter le champ de fichier sans problème, mais il ne serait pas montrer comme displayétait 0pour une raison quelconque.
aross
0

Juste au cas où quelqu'un trouverait cela utile:

Si vous n'avez pas de descripteur de fichier réel et que fidvous ne connaissez que celui 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 $wrapper->save().

réor
la source