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

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
}

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.


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.


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