So legen Sie den Wert des Dateifelds mit entity_metadata_wrapper fest

24

Wie legen Sie den Wert eines Dateifelds fest, wenn Sie den entity_metadata_wrapper verwenden?

Ich habe versucht, dies im Code zu tun:

$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);

Aber ich bekomme diese Ausnahme:

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

Jede Hilfe wird sehr geschätzt.

Smos
quelle

Antworten:

14

Das Umschließen des Dateifelds in ein anderes Feld scheint für mich das Richtige zu sein:

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

Aber ich habe noch nicht herausgefunden warum ...

Clive
quelle
Das ist in der Tat der Trick. Vielen Dank für Ihre Hilfe, danke!
Smos
5
Ich glaube, es hat etwas mit dem Delta-Index des Feldes zu tun. Wenn Sie Ihrem Feld keinen Delta-Index zuweisen (z. B. $ ewrapper-> field_name-> set ();), müssen Sie ein anderes Array darum wickeln. Wenn Sie Ihrem Feld einen Delta-Index zuweisen (zB $ ewrapper-> field_name [0] -> set ();), können Sie einfach $ file = (array) $ file verwenden.
Smos
Ja, das macht sehr viel Sinn, danke für die
Clive
19

Nun, ich habe gerade eine einfachere und weniger hässliche Methode gefunden, um ein Bild zu erstellen .

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

Genau wie Taxonomie oder Knoten- / Entitätsreferenz zeigt der Dateifeldname auf ein geladenes Objekt, wie ich herausfinde.


:: A posteriori bearbeiten ::

Hier wie ich es mit OP Frage gemacht hätte.

// 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
quelle
Schwerwiegender Fehler: Aufrufen einer Mitgliedsfunktion set () auf null ... Ich kann einige Textfelder hinzufügen, aber das Hinzufügen einer Datei funktioniert einfach nicht
PatrickS
@PatrickS Sind Sie sicher, dass Sie ein Dateiobjekt erstellt haben? Auch die Methode von Clive hat nicht funktioniert?
JudaPriest
Ich versuche, einige Joomla-Inhalte in Drupal zu migrieren. Das erste Mal, wenn ich die Dateien migriere, funktioniert es. Wenn ich alle Produkte lösche und eine weitere Migration versuche, funktioniert dies nicht mehr. Die einzige Möglichkeit, es zum Laufen zu bringen, ist eine Neuinstallation. Ich habe die Joomla-Daten in einer JSON-Datei gespeichert, mit der ich die Entitäten erstelle. Als ich den Kommentar hinterlassen habe, war mir noch nicht klar, dass nur der erste Import funktioniert und ich habe alle Arten von Methoden versucht, um die Entitäten zu erstellen. Ich hatte keine Ahnung, was los war, da ich alle Felder außer den Bildern erstellen konnte!
PatrickS
1
Der new stdClass()Kommentar führt mich ein wenig in die Irre, vorausgesetzt, ich könnte einem Feld direkt ein neu erstelltes Dateiobjekt zuweisen. Stellen Sie in diesem Fall sicher, dass der Datei eine FID zugewiesen wurde (dh sie wurde mindestens einmal gespeichert), da dies sonst nicht funktioniert.
Neograph734
Wie würden Sie dies für mehrere Dateifelder anwenden? Ich denke, es sollte so etwas sein, $wrapper->field_photo[]->file->set($file)aber ich bin mir nicht sicher. Hast du jemals mit dieser Situation konfrontiert?
Miquel Correa Casablanca
5

Mein Knoten existierte bereits und ich musste die folgenden Parameter einstellen:

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

Unterschiedliche Einstellungen können unterschiedliche Parameter erfordern, nehme ich an. Wenn Sie in Ihren Fehlerprotokollen (admin / reports / dblog) nachsehen, können Sie sehen, welche Parameter benötigt werden.

Gillarf
quelle
1
Das hat bei mir funktioniert. Ich könnte das Dateifeld problemlos hinzufügen, aber es würde nicht so angezeigt, wie displayes 0aus irgendeinem Grund war.
Am
0

Nur für den Fall, dass jemand dies hilfreich finden würde:

Wenn Sie kein tatsächliches Dateihandle haben und nur das kennen, das fidSie verwenden können:

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

Und (unter der Annahme, dass eine Datei mit dieser ID existiert) Drupal wird die richtige Datei anhängen $wrapper->save().

reor
quelle