J'itère à travers une collection de champs et j'enveloppe les éléments de la collection de champs avec un entity_metadata_wrapper. Je voudrais vérifier l'existence d'un champ avant d'appeler sa value
méthode (ce qui entraîne une erreur sur les champs qui n'ont pas de valeur), mais je ne trouve pas de moyen de le faire.
$field_collection_item = field_collection_item_load($id);
$item_wrapper = entity_metadata_wrapper('field_collection_item', $field_collection_item);
// this results in an error if the field_contrib_headshot field is empty
$headshot = $item_wrapper->field_contributor->field_contrib_headshot->value();
Ma solution de contournement actuelle consiste à utiliser field_get_items
pour voir si le champ est vide, mais j'aimerais pouvoir le faire via le wrapper de métadonnées si possible.
Chaque fois qu'il existe une référence d'entité ou une collection de champs, isset () n'a jamais fonctionné pour moi. Ce qui semble fonctionner chaque fois que nous avons une référence d'entité, c'est:
la source
Il semble que vous ayez un
entity_reference
endroit quelque part en raison du chaînage de la méthode. Mais, regardez la méthode __isset () pour EntityStructureWrapper .Vérifiez comme:
puis utilisez un
IF
bloc pour faire votre logique ...MODIFIER:
$has_headshot
est maintenant valide, contrôle souhaité.la source
__isset
fonctionne très bien sur la collection de champs, bien que je doive ajouter le nom complet du champ:field_contrib_headshot
au lieu decontrib_headshot
field_contributor
fait référence à un autre domainefield_contrib_headshot
... vous y êtes imbriqué d'une manière ou d'une autre. Je suppose que vous utilisez entity_reference ou quelque chose d'autre comme field_group pour imbriquer ces choses ... c'est tout ce que je voulais dire.$item_wrapper->field_contributor->__isset('field_contrib_headshot')
$has_headshot = isset($item_wrapper->field_contributor->field_contrib_headshot);
Champs de référence d'entité et collections de champs
Copié et collé directement depuis http://dropbucket.org/node/1201 mais semble être un meilleur exemple que toute autre réponse jusqu'à présent ...
la source
Pour EntityMetadataWrapper:
Si vous avez des blocs de code en cours d'exécution qui ne devraient pas ou si vous avez rencontré des erreurs PHP, regardez certains des exemples ci-dessous. Cet exemple utilise la propriété nid.
PEUT TOUT ERREUR
OU
OU
Vous constaterez peut-être que l'utilisation de isset like so peut être évaluée à true même si le nid n'est pas présent. Le -> getIdentifier (), ou -> value (), ou -> raw () peut lever des exceptions.
PROBABLEMENT TOUJOURS VRAI
UTILISEZ CECI AU LIEU
la source
J'ai trouvé que isset () ne peut pas être utilisé sur le résultat d'un appel de fonction. Puisqu'un booléen est renvoyé avec l'instruction suivante, j'ai pu vérifier que l'élément encapsulé avait en fait une valeur.
la source
Les gens se trompent souvent. Lorsque vous appelez isset sur un wrapper de métadonnées d'entité, vous vérifiez si le groupe d' entités prend en charge cette propriété. Cela n'a rien à voir avec la valeur réelle du champ.
Il n'y a pas vraiment de méthode indépendante pour vérifier si une valeur est définie. Il vous suffit d'évaluer value () ou, de préférence, raw (). (Vous pouvez également appeler count () s'il s'agit d'un champ à plusieurs valeurs, mais raw () renverra un tableau vide de sorte qu'il n'est pas réellement requis.)
Pour réitérer, raw () est la valeur que vous devez utiliser pour vérifier si un champ existe. C'est fiable et bon marché sur le plan des calculs.
la source
Voici ma fonction d'aide personnelle pour obtenir une valeur à partir d'une chaîne potentiellement non définie de références d'entité:
$ gotity est l'entité enveloppée, $ field_chain est un tableau de noms de champs comme ceci:
vous pouvez également faire:
ça va marcher!
la source