Vérifiez si un champ est vide

18

Comment vérifier qu'un champ est vide, quand on a l'objet $ node?.

J'ai trouvé cela comme solution possible:

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

Je peux vérifier maintenant:

MISE À JOUR .Ups! Ce n'est pas fiable, même si je promets que cela a fonctionné pour moi hier.

isset($field);

mais je me demande s'il y a une meilleure façon.

Éclaire-moi

corbacho
la source

Réponses:

30

Si vous lisez la documentation, la fonction retourne FALSEs'il n'y a pas de données. isset()échouerait en fait parce que vous attribuez FALSEà la variable, elle a donc été définie sur quelque chose. La syntaxe correcte serait:

$field = field_get_items('node', $node, 'field_post_image');
if ($field) {
   //Do something with the field
}
else{
   //There are no results
}
Sam152
la source
Il semble que ce soit la meilleure façon. Si elle est vide, FALSE sera renvoyée, si elle contient des données, elle renverra un tableau, donc il n'y a pas à craindre que $ field soit évalué à FALSE en cas de champ numérique 0, etc.
corbacho
Cela n'a pas fonctionné pour moi car il a renvoyé la valeur par défaut lorsque rien n'a été défini.
rivière
@ Sam152 Merci! Cela a très bien fonctionné lorsque je me suis connecté, mais lorsque je suis déconnecté, cela ne montre rien. Y a-t-il une raison à cela et une solution?
Dan
Salut Dan. Être connecté ne devrait pas avoir d'impact sur le code ci-dessus. Peut-être que vous utilisez devel pour déboguer une variable et que les utilisateurs anon n'ont pas "accès aux informations du développeur"?
Sam152
C'est la mauvaise façon de vérifier si un champ est vide, vous devez utiliser l'approche décrite en appelant le hook_field_is_empty défini par le module implémentant le champ, voir le post de kiamlaluno.
lslinnet
8

Vous pouvez utiliser l'extrait de code suivant pour vérifier si un champ est vide.

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

Ce code est plus sûr, car différents champs sont considérés comme vides dans différentes conditions. Voir, par exemple, la différence entre file_field_is_empty () , number_field_is_empty () et taxonomy_field_is_empty () : taxonomy_field_is_empty()vérifie la propriété tid du $itemparamètre, tout en number_field_is_empty()vérifiant la propriété value du même paramètre. Les champs personnalisés peuvent nécessiter une condition plus complexe à vérifier, afin de considérer le champ vide.

La description de hook_field_is_empty () donnée dans la documentation est la suivante:

Définissez ce qui constitue un élément vide pour un type de champ.

kiamlaluno
la source
J'apprécie cette réponse, mais le hook_field_is_empty () semble aller très loin. Je veux savoir si le champ est vraiment vide. Par exemple, number_field_is_empty considère que 0 est également vide. Je teste également que vous ne pouvez pas appliquer cette fonction directement si le champ est à plusieurs valeurs.
corbacho
1
C'est ce que fait empty () lorsque vous lui passez une variable contenant 0, ou la chaîne "0"; il se peut que le champ utilise une valeur lorsqu'elle est vide, et invoquer hook_field_is_empty () est le seul moyen de savoir si le champ est vide.
kiamlaluno
Il ya une erreur. Doit être $ function ($ value [0], $ info); Voir api.drupal.org/api/drupal/modules!field!field.api.php/function/…
volocuga
2

Nous avons trouvé la valeur brute dans ( $content['field_name']['#items'][0][value]), vous pouvez donc déterminer si le champ est vide ou non avec l'expression

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

field_namecorrespond au nom du champ souhaité.

eduardocs
la source
Non. La clé "value" n'est qu'un nom de colonne db. Il peut être différent selon le type de champ. Je pense que la meilleure façon - vérifiez hook_field_is_empty () (qui est requis) comme proposé ci
volocuga
1

Drupal 8

Si quelqu'un a besoin de la même réponse en D8, c'est ce que je fais pour tester mon domaine:

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