Comprobar si un campo está vacío

18

¿Cómo verificar que un campo está vacío, cuando tiene el objeto $ node ?.

Encontré esto como posible solución:

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

Puedo verificar ahora:

ACTUALIZACIÓN . ¡Ups! Esto no es confiable, aunque prometo que me funcionó ayer.

isset($field);

pero me pregunto si hay una mejor manera

Iluminame

corbacho
fuente

Respuestas:

30

Si lee la documentación, la función regresa FALSEsi no hay datos. isset()en realidad fallaría porque está asignando FALSEa la variable, por lo que en realidad se ha establecido en algo. La sintaxis correcta sería:

$field = field_get_items('node', $node, 'field_post_image');
if ($field) {
   //Do something with the field
}
else{
   //There are no results
}
Sam152
fuente
Parece que esta es la mejor manera. Si está vacío devolverá FALSE, si tiene cualquier dato que devuelve un vector, por lo que no hay que preocuparse de que $ evalúa campo en false en caso de número de campos 0, etc
Corbacho
Esto no funcionó para mí porque devolvió el valor predeterminado cuando no se configuró nada.
río
@ Sam152 ¡Gracias! Esto funcionó muy bien cuando estaba conectado, pero cuando estoy desconectado no muestra nada. ¿Hay alguna razón para eso y alguna solución?
Dan
Hola dan Iniciar sesión no debería tener ningún impacto en el código anterior. ¿Quizás está utilizando el desarrollo para depurar una variable y anon los usuarios no tienen "acceso a la información del desarrollador"?
Sam152
Esta es la forma incorrecta de verificar si un campo está vacío, debe usar el enfoque descrito al llamar al hook_field_is_empty definido por el módulo que implementa el campo, vea la publicación de kiamlaluno.
lslinnet
8

Puede usar el siguiente fragmento para verificar si un campo está vacío.

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

Este código es más seguro, ya que los diferentes campos se consideran vacíos en diferentes condiciones. Vea, por ejemplo, la diferencia entre file_field_is_empty () , number_field_is_empty () y taxonomy_field_is_empty () : taxonomy_field_is_empty()verifica la propiedad tid del $itemparámetro, mientras number_field_is_empty()verifica la propiedad de valor del mismo parámetro. Los campos personalizados pueden requerir que se verifique una condición más compleja para considerar que el campo está vacío.

La descripción de hook_field_is_empty () dada en la documentación es la siguiente:

Defina qué constituye un elemento vacío para un tipo de campo.

kiamlaluno
fuente
Agradezco esta respuesta, pero el hook_field_is_empty () parece ir muy lejos. Quiero saber si el campo está realmente vacío. Por ejemplo, number_field_is_empty considera que 0 también está vacío. También pruebo que no puede aplicar esta función directamente si el campo es de valor múltiple.
corbacho
1
Eso es lo que hace empty () cuando le pasa una variable que contiene 0, o la cadena "0"; podría ser que el campo esté usando un valor cuando esté vacío, e invocar hook_field_is_empty () es la única forma de saber si el campo está vacío.
kiamlaluno
Hay un error. Debe ser $ function ($ valor [0], $ info); Ver api.drupal.org/api/drupal/modules!field!field.api.php/function/…
volocuga
2

Encontramos el valor bruto en ( $content['field_name']['#items'][0][value]), por lo que puede determinar si el campo está vacío o no con la expresión

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

donde field_namecoincide con el nombre del campo deseado.

eduardocs
fuente
No. La clave "valor" es solo un nombre de columna db. Puede ser diferente según el tipo de campo. Creo que la mejor manera: ver hook_field_is_empty () (que es obligatorio) como se propuso anteriormente
volocuga
1

Drupal 8

Si alguien necesita la misma respuesta en D8, eso es lo que hago para probar mi campo:

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