Cara mengatur nilai bidang file dengan entity_metadata_wrapper

24

Bagaimana Anda mengatur nilai bidang file saat menggunakan entitas_metadata_wrapper?

Saya sudah mencoba melakukan ini dalam kode:

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

Tapi saya mendapatkan pengecualian ini:

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

Setiap bantuan sangat dihargai.

Smos
sumber

Jawaban:

14

Membungkus array file dalam array lain tampaknya membantu saya:

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

Tapi saya belum tahu kenapa ...

Clive
sumber
Itu memang berhasil. Terima kasih banyak atas bantuan Anda, hargai itu!
Smos
5
Saya percaya itu ada hubungannya dengan indeks delta lapangan. Jika Anda tidak menetapkan indeks delta ke bidang Anda (yaitu $ ewrapper-> field_name-> set ();), Anda harus membungkus array lain di sekitarnya. Jika Anda menetapkan indeks delta ke bidang Anda (yaitu $ ewrapper-> field_name [0] -> set ();), Anda bisa menggunakan $ file = (array) $ file.
Smos
Ya itu masuk akal, terima kasih sudah menindaklanjuti
Clive
19

Yah saya baru saja menemukan cara yang lebih sederhana dan tidak jelek untuk mengatur gambar .

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

Sama seperti taksonomi atau referensi simpul / entitas, nama bidang file menunjuk pada objek yang dimuat, begitulah cara saya mengetahuinya.


:: EDIT a posteriori ::

Di sini bagaimana saya akan melakukannya dengan pertanyaan 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
sumber
Kesalahan fatal: Memanggil ke set fungsi anggota () pada nol ... Saya dapat menambahkan beberapa bidang teks, tetapi menambahkan file tidak berfungsi
PatrickS
@Patrick Anda yakin membuat objek file? Bahkan metode dari Clive tidak berhasil?
JudaPriest
Saya mencoba memigrasikan beberapa konten Joomla ke Drupal. Pertama kali saya memigrasikan file, itu berhasil. Jika saya menghapus semua Produk dan mencoba migrasi lain, itu tidak berfungsi lagi. Satu-satunya cara saya membuatnya bekerja adalah dari instalasi baru. Saya telah menyimpan data Joomla dalam file JSON, yang saya gunakan untuk membuat entitas. Pada saat saya meninggalkan komentar, saya belum menyadari bahwa hanya impor pertama yang berfungsi & saya sedang mencoba segala macam metode untuk membuat entitas. Saya tidak tahu apa yang sedang terjadi karena saya bisa membuat semua bidang, kecuali gambar!
PatrickS
1
The new stdClass()komentar menyesatkan saya sedikit, dengan asumsi saya bisa menetapkan objek file yang baru dibuat ke lapangan secara langsung. Saat menggunakan ini, pastikan file memiliki fid yang ditetapkan (yaitu telah disimpan setidaknya sekali), jika tidak ini tidak akan berfungsi.
Neograph734
Bagaimana Anda menerapkan ini untuk beberapa bidang file? Saya pikir itu harus seperti $wrapper->field_photo[]->file->set($file)tapi saya tidak yakin. Pernahkah Anda menghadapi situasi ini?
Miquel Correa Casablanca
5

Node saya sudah ada dan saya harus mengatur parameter berikut:

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

Pengaturan yang berbeda mungkin memerlukan parameter yang berbeda kurasa. Jika Anda melihat log kesalahan Anda (admin / laporan / dblog) Anda dapat melihat parameter apa yang diperlukan.

insang
sumber
1
Ini berhasil untuk saya. Aku bisa menambahkan bidang berkas tidak ada masalah, tapi itu tidak akan menunjukkan sebagai displayadalah 0untuk beberapa alasan.
aross
0

Untuk berjaga-jaga kalau ada yang menemukan ini membantu:

Jika Anda tidak memiliki pegangan file yang sebenarnya dan hanya tahu fidAnda dapat menggunakan:

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

Dan (dengan asumsi file dengan fid itu ada) Drupal akan melampirkan file yang benar $wrapper->save().

reor
sumber