Sprawdź, czy pole jest puste

18

Jak sprawdzić, czy pole jest puste, gdy masz obiekt $ node ?.

Znalazłem to jako możliwe rozwiązanie:

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

Mogę teraz sprawdzić:

UPDATE .Ups! To nie jest wiarygodne, chociaż obiecuję, że zadziałało dla mnie wczoraj.

isset($field);

ale zastanawiam się, czy jest lepszy sposób.

Oświeć mnie

corbacho
źródło

Odpowiedzi:

30

Po przeczytaniu dokumentacji funkcja zwraca, FALSEjeśli nie ma danych. isset()naprawdę by się nie powiodło, ponieważ przypisujesz FALSEzmienną, więc została ustawiona na coś. Prawidłowa składnia to:

$field = field_get_items('node', $node, 'field_post_image');
if ($field) {
   //Do something with the field
}
else{
   //There are no results
}
Sam152
źródło
Wydaje się, że to najlepszy sposób. Jeśli jest pusty, zwraca FAŁSZ, a jeśli ma jakieś dane, zwraca tablicę, więc nie ma obaw, że $ field będzie oceniać na FAŁSZ w przypadku pól liczbowych 0 itd.
corbacho
Nie działało to dla mnie, ponieważ zwróciło wartość domyślną, gdy nic nie zostało ustawione.
rzeka
@ Sam152 Thanks! Działa to świetnie, gdy jestem zalogowany, ale kiedy jestem wylogowany, nic nie pokazuje. Czy istnieje ku temu powód i jakieś rozwiązanie?
Dan
Cześć Dan. Zalogowanie nie powinno mieć wpływu na powyższy kod. Być może używasz devel do debugowania zmiennej i anon użytkownicy nie mają „dostępu do informacji dla programistów”?
Sam152
Jest to zły sposób sprawdzania, czy pole jest puste, powinieneś zastosować podejście opisane w wywołaniu hook_field_is_empty zdefiniowanego przez moduł implementujący pole, patrz post przez kiamlaluno.
lslinnet,
8

Możesz użyć następującego fragmentu kodu, aby sprawdzić, czy pole jest puste.

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

Ten kod jest bezpieczniejszy, ponieważ różne pola są uważane za puste w różnych warunkach. Zobacz na przykład różnicę między file_field_is_empty () , number_field_is_empty () i taxonomy_field_is_empty () : taxonomy_field_is_empty()sprawdza właściwość tid$item parametru, a jednocześnie number_field_is_empty()sprawdza wartość właściwości tego samego parametru. Pola niestandardowe mogą wymagać weryfikacji bardziej złożonego warunku, aby uznać pole za puste.

Opis funkcji hook_field_is_empty () podany w dokumentacji jest następujący:

Zdefiniuj, co stanowi pusty element dla typu pola.

kiamlaluno
źródło
Doceniam tę odpowiedź, ale hook_field_is_empty () wydaje się iść bardzo daleko. Chcę wiedzieć, czy pole jest naprawdę puste. Na przykład number_field_is_empty uważa, że ​​0 jest również puste. Testuję również, że nie można zastosować tej funkcji bezpośrednio, jeśli pole ma wiele wartości.
corbacho
1
To właśnie robi empty (), gdy przekazujesz mu zmienną zawierającą 0 lub ciąg „0”; być może pole używa wartości, gdy jest puste, a wywołanie hook_field_is_empty () jest jedynym sposobem, aby dowiedzieć się, czy pole jest puste.
kiamlaluno
Tam jest pomyłka. Powinna być funkcja $ ($ wartość [0], $ info); Zobacz api.drupal.org/api/drupal/modules!field!field.api.php/function/…
volocuga
2

Znaleźliśmy surową wartość w ( $content['field_name']['#items'][0][value]), dzięki czemu możesz określić, czy pole jest puste, czy nie za pomocą wyrażenia

(! empty ($ content ['field_name'] ['# items'] [0] [wartość]))

gdzie field_nameodpowiada nazwie żądanego pola.

eduardocs
źródło
Nie. Klucz „wartość” to tylko nazwa kolumny db. Może być różny w zależności od typu pola. Myślę, że najlepszym sposobem - sprawdź hook_field_is_empty () (który jest wymagany), jak zaproponowano powyżej
volocuga,
1

Drupal 8

Jeśli ktoś potrzebuje tej samej odpowiedzi w D8, to właśnie robię, aby przetestować moje pole:

if ($entity->hasField('field_event_date_start')
  && !$entity->get('field_event_date_start')->isEmpty()) {
  // Do something ...
}
Pauleau
źródło