Verifique se um campo está vazio

18

Como verificar se um campo está vazio quando você possui o objeto $ node?

Eu achei isso como possível solução:

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

Eu posso verificar agora:

UPDATE .Ups! Isso não é confiável, apesar de prometer que funcionou para mim ontem.

isset($field);

mas eu me pergunto se existe uma maneira melhor.

Me esclareça

corbacho
fonte

Respostas:

30

Se você ler a documentação, a função retornará FALSEse não houver dados. isset()na verdade falharia porque você está atribuindo FALSEà variável, então ela foi realmente definida como algo. A sintaxe correta seria:

$field = field_get_items('node', $node, 'field_post_image');
if ($field) {
   //Do something with the field
}
else{
   //There are no results
}
Sam152
fonte
Parece que este é o melhor caminho. Se ele está vazio retornará FALSE, se tem quaisquer dados que ele irá retornar um array, por isso não há preocupação de que $ avalia campo para FALSE em caso de número campos 0, etc.
corbacho
Isso não funcionou para mim porque retornou o valor padrão quando nada foi definido.
River
@ Sam152 Obrigado! Isso funcionou muito bem para quando eu estava conectado, mas quando estou desconectado não está mostrando nada. Existe uma razão para isso e qualquer solução?
Dan
Oi Dan. O login não deve ter nenhum impacto no código acima. Talvez você esteja usando o devel para depurar uma variável e os usuários anon não possuam "acessar informações do desenvolvedor"?
Sam152
Esta é a maneira errada de verificar se um campo está vazio; você deve usar a abordagem descrita chamando hook_field_is_empty definido pelo módulo que implementa o campo; veja a publicação de kiamlaluno.
Lslinnet # 9/15
8

Você pode usar o seguinte snippet para verificar se um campo está vazio.

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

Esse código é mais seguro, pois campos diferentes são considerados vazios sob condições diferentes. Veja, por exemplo, a diferença entre file_field_is_empty () , number_field_is_empty () e taxonomy_field_is_empty () : taxonomy_field_is_empty()verifica a propriedade tid do $itemparâmetro, enquanto number_field_is_empty()verifica a propriedade value do mesmo parâmetro. Os campos personalizados podem exigir a verificação de uma condição mais complexa, a fim de considerar o campo vazio.

A descrição para hook_field_is_empty () fornecida na documentação é a seguinte:

Defina o que constitui um item vazio para um tipo de campo.

kiamlaluno
fonte
Agradeço esta resposta, mas o hook_field_is_empty () parece ir muito longe. Quero saber se o campo está realmente vazio. Por exemplo, number_field_is_empty considera que 0 também está vazio. Também testo que você não pode aplicar essa função diretamente se o campo tiver vários valores.
Corbacho #
11
É isso que esvazia () quando você passa uma variável contendo 0 ou a string "0"; pode ser que o campo esteja usando um valor quando estiver vazio, e chamar hook_field_is_empty () é a única maneira de saber se o campo está vazio.
kiamlaluno
Há um erro. Deve ser $ function ($ value [0], $ info); Veja api.drupal.org/api/drupal/modules!field!field.field.api.php/function/…
volocuga
2

Encontramos o valor bruto em ( $content['field_name']['#items'][0][value]), para que você possa determinar se o campo está vazio ou não com a expressão

(! vazio ($ content ['nome_do_campo'] ['# itens'] [0] [valor]))

onde field_namecorresponde ao nome do campo desejado.

eduardocs
fonte
Não. A chave "value" é apenas um nome de coluna db. Pode ser diferente dependendo do tipo de campo. Eu acho que a melhor maneira - verifique hook_field_is_empty () (que é necessário) como proposto acima #
volocuga
1

Drupal 8

Se alguém precisar da mesma resposta no D8, é isso que eu faço para testar meu campo:

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