Apa tujuan dari fungsi entity_metadata_wrapper (), dan mengapa saya harus menggunakannya?

23

Saya sepertinya sedang mengembangkan add-on untuk banyak modul yang menggunakan API Entity saat ini, dan entity_metadata_wrapper()fungsinya terus bermunculan.

The halaman docs mengatakan ini tentang hal itu:

Mengembalikan pembungkus properti untuk data yang diberikan.

Jika suatu entitas terbungkus, pembungkus dapat digunakan untuk mengambil pembungkus lebih lanjut untuk properti entitity.

Mengabaikan ejaan Freudian yang luar biasa dari kata 'entitas' di sana, saya tidak benar-benar mengerti apa tujuan dari pembungkus ini.

Saya mengerti bahwa fungsi dasarnya mengembalikan EntityDrupalWrapperkelas:

Wrapper memudahkan menerapkan callback pengambil dan penyetel properti entitas

Tetapi yang tidak saya mengerti adalah bagaimana hal itu membuat segalanya menjadi lebih mudah.

Sebagai contoh, untuk memperbarui properti status dari sebuah node saya dapat menggunakan kode ini:

$node = node_load($nid);
$node->status = 1;
node_save($node);

Cukup bersih. Seperti yang saya pahami (tapi mungkin salah) menggunakan kode yang setara entity_metadata_wrapper()akan lebih verbose dari itu.

Saya tidak yakin apakah itu hanya penggunaan istilah 'pembungkus' yang membuat saya tersandung di sini, tetapi saya telah melihat kode dalam modul Entity juga dan saya tidak benar-benar lebih dekat untuk memahaminya.

Adakah yang bisa menjelaskan apa manfaat dari menggunakan fungsi ini, dan mungkin memberikan contoh kode sederhana untuk kasus penggunaan umum?

Clive
sumber
Ini dapat menambah pemahaman yang lebih dalam pada entitas api dan pembungkus. Ini adalah pembicaraan oleh Fago, pria Entitas. wolfgangziegler.net/drupalcon-denver
Ken
Terima kasih, itu kedengarannya sangat berguna dari pembukaan gambit. Saya akan memeriksanya ketika saya punya waktu
Clive
"Video itu telah dihapus dari blip" tetapi salindia masih mengunduh.
artfulrobot

Jawaban:

23

Ya, mengubah status suatu simpul itu sepele, karena itu adalah properti yang dikodekan dengan keras.

Bidang di sisi lain, jauh lebih rumit. Mereka bersarang tiga level, sementara ada field_get_items () untuk mendapatkannya dalam bahasa yang benar, tidak ada fungsi seperti itu untuk menetapkan nilai-nilai bidang. Jadi, Anda selalu perlu memeriksa apakah bidang diterjemahkan atau tidak dan Anda perlu tahu properti mana yang persis berisi nilai yang Anda cari / ingin atur.

Dua contoh, yang menunjukkan apa yang dapat dilakukan pembungkus entitas:

  • Baris berikut menambahkan item baris komersial ke pesanan, mengurus bahasa dan properti aktual yang menyimpan id referensi, diambil dari jawaban berikut /drupal//a/23513/31

    $order_wrapper->commerce_line_items[] = $line_item;
  • Dengan cara yang sama, dapat secara langsung mengakses nilai suatu bidang, tanpa harus memeriksa bahasa, atau delta, bahkan dapat secara langsung mengakses entitas yang direferensikan, yang diambil dari /drupal//a/ 33010/31

    $subnode = entity_metadata_wrapper('node', $node)->field_subnode->value();
    $default = $subnode->title;

Entitas pembungkus adalah kekuatan pendorong di belakang modul yang fleksibel dan kuat seperti API Pencarian dan Aturan karena memungkinkan mereka untuk bekerja dengan berbagai tingkat referensi, sehingga Anda dapat misalnya mengakses bidang produk yang dibeli pengguna dalam suatu pesanan dengan sesuatu seperti [commerce-order:commerce-line-items:0:commerce-product:some-field](mungkin sebenarnya tidak benar, tetapi sesuatu seperti itu), atau menambahkan ringkasan tubuh dari simpul yang direferensikan ke indeks pencarian Anda.

Yang mengatakan, saya tidak perlu menyukai API sebenarnya dari pembungkus, itu array internal yang sangat besar dan bahwa bahkan sifat sederhana lagi kelas pembungkus. Saya berharap bahwa sistem entitas yang ditingkatkan (dan mudah-mudahan bidang) di Drupal 8 akan menghilangkan kebutuhan untuk pembungkus seperti itu karena memiliki entitas yang diklasifikasi.

Berdir
sumber
Cemerlang, aku tahu aku baru saja melewatkan sesuatu dengan ini. Saya pikir itu adalah deskripsi EntityDrupalWrapperyang menyebabkan kebingungan; ketika disebutkan 'properti' saya tidak menyadari bidang terlibat sama sekali, saya hanya berpikir itu secara harfiah berarti kelas mengurus properti (nid, status, dll). Terima kasih atas penjelasannya, mengetahui bahwa modul Rules menggunakannya untuk pemilih data membuatnya lebih masuk akal
Clive
@Berdir "Saya tidak perlu menyukai API pembungkus yang sebenarnya ..." Saya memiliki perasaan yang sama seperti Anda. Apakah Anda melakukan sesuatu untuk melawan ini? Apakah Anda menggunakan field_view_value () untuk melihat nilai? Bagaimana Anda akan merekomendasikan nilai pengaturan di callback kustom untuk alur kerja kustom atau dasbor?
Charlie Schliesser