Periksa apakah suatu bidang kosong

18

Bagaimana Anda memeriksa bahwa suatu bidang kosong, ketika Anda memiliki objek $ node?

Saya menemukan ini sebagai solusi yang mungkin:

$field = field_get_items('node', $node, 'field_post_image');

Saya dapat memeriksa sekarang:

UPDATE .Ups! Ini tidak dapat diandalkan, meskipun saya berjanji itu bekerja untuk saya kemarin.

isset($field);

tapi saya ingin tahu apakah ada cara yang lebih baik.

Cerahkan saya

corbacho
sumber

Jawaban:

30

Jika Anda membaca dokumentasi , fungsi akan kembali FALSEjika tidak ada data. isset()sebenarnya akan gagal karena Anda menugaskan FALSEke variabel sehingga sebenarnya telah diatur ke sesuatu. Sintaks yang benar adalah:

$field = field_get_items('node', $node, 'field_post_image');
if ($field) {
   //Do something with the field
}
else{
   //There are no results
}
Sam152
sumber
Sepertinya ini adalah cara terbaik. Jika kosong akan mengembalikan FALSE, jika memiliki data apa pun, ia akan mengembalikan array, jadi tidak ada kekhawatiran bahwa $ field mengevaluasi ke FALSE dalam kasus bidang angka 0, dll.
corbacho
Ini tidak berfungsi untuk saya karena mengembalikan nilai default ketika tidak ada yang ditetapkan.
sungai
@ Sam152 Terima kasih! Ini bekerja dengan baik ketika saya masuk, tetapi ketika saya keluar tidak menunjukkan apa-apa. Apakah ada alasan untuk itu dan solusi apa pun?
Dan
Hai Dan. Masuk log seharusnya tidak berdampak pada kode di atas. Mungkin Anda menggunakan devel untuk men-debug variabel dan setiap pengguna tidak memiliki "akses informasi pengembang"?
Sam152
Ini adalah cara yang salah untuk memeriksa apakah suatu bidang kosong, Anda harus menggunakan pendekatan yang dijelaskan dengan memanggil hook_field_is_empty yang didefinisikan oleh modul yang mengimplementasikan bidang tersebut, lihat posting oleh kiamlaluno.
lslinnet
8

Anda dapat menggunakan potongan berikut untuk memverifikasi jika bidang kosong.

$info = field_info_field($field_name);
$function = $info['module'] . '_field_is_empty';

if (function_exists($function)) {
  $value = field_get_items('node', $node, $field_name);
  $is_empty = $function($value[0], $info);
}

Kode ini lebih aman, karena bidang yang berbeda dianggap kosong dalam kondisi yang berbeda. Lihat, misalnya, perbedaan antara file_field_is_empty () , number_field_is_empty () , dan taxonomy_field_is_empty () : taxonomy_field_is_empty()memeriksa properti tid dari $itemparameter, sementara number_field_is_empty()memeriksa properti nilai parameter yang sama. Bidang khusus dapat membutuhkan kondisi yang lebih rumit untuk diverifikasi, agar bidang tersebut kosong.

Deskripsi untuk hook_field_is_empty () yang diberikan dalam dokumentasi adalah sebagai berikut:

Tentukan apa yang merupakan item kosong untuk tipe bidang.

kiamlaluno
sumber
Saya menghargai jawaban ini, tetapi hook_field_is_empty () tampaknya berjalan sangat jauh. Saya ingin tahu apakah bidangnya benar-benar kosong. Misalnya number_field_is_empty menganggap 0 juga kosong. Saya juga menguji bahwa Anda tidak dapat menerapkan fungsi ini secara langsung jika bidang bernilai multi.
corbacho
1
Itu adalah apa yang kosong () ketika Anda memberikan variabel yang berisi 0, atau string "0"; bisa jadi lapangan menggunakan nilai saat kosong, dan menggunakan hook_field_is_empty () adalah satu-satunya cara untuk mengetahui apakah bidang tersebut kosong.
kiamlaluno
Ada kesalahan. Seharusnya $ function ($ value [0], $ info); Lihat api.drupal.org/api/drupal/modules!field!field.api.php/function/…
volocuga
2

Kami menemukan nilai mentah di ( $content['field_name']['#items'][0][value]), sehingga Anda dapat menentukan apakah bidang kosong atau tidak dengan ekspresi

(! kosong ($ content ['field_name'] ['# items'] [0] [value]))

di mana field_namecocok dengan nama bidang yang diinginkan.

eduardocs
sumber
Tidak. Kunci "value" hanyalah nama kolom db. Ini bisa berbeda tergantung pada jenis bidang. Saya pikir cara terbaik - periksa hook_field_is_empty () (yang diperlukan) seperti yang diusulkan di atas
volocuga
1

Drupal 8

Jika seseorang membutuhkan jawaban yang sama di D8, itulah yang saya lakukan untuk menguji bidang saya:

if ($entity->hasField('field_event_date_start')
  && !$entity->get('field_event_date_start')->isEmpty()) {
  // Do something ...
}
Pauleau
sumber