Saya mengulangi melalui kumpulan bidang, dan membungkus item koleksi bidang dengan entitas_metadata_wrapper. Saya ingin memeriksa keberadaan field sebelum memanggil value
metodenya (yang menghasilkan kesalahan pada bidang yang tidak memiliki nilai), tetapi saya tidak dapat menemukan cara untuk melakukannya.
$field_collection_item = field_collection_item_load($id);
$item_wrapper = entity_metadata_wrapper('field_collection_item', $field_collection_item);
// this results in an error if the field_contrib_headshot field is empty
$headshot = $item_wrapper->field_contributor->field_contrib_headshot->value();
Solusi saya saat ini adalah menggunakan field_get_items
untuk melihat apakah bidang itu kosong, tetapi saya ingin dapat melakukan ini melalui pembungkus metadata jika memungkinkan.
Setiap kali ada referensi entitas atau koleksi bidang, isset () tidak pernah bekerja untuk saya. Apa yang tampaknya berfungsi saat kami memiliki referensi entitas sedang dilakukan:
sumber
Sepertinya Anda memiliki
entity_reference
tempat di sana karena metode chaining. Tapi, lihat metode __isset () untuk EntityStructureWrapper .Periksa seperti:
dan kemudian gunakan
IF
blok untuk melakukan logika Anda ...EDIT:
$has_headshot
sekarang cek valid yang diinginkan.sumber
__isset
bekerja sangat baik pada koleksi bidang, meskipun saya perlu menambahkan nama bidang lengkap:field_contrib_headshot
bukancontrib_headshot
field_contributor
sedang mereferensikan bidang lainfield_contrib_headshot
... Anda telah bersarang di sana. Saya berasumsi Anda menggunakan entitas_reference atau sesuatu yang lain seperti field_group untuk membuat sarang hal-hal ini ... itu saja yang saya maksud.$item_wrapper->field_contributor->__isset('field_contrib_headshot')
$has_headshot = isset($item_wrapper->field_contributor->field_contrib_headshot);
Bidang referensi entitas dan koleksi bidang
Disalin dan ditempel langsung dari http://dropbucket.org/node/1201 tetapi tampaknya menjadi contoh yang lebih baik daripada jawaban lain sejauh ini ...
sumber
Untuk EntityMetadataWrapper:
Jika Anda memiliki blok kode yang tidak berjalan atau jika Anda menjumpai kesalahan PHP, lihat beberapa contoh di bawah ini. Contoh ini menggunakan properti nid.
MUNGKIN SEMUA KESALAHAN
ATAU
ATAU
Anda mungkin menemukan bahwa menggunakan isset seperti itu dapat mengevaluasi true bahkan jika nid tidak ada. The -> getIdentifier (), atau -> value (), atau -> raw () dapat melempar pengecualian.
CERDAS SELALU BENAR
GUNAKAN BUKAN INI
sumber
Saya telah menemukan bahwa isset () tidak dapat digunakan pada hasil pemanggilan fungsi. Karena Boolean dikembalikan dengan pernyataan berikut, saya dapat memverifikasi bahwa elemen yang dibungkus ternyata memiliki nilai.
sumber
Orang sering keliru. Saat Anda memanggil isset pada pembungkus metadata entitas, Anda sedang memeriksa apakah bundel entitas mendukung properti itu. Ini tidak ada hubungannya dengan nilai aktual lapangan.
Sebenarnya tidak ada metode independen untuk memeriksa apakah suatu nilai ditetapkan. Anda hanya perlu mengevaluasi nilai () atau, lebih disukai, mentah (). (Anda juga dapat memanggil count () jika itu adalah bidang multi-nilai, tetapi raw () akan mengembalikan array kosong sehingga sebenarnya tidak diperlukan.)
Untuk mengulangi, raw () adalah nilai yang harus Anda gunakan untuk memeriksa apakah ada bidang. Ini dapat diandalkan dan murah secara komputasi.
sumber
Ini adalah fungsi pembantu pribadi saya untuk mendapatkan nilai dari referensi rantai entitas yang berpotensi tidak ditetapkan:
$ goity adalah entitas yang dibungkus, $ field_chain adalah array dari field_names seperti:
Anda juga dapat melakukan:
ini akan bekerja!
sumber