Cómo establecer el valor del campo de archivo con entity_metadata_wrapper

24

¿Cómo se configura el valor de un campo de archivo cuando se utiliza entity_metadata_wrapper?

He intentado hacer esto en 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);

Pero me sale esta excepción:

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

Cualquier ayuda es muy apreciada por Mych.

Smos
fuente

Respuestas:

14

Ajustar la matriz de archivos en otra matriz parece hacer el truco para mí:

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

Pero aún no he descubierto por qué ...

Clive
fuente
Eso sí hace el truco. Muchas gracias por su ayuda, ¡lo aprecio!
Smos
55
Creo que tiene algo que ver con el índice delta del campo. Si no asigna un índice delta a su campo (es decir, $ ewrapper-> field_name-> set ();), debe ajustar otra matriz a su alrededor. Si asigna un índice delta a su campo (es decir, $ ewrapper-> field_name [0] -> set ();), puede usar $ file = (array) $ file.
Smos
Sí, eso tiene mucho sentido, gracias por seguir
Clive
19

Bueno, acabo de descubrir una forma más simple y menos fea de configurar la imagen .

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

Al igual que la referencia de taxonomía o nodo / entidad, el nombre del campo de archivo apunta a un objeto cargado, así es como me entero.


:: EDITAR a posteriori ::

Aquí cómo lo hubiera hecho con la pregunta 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();
Juda, sacerdote
fuente
Error grave: Llamar a un conjunto de funciones miembro () en nulo ... Puedo agregar algunos campos de texto, pero agregar un archivo simplemente no funciona
PatrickS
@PatrickS ¿Estás seguro de haber creado un objeto de archivo? ¿Incluso el método de Clive no funcionó?
JudaPriest
Estoy intentando migrar parte del contenido de Joomla a Drupal. La primera vez que migro los archivos, funciona. Si borro todos los Productos e intento otra migración, ya no funciona. La única forma de hacerlo funcionar es desde una nueva instalación. He almacenado los datos de Joomla en un archivo JSON, que utilizo para crear las entidades. En el momento en que dejé el comentario, aún no me había dado cuenta de que solo la primera importación estaba funcionando y estaba probando todo tipo de métodos para crear las entidades. ¡No tenía idea de lo que estaba sucediendo ya que podía crear todos los campos, excepto las imágenes!
PatrickS
1
El new stdClass()comentario me confunde un poco, suponiendo que pueda asignar un objeto de archivo recién creado a un campo directamente. Al usar esto, asegúrese de que el archivo tenga un fid asignado (es decir, se ha guardado al menos una vez), de lo contrario, esto no funcionará.
Neograph734
¿Cómo aplicarías esto para el campo de múltiples archivos? Creo que debería ser algo así, $wrapper->field_photo[]->file->set($file)pero no estoy seguro. ¿Alguna vez has enfrentado esta situación?
Miquel Correa Casablanca
5

Mi nodo ya existía y tuve que establecer los siguientes parámetros:

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

Diferentes configuraciones pueden requerir diferentes parámetros, supongo. Si mira en sus registros de errores (admin / reports / dblog) puede ver qué parámetros son necesarios.

Gillarf
fuente
1
Esto funcionó para mí. Podría agregar el campo de archivo sin problemas, pero no se mostraría como displayestaba 0por alguna razón.
Aross
0

Por si alguien lo encontraría útil:

Si no tiene un identificador de archivo real y solo conoce el fidque puede usar:

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

Y (suponiendo que exista un archivo con ese fid) Drupal adjuntará el archivo correcto $wrapper->save().

reor
fuente