Come impostare il valore del campo file con entity_metadata_wrapper


24

Come si imposta il valore di un campo file quando si utilizza entity_metadata_wrapper?

Ho provato a farlo nel codice:

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

Ma ottengo questa eccezione:

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

Qualsiasi aiuto è molto apprezzato.

Risposte:


14

Avvolgere l'array di file in un altro array sembra fare il trucco per me:

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

Ma non ho ancora scoperto perché ...


Questo fa davvero il trucco. Grazie mille per il tuo aiuto, lo apprezzo!
Smos,

5
Credo che abbia qualcosa a che fare con l'indice delta del campo. Se non assegni un indice delta al tuo campo (es. $ Ewrapper-> field_name-> set ();), devi avvolgerne un altro array attorno. Se assegni un indice delta al tuo campo (es. $ Ewrapper-> field_name [0] -> set ();), puoi semplicemente usare $ file = (array) $ file.
Smos,

Sì, ha molto senso, grazie per il seguito
Clive

19

Bene, ho appena scoperto un modo più semplice e meno brutto per impostare l'immagine .

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

Proprio come la tassonomia o il riferimento nodo / entità, il nome del campo file punta su un oggetto caricato, ecco come lo scopro.


:: EDIT a posteriori ::

Ecco come lo avrei fatto con la domanda 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();

Errore irreversibile: chiamata a un set di funzioni membro () su null ... Sono in grado di aggiungere alcuni campi di testo, ma l'aggiunta di un file non funziona
PatrickS

@PatrickS Sei sicuro di aver creato un oggetto file? Anche il metodo di Clive non ha funzionato?
JudaPriest,

Sto tentando di migrare alcuni contenuti di Joomla in Drupal. La prima volta che migra i file, funziona. Se cancello tutti i Prodotti e provo un'altra migrazione, non funziona più. L'unico modo per farlo funzionare è da una nuova installazione. Ho archiviato i dati di Joomla in un file JSON, che utilizzo per creare le entità. Al momento in cui ho lasciato il commento, non mi ero ancora reso conto che funzionava solo la prima importazione e stavo provando tutti i metodi per creare le entità. Non avevo idea di cosa stesse succedendo da quando sono stato in grado di creare tutti i campi, tranne le immagini!
PatrickS,

1
Il new stdClass()commento mi fuorvia un po ', supponendo che potrei assegnare direttamente un oggetto file appena creato a un campo. Quando lo usi, assicurati che al file sia assegnato un fid (cioè che sia stato salvato almeno una volta), altrimenti non funzionerà.
Neograph734

Come applicheresti questo per più campi di file? Penso che dovrebbe essere qualcosa di simile $wrapper->field_photo[]->file->set($file)ma non sono sicuro. Hai mai affrontato questa situazione?
Miquel Correa Casablanca,

5

Il mio nodo esisteva già e ho dovuto impostare i seguenti parametri:

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

Supposizioni diverse potrebbero richiedere parametri diversi. Se guardi nei tuoi log degli errori (admin / reports / dblog) puoi vedere quali parametri sono necessari.


1
Questo ha funzionato per me. Potrei aggiungere il campo del file senza problemi, ma non mostrerebbe come displayera 0per qualche motivo.
circa

0

Nel caso qualcuno lo trovasse utile:

Se non hai un vero handle di file e sai solo fidche puoi usare:

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

E (supponendo che esista un file con quel fid) Drupal allega il file corretto $wrapper->save().


Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.