Memeriksa keberadaan suatu bidang pada suatu entitas_metadata_wrapper

22

Saya mengulangi melalui kumpulan bidang, dan membungkus item koleksi bidang dengan entitas_metadata_wrapper. Saya ingin memeriksa keberadaan field sebelum memanggil valuemetodenya (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_itemsuntuk melihat apakah bidang itu kosong, tetapi saya ingin dapat melakukan ini melalui pembungkus metadata jika memungkinkan.

Nick Tomlin
sumber

Jawaban:

26

Cukup panggil fungsi PHP isset():

$headshot = array();
if (isset($item_wrapper->field_contributor->field_contrib_headshot)) {
  $headshot = $item_wrapper->field_contributor->field_contrib_headshot->value();
}

EntityStructureWrapper mengimplementasikan __isset()fungsi sesuai dengan prinsip Overloading .

piouPiouM
sumber
Ya, ini selalu cara saya melakukannya, kurang terikat ke internal dan lebih mudah membaca IMO. Terpilih!
Cottser
9

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:

if($wrapped_entity->entity_reference_field->getIdentifier()) {
  // This code only fires if there is an entity reference or field collection set.
}
Atomox
sumber
Jawaban ini dan postingan berikut ini berfungsi untuk saya: dropbucket.org/node/1201
tyler.frankenstein
4

Sepertinya Anda memiliki entity_referencetempat di sana karena metode chaining. Tapi, lihat metode __isset () untuk EntityStructureWrapper .

Periksa seperti:

$has_headshot = $item_wrapper->field_contributor->__isset('field_contrib_headshot');

dan kemudian gunakan IFblok untuk melakukan logika Anda ...

EDIT:

$has_headshot sekarang cek valid yang diinginkan.

Tenken
sumber
Saya tidak yakin apa yang Anda maksud dengan "sepertinya Anda memiliki referensi entitas di suatu tempat", jika Anda dapat menjelaskan bahwa sedikit lebih saya akan menghargainya. __issetbekerja sangat baik pada koleksi bidang, meskipun saya perlu menambahkan nama bidang lengkap: field_contrib_headshotbukancontrib_headshot
Nick Tomlin
bidang adalah nilai; string, angka, apa pun. field_contributorsedang mereferensikan bidang lain field_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.
Tenken
potongan kode __isset () apa yang cocok untuk Anda?
Tenken
Itu:$item_wrapper->field_contributor->__isset('field_contrib_headshot')
Nick Tomlin
Rasanya aneh bagi saya untuk memanggil __isset () secara langsung, mengapa tidak: $has_headshot = isset($item_wrapper->field_contributor->field_contrib_headshot);
Cottser
1
$wrapper = entity_metadata_wrapper('node', 123);
if($wrapper->__isset('field_middle_name')) {
    // Do something awesome with the middle name.
} else {
    // Don't do anything awesome, they don't have a middle name.
}

Bidang referensi entitas dan koleksi bidang

// also check if there is an identifier, __isset alone is not enough!
if ($wrapper->__isset('field_project_number') && $wrapper->field_project_number->getIdentifier()) {
    $number =  $wrapper->field_project_number->field_project_number_complete->value();
    return $number;
}

Disalin dan ditempel langsung dari http://dropbucket.org/node/1201 tetapi tampaknya menjadi contoh yang lebih baik daripada jawaban lain sejauh ini ...

Felix Eve
sumber
1

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

if ($wrapper->__isset('nid')) {
  $var = $wrapper->nid->value();
}
else {
  // Do something it's FALSE;
}

ATAU

if ($wrapper->__isset('nid')) {
  $var = $wrapper->nid->getIdentifier();
}
else {
  // Do something it's FALSE;
}

ATAU

if ($wrapper->nid->value()) {
  // Do something it's TRUE.
}
else {
  // Do something it's FALSE;
}

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

if (isset($wrapper->nid)) {
  // Do something it must be TRUE....Ah Hem wait.. this runs every time.
}

GUNAKAN BUKAN INI

try {
  $var = $wrapper->nid->raw();
} 
catch (EntityMetadataWrapperException $e) {
  $var = FALSE;
}
daveferrara1
sumber
0

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.

if ( $wrapper->field_media_alternate[0]->value() ) {
  //...valid logic...
} else {
  //...not valid logic...
}
pisau
sumber
0

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

$w = entity_metadata_wrapper('node', $nid);
//Start by checking whether the node bundle supports field_entityref_myfield.
if (isset($w->field_entityref_myfield)) {
  //If we called value(), then that would cause the referenced entity
  //to be loaded, whereas raw() just gives us the entity_id if the value
  //is set, and Null if it isn't.
  if ($w->field_entityref_myfield->raw()) {
    //Do some things based on the entity-reference being set.
  } else {
    //Do some other things based on the entity-reference NOT being set.
  }
}

Untuk mengulangi, raw () adalah nilai yang harus Anda gunakan untuk memeriksa apakah ada bidang. Ini dapat diandalkan dan murah secara komputasi.

Scott Armstrong
sumber
0

Ini adalah fungsi pembantu pribadi saya untuk mendapatkan nilai dari referensi rantai entitas yang berpotensi tidak ditetapkan:

function _get_wrapped_value_ifset($wentity, $field_chain){
  $root = $wentity;
  try{
    foreach ( $field_chain as $field_name ) {
      $root = $root->{$field_name};
    }
    return $root->value();
  }
  catch (EntityMetadataWrapperException $e){
    return null;
  }
}

$ goity adalah entitas yang dibungkus, $ field_chain adalah array dari field_names seperti:

[
  'field_reference_from_the_wentity',
  'field_wanted_field_from_the_referenced_entity'
] 

Anda juga dapat melakukan:

[
  'field_reference_from_the_wentity', 
  'field_reference_from_the_referenced_entity',
  ... 
  'field_wanted_field_from_the_N_referenced_entity'
]

ini akan bekerja!

Thony
sumber