Apa praktik terbaik saat bekerja dengan bahasa [und]?


51

Saya mulai menggunakan formulir ini untuk mengakses data dalam modul saya. (Lihat komentar # 1. )

$node->field_test[$node->language][0]['value']

Saya pikir itu tampak seperti solusi yang cukup bagus, tetapi lebih jauh ke bawah pertanyaan yang sama saya menemukan ini :

Jangan berasumsi bahwa 'und' adalah untuk bidang entitas tanpa bahasa, itu juga untuk bidang yang tidak dapat diterjemahkan, dan tanpa modul terjemahan entitas yang semuanya adalah bidang. Selain itu, ada perbedaan dalam hal ini antara berbagai versi 7.x Drupal.
Lebih baik menggunakan field_get_items()fungsi yang akan memilah-milah Anda di bawah kode bahasa apa data disimpan.

Dan sekarang saya tidak tahu apakah apa yang saya gunakan dapat memecah sesuatu di jalan.

Jawaban:


39

Saya menemukan bahwa menggunakan modul API Entitas sangat membantu dan juga membuat kode lebih mudah dibaca. Kode di atas tidak akan selalu berfungsi, karena bahasa simpul dan bahasa bidang bisa berbeda.

Dengan modul API entitas, dan pembungkusnya, Anda dapat menggunakan kode berikut:

 $node_wrapper = entity_metadata_wrapper('node', $node);
 $field_val = $node_wrapper->field_test->value();

Ini harus menjadi bukti peluru. Satu hal tentang menggunakan modul entitas adalah bahwa jika Anda mencoba mengakses bidang yang tidak ada, Anda akan mendapatkan kesalahan yang buruk dan pengecualian yang dilemparkan alih-alih pemberitahuan dan perilaku yang salah.

Untuk menghindari ini, Anda bisa mencoba / menangkap seperti ini

try {
  $field_val = $node_wrapper->field_doesnt_exist->value();
} catch (EntityMetadataWrapperException $e) {
  $field_val = 'default/fallback value';
}

Atau Anda dapat menggunakan isset()yang EntityMetadataWrappermenangani secara internal:

$field_val = 'default/fallback value';
if (isset($node_wrapper->field_doesnt_exist)) {
  $field_val = $node_wrapper->field_doesnt_exist->value();
}

Apakah fungsi ini entity_metadata_wrapper()sudah tidak digunakan lagi? Saya mencoba memanggil ini dalam modul saya, dan saya dapatkan Fatal error: Call to undefined function entity_metadata_wrapper()- Saya juga melakukan pencarian sumber pada instalasi Drupal 7.12 saya di Dreamweaver, dan muncul dengan 0 hasil di tempat lain dalam kode!
Aditya MP

1
aditya - ini ada dalam modul API Entitas - bukan inti.
lazysoundsystem

1
@adityamenon Seperti kata malas ini bukan inti ... namun, mungkin untuk Drupal 8. Entitas API setidaknya akan sangat meningkat. Sebenarnya tidak ada waktu untuk membuat semua API yang diperlukan untuk sistem entitas untuk Drupal 7, jadi itulah yang ingin dicapai oleh modul entitas API.
googletorp

Terima kasih teman-teman, saya bodoh untuk tidak membaca jawaban dengan benar dan mengikuti tautan ke halaman proyek API Entity :)
Aditya MP

1
Ketika saya melihat kode sumber untuk entity_metadata_wrapper dan mengikuti jejak kelinci melalui semua kelas yang dipakai dan diperluas untuk memberi saya manipulasi lapangan lebih mudah, saya bertanya-tanya apakah semua itu sepadan. Menambahkan 3k + baris kode lain ke bootstrap saya dan mengambil lebih banyak memori untuk menangani semua tugas variabel ... adakah yang lebih ringan? Sepertinya itu $node->field_name[LANGUAGE_NONE][0]['value'] = 'foo';benar-benar cara yang paling efisien.
Charlie Schliesser

19

Untuk membaca, Anda harus selalu dapat menggunakan field_get_items () , yang akan memilih bahasa yang tepat untuk Anda dan juga memeriksa apakah bidang tersebut memiliki nilai.

Sayangnya, API bidang sangat terbatas pada 7.x, tidak ada cara untuk mendapatkan mis. Item bidang pertama, bahkan tidak berani bertanya tentang mendapatkan nilai dengan panggilan fungsi tunggal ... Dan tidak ada field_set_items ( ) rekanan.

Jadi ya, modul entitas API memang menyediakan kelemahan pada API yang lebih baik dan juga dilengkapi dengan biaya overhead yang cukup besar (Ini pada dasarnya mengubah setiap nilai tunggal ke objek pembungkus yang memiliki banyak array info properti bersarang yang menyertainya). Mencoba untuk membuang pembungkus entitas biasanya tidak akan menghasilkan apa-apa atau dinding array yang tidak dapat dibaca.


1
Saya mendapat kesan dari apa yang Anda katakan bahwa hal semacam ini mungkin diperbaiki di Drupal 8? Jika demikian, bagaimana orang mencari tahu bagaimana hal-hal seperti ini berkembang? Selain halaman modul, Do seperti labirin bagiku! :)
Clive

1
Yah, selalu ada harapan :) Dan sulit untuk menjaga bahkan tinjauan tingkat tinggi dari apa yang terjadi di Drupal 8, salah satu caranya adalah dengan mengikuti inisiatif. Ini bukan target langsung dari arahan yang ada. Bagian dari modul API entitas dipindahkan / dipindahkan ke inti (Ada kelas Entity sekarang dan entitas yang ada dikonversi ke sistem baru). Jadi ada kemungkinan bahwa kita mis akan mendapatkan metode langsung pada kelas-kelas itu untuk menangani bidang. Untuk perubahan yang dilakukan, sumber yang baik adalah sistem catatan perubahan yang baru, lihat drupal.org/list-changes/drupal .
Berdir

Cemerlang, itu persis seperti yang saya cari terima kasih banyak! :) Saya harap Anda tidak keberatan dengan pertanyaan saya. Saya tahu ini bukan topik yang tepat untuk situs ini ... Saya ingin terlibat dalam berkontribusi pada core, tetapi karena tidak pernah benar-benar terlibat dalam open-source, saya menemukan semuanya. Agak menakutkan ... senang memiliki tempat yang bagus untuk memulai :)
Clive

Clive: Lihat drupalofficehours.org - ini tepatnya untuk membantu orang memulai dengan berkontribusi. Lebih banyak sumber daya di sana. Saya juga merekomendasikan untuk pergi ke pertemuan kelompok pengguna yang sering devs inti atau lebih mungkin DrupalCamp di mana satu atau dua dev inti. Temukan grup lokal Anda di groups.drupal.org dan Anda harus bisa menyelesaikannya. drupical.org juga bisa bermanfaat.
wizonesolutions

-2
$node = node_load($lot_id);
$field_language = field_language('node', $node, 'field_name');
$node->field_name[$field_language][0]['value'] = $custom_value;

Bisakah Anda menambahkan penjelasan singkat mengapa ini menjawab pertanyaan?
Radikal Gratis
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.