Vérifier qu'un champ n'est pas vide

15

Quelle est la meilleure méthode pour vérifier si un champ est vide dans un modèle de nœud.

Dans node - example.html.twig, nous pouvons utiliser la variable "content".

Je ne peux pas utiliser la vérification comme la vérification d'un bloc

{% if content.field_example  %}

Je peux utiliser quelque chose comme ça:

{% if content.field_example['#object'] is defined  %}

Mais quelle est la meilleure méthode?

sainf
la source
1
Utilisez hook_preprocess et vérifiez par programmation, peut-être ajoutez une variable indicatrice. Sinon, ce que 4k4 a écrit.

Réponses:

21

Comme je l'ai également écrit dans Comment pouvez-vous rendre des champs à partir d'une référence d'entité dans des modèles de nœuds? [Drupal 8] , le contenu est un tableau de rendu qui contient des données préparées pour l'affichage.

Si vous souhaitez vérifier ou comparer quelque chose, utilisez plutôt les valeurs qui sont disponibles sur l'objet nœud.

{% if node.field_example.value %}.

Notez que la propriété dépend du type de champ. S'il s'agit d'un champ de référence, vous devez utiliser target_id à la place. La question référencée renvoie à une feuille de triche API de champ d'entité qui répertorie les types de champs courants et leurs propriétés.

Berdir
la source
Pour le champ d'image {% node.field_article_image.target_id%}
Yogesh Kushwaha
13

Vous ne pouvez pas être sûr de la structure du tableau de rendu à l'intérieur du contenu, ce n'est donc pas la meilleure méthode.

Cela peut être une meilleure solution:

{% if content.field_example|render|striptags|trim %}
  <p>field is not empty</p>
{% endif %}

Cela vérifie si le rendu du champ génère une sortie.

Mais cela dépend de la façon dont vous avez configuré le format de champ et de ce que vous essayez de faire. Par exemple, vous pourriez avoir configuré pour afficher une étiquette si le champ est vide. Ensuite, vous devez ajuster cela. Si vous ne dépendez pas de la sortie rendue et souhaitez uniquement vérifier, si le champ a une valeur dans la base de données, utilisez l'objet nœud. Voir la réponse de Berdir.

4k4
la source
Je considère que Berdir a raison car il est plus flexible.
sainf
@ 4k4: le |rendern'est pas suffisant en raison de problèmes aléatoires d'espaces blancs dans les modèles de champ, voir ce lien: vérification des champs vides dans les modèles Twig est compliquée
Mojtaba Reyhani
@MojtabaReyhani: Merci, bonne trouvaille. On y trouve ce lien drupal.org/node/2783633#comment-11510195 . Ajouté ceci au code.
4k4
4

Vérifiez si le champ n'est pas vide dans le modèle de modèle Twig ( Collection de champs ) : field-collection-item - field-services.html.twig

Installez le module de valeur Field Twig pour obtenir la valeur à l'aide de " | field_value ", suivi de " n'est pas vide "

{% if content.field_work|field_value is not empty %}

       ...

{% endif %} 
Alberto Galvis
la source
1
{% if not (node.field_whatever.isEmpty == true) and content.field_whatever is defined %}
  <div class="whatever_markup">
    {{ content.field_whatever }}
  </div>
{% endif %}

Cette solution est tout à fait à l'épreuve des balles et fonctionne même dans des modèles réutilisables et / ou partagés (par exemple, un partage entre node--teaser.html.twigplusieurs bundles) car

  • cela fonctionne pour tous les types de champs
  • il vérifie si le champ existe
  • il vérifie si le champ n'est pas vide
  • il vérifie si le champ n'est pas masqué en mode affichage

Le double négatif not ...isEmpty == trueest nécessaire, sinon un champ inexistant échouerait la vérification. Je crois également que ma solution est beaucoup plus rapide et résiliente aux erreurs que toute vérification qui implique le rendu du champ.

Cela devrait fonctionner pour n'importe quel modèle d'entité, par exemple, vous pouvez simplement le remplacer node.field_xxxpar paragraph.field_xxxdans un paragraph.html.twigfichier de modèle

Hudri
la source