Überprüfen Sie, ob ein Feld leer ist


18

Wie können Sie überprüfen, ob ein Feld leer ist, wenn Sie das $ node-Objekt haben?

Ich fand diese als mögliche Lösung:

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

Ich kann jetzt überprüfen:

UPDATE .Ups! Das ist nicht zuverlässig, obwohl ich verspreche, dass es gestern bei mir funktioniert hat.

isset($field);

aber ich frage mich, ob es einen besseren Weg gibt.

Kläre mich auf

Antworten:


30

Wenn Sie die Dokumentation gelesen haben, kehrt die Funktion zurück, FALSEwenn keine Daten vorhanden sind. isset()würde tatsächlich scheitern, weil Sie FALSEder Variablen zuweisen , sie wurde also tatsächlich auf etwas festgelegt. Die richtige Syntax wäre:

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

Das scheint der beste Weg zu sein. Wenn es leer ist, wird FALSE zurückgegeben, und wenn Daten vorhanden sind, wird ein Array zurückgegeben. Es besteht also keine Gefahr, dass $ field im Fall von
Zahlenfeldern

Dies hat bei mir nicht funktioniert, da der Standardwert zurückgegeben wurde, wenn nichts festgelegt wurde.
Fluss

@ Sam152 Danke! Dies hat gut funktioniert, wenn ich angemeldet war, aber wenn ich abgemeldet bin, wird nichts angezeigt. Gibt es einen Grund dafür und eine Lösung?
Dan

Hallo Dan. Das Einloggen sollte keinen Einfluss auf den obigen Code haben. Vielleicht verwenden Sie devel, um eine Variable zu debuggen und anon Benutzer haben keinen "Zugriff auf Entwicklerinformationen"?
Sam152

Dies ist die falsche Methode, um zu überprüfen, ob ein Feld leer ist. Sie sollten den Ansatz verwenden, der mit dem Aufruf von hook_field_is_empty beschrieben wurde, der vom Modul definiert wurde, das das Feld implementiert. Weitere Informationen finden Sie im Beitrag von kiamlaluno.
Islinnet

8

Sie können das folgende Snippet verwenden, um zu überprüfen, ob ein Feld leer ist.

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

Dieser Code ist sicherer, da verschiedene Felder unter verschiedenen Bedingungen als leer betrachtet werden. Siehe zum Beispiel den Unterschied zwischen file_field_is_empty () , number_field_is_empty () und taxonomy_field_is_empty () : taxonomy_field_is_empty()Überprüft die tid- Eigenschaft des $itemParameters, während number_field_is_empty()die value- Eigenschaft desselben Parameters überprüft wird. Bei benutzerdefinierten Feldern muss möglicherweise eine komplexere Bedingung überprüft werden, damit das Feld leer bleibt.

Die in der Dokumentation angegebene Beschreibung für hook_field_is_empty () lautet wie folgt:

Definieren Sie, was ein leeres Element für einen Feldtyp darstellt.


Ich schätze diese Antwort, aber hook_field_is_empty () scheint sehr weit zu gehen. Ich möchte wissen, ob das Feld wirklich leer ist. Zum Beispiel berücksichtigt number_field_is_empty, dass 0 ebenfalls leer ist. Ich teste auch, dass Sie diese Funktion nicht direkt anwenden können, wenn das Feld mehrwertig ist.
Corbacho

1
Das macht empty (), wenn Sie eine Variable übergeben, die 0 enthält, oder die Zeichenfolge "0"; Es könnte sein, dass das Feld einen Wert verwendet, wenn es leer ist, und der Aufruf von hook_field_is_empty () ist die einzige Möglichkeit, um festzustellen, ob das Feld leer ist.
kiamlaluno

Da ist ein Fehler. Sollte $ function sein ($ value [0], $ info); Siehe api.drupal.org/api/drupal/modules!field!field.api.php/function/…
volocuga

2

Wir haben den Rohwert in ( $content['field_name']['#items'][0][value]) gefunden, damit Sie mit dem Ausdruck feststellen können, ob das Feld leer ist oder nicht

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

wo field_nameentspricht den Namen des gewünschten Feldes.


Nein. Der Schlüssel "value" ist nur ein DB-Spaltenname. Sie kann je nach Feldtyp unterschiedlich sein. Ich denke, der beste Weg - überprüfen Sie hook_field_is_empty () (die erforderlich ist) wie oben vorgeschlagen
volocuga

1

Drupal 8

Wenn jemand die gleiche Antwort in D8 benötigt, ist das, was ich mache, um mein Feld zu testen:

if ($entity->hasField('field_event_date_start')
  && !$entity->get('field_event_date_start')->isEmpty()) {
  // Do something ...
}
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.