Controlla se un campo è vuoto


18

Come verificare che un campo sia vuoto quando si ha l'oggetto $ node ?.

Ho trovato questa soluzione possibile:

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

Ora posso controllare:

AGGIORNAMENTO .Ups! Questo non è affidabile, anche se prometto che ha funzionato per me ieri.

isset($field);

ma mi chiedo se c'è un modo migliore.

Illuminami

Risposte:


30

Se leggete sulla documentazione la funzione ritorna FALSEse non ci sono dati. isset()fallirebbe davvero perché ti stai assegnando FALSEalla variabile, quindi è stata effettivamente impostata su qualcosa. La sintassi corretta sarebbe:

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

Sembra che questo sia il modo migliore. Se è vuoto restituirà FALSO, se ha dei dati restituirà un array, quindi non c'è da temere che $ field valuti FALSO in caso di campi numerici 0, ecc.
corbacho

Questo non ha funzionato per me perché ha restituito il valore predefinito quando non è stato impostato nulla.
fiume

@ Sam152 Grazie! Questo ha funzionato benissimo per quando ero loggato, ma quando sono disconnesso non mostra nulla. C'è una ragione per questo e qualche soluzione?
Dan

Ciao Dan L'accesso non dovrebbe avere alcun impatto sul codice sopra. Forse stai usando devel per eseguire il debug di una variabile e altri utenti non hanno "accesso alle informazioni dello sviluppatore"?
Sam152,

Questo è il modo sbagliato di verificare se un campo è vuoto, dovresti usare l'approccio descritto chiamando il hook_field_is_empty definito dal modulo che implementa il campo, vedi il post di kiamlaluno.
lslinnet il

8

È possibile utilizzare il frammento seguente per verificare se un campo è vuoto.

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

Questo codice è più sicuro, poiché diversi campi sono considerati vuoti in condizioni diverse. Vedi, ad esempio, la differenza tra file_field_is_empty () , number_field_is_empty () e taxonomy_field_is_empty () : taxonomy_field_is_empty()controlla la proprietà tid del $itemparametro, mentre number_field_is_empty()controlla la proprietà value dello stesso parametro. I campi personalizzati potrebbero richiedere una condizione più complessa da verificare, al fine di considerare il campo vuoto.

La descrizione per hook_field_is_empty () fornita nella documentazione è la seguente:

Definire ciò che costituisce un elemento vuoto per un tipo di campo.


Apprezzo questa risposta, ma hook_field_is_empty () sembra andare molto lontano. Voglio sapere se il campo è davvero vuoto. Ad esempio, number_field_is_empty considera che 0 è anche vuoto. Inoltre collaudo che non è possibile applicare questa funzione direttamente se il campo è multi-valore.
corbacho,

1
Questo è ciò che significa empty () quando le passi una variabile contenente 0 o la stringa "0"; potrebbe essere che il campo stia usando un valore quando è vuoto e invocare hook_field_is_empty () è l'unico modo per sapere se il campo è vuoto.
kiamlaluno

C'è un errore. Dovrebbe essere $ function ($ value [0], $ info); Vedi api.drupal.org/api/drupal/modules!field!field.api.php/function/…
volocuga,

2

Abbiamo trovato il valore grezzo in ( $content['field_name']['#items'][0][value]), quindi puoi determinare se il campo è vuoto o meno con l'espressione

(! Empty ($ contenuto [ 'FIELD_NAME'] [ 'articoli #'] [0] [valore]))

dove field_namecorrisponde al nome del campo desiderato.


No. La chiave "value" è solo il nome di una colonna db. Può essere diverso a seconda del tipo di campo. Penso che il modo migliore - controlla hook_field_is_empty () (che è richiesto) come proposto sopra
volocuga

1

Drupal 8

Se qualcuno ha bisogno della stessa risposta in D8, è quello che faccio per testare il mio campo:

if ($entity->hasField('field_event_date_start')
  && !$entity->get('field_event_date_start')->isEmpty()) {
  // Do something ...
}
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.