Bir alanın boş olup olmadığını kontrol edin


18

$ Node nesnesine sahip olduğunuzda bir alanın boş olup olmadığını nasıl kontrol edersiniz ?.

Bunu olası bir çözüm olarak buldum:

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

Şimdi kontrol edebilirim:

GÜNCELLEME .Ups! Bu güvenilir değil, dün benim için çalışacağına söz veriyorum.

isset($field);

ama daha iyi bir yol olup olmadığını merak ediyorum.

Beni aydınlat

Yanıtlar:


30

Belgeleri okursanız FALSE, veri yoksa işlev geri döner . değişkene isset()atadığınız FALSEiçin aslında başarısız olur , böylece aslında bir şeye ayarlanmıştır. Doğru sözdizimi şöyle olur:

$field = field_get_items('node', $node, 'field_post_image');
if ($field) {
   //Do something with the field
}
else{
   //There are no results
}

Bu en iyi yol gibi görünüyor. Boşsa FALSE değerini döndürür, herhangi bir veri varsa bir dizi döndürür, bu nedenle 0 alanının vb.
Olması

Hiçbir şey ayarlanmadığında varsayılan değeri döndürdüğü için bu benim için çalışmadı.
nehir

@ Sam152 Teşekkürler! Bu, giriş yaptığımda harika çalıştı, ancak çıkış yaptığımda hiçbir şey göstermiyor. Bunun ve herhangi bir çözümün bir nedeni var mı?
Dan

Merhaba Dan. Giriş yapmanın yukarıdaki kod üzerinde herhangi bir etkisi olmamalıdır. Belki bir değişkeni ayıklamak için devel kullanıyorsunuz ve anon kullanıcılarının "geliştirici bilgilerine erişme" özelliği yok?
Sam152

Bu, bir alanın boş olup olmadığını kontrol etmenin yanlış yoludur, alanı uygulayan modül tarafından tanımlanan hook_field_is_empty'yi çağırmakla açıklanan yaklaşımı kullanmalısınız, kiamlaluno'nun yazısına bakın.
lslinnet

8

Bir alanın boş olup olmadığını doğrulamak için aşağıdaki snippet'i kullanabilirsiniz.

$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);
}

Farklı koşullar altında farklı alanlar boş kabul edildiğinden bu kod daha güvenlidir. Bakınız, örneğin, arasındaki fark file_field_is_empty () , number_field_is_empty () , ve taxonomy_field_is_empty () : taxonomy_field_is_empty()kontrol TID malı $itemparametresi ise number_field_is_empty()çek değeri aynı parametre özelliği. Özel alanlar, alanı boş olarak değerlendirmek için daha karmaşık bir durumun doğrulanmasını gerektirebilir.

Belgelerde verilen hook_field_is_empty () açıklaması şu şekildedir:

Alan türü için neyin boş bir öğe oluşturduğunu tanımlayın.


Bu cevabı takdir ediyorum, ancak hook_field_is_empty () çok ileri gidiyor gibi görünüyor. Alanın gerçekten boş olup olmadığını bilmek istiyorum. Örneğin number_field_is_empty, 0'ın da boş olduğunu düşünür. Ayrıca alan çok değerli ise bu işlevi doğrudan uygulayamayacağınızı test ederim.
corbacho

1
0 içeren bir değişkeni veya "0" dizesini ilettiğinizde empty () işlevi budur; alan boş olduğunda bir değer kullanıyor olabilir ve alanın boş olup olmadığını bilmenin tek yolu hook_field_is_empty () öğesini çağırmak olabilir.
kiamlaluno

Bir hata var. $ İşlevi ($ değeri [0], $ info) olmalıdır; Bkz. Api.drupal.org/api/drupal/modules!field!field.api.php/function/…
volocuga

2

Ham değeri ( $content['field_name']['#items'][0][value]) içinde bulduk , böylece alanın ifadeyle boş olup olmadığını belirleyebilirsiniz.

(! Empty ($ içerik [ 'alan_adı'] [ '# öğe'] [0] [değer]))

burada field_nameistenen alanın adıyla eşleşir.


Hayır. "Değer" anahtarı yalnızca bir db sütun adıdır. Alan türüne bağlı olarak farklı olabilir. Bence en iyi yol - yukarıda önerildiği gibi hook_field_is_empty () (gerekli) kontrol edin
volocuga

1

Drupal 8

Birisi D8'de aynı cevaba ihtiyaç duyarsa, alanımı test etmek için yaptığım şey budur:

if ($entity->hasField('field_event_date_start')
  && !$entity->get('field_event_date_start')->isEmpty()) {
  // Do something ...
}
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.