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.

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


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

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.


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


Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.