Ich durchlaufe eine Feldsammlung und verpacke die Felderfassungselemente mit einem entity_metadata_wrapper. Ich möchte das Vorhandensein eines Felds überprüfen, bevor ich seine value
Methode aufrufe (was bei Feldern, die keinen Wert haben, zu einem Fehler führt), kann jedoch keine Möglichkeit finden, dies zu tun.
$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();
Meine derzeitige Problemumgehung besteht darin, festzustellen field_get_items
, ob das Feld leer ist, aber ich würde es lieben, wenn dies möglich ist, indem ich den Metadaten-Wrapper verwende.
Immer wenn es eine Entitätsreferenz oder eine Feldsammlung gibt, hat isset () für mich nie funktioniert. Was scheint zu funktionieren, wenn eine Entitätsreferenz ausgeführt wird:
quelle
Es sieht so aus, als ob Sie
entity_reference
aufgrund der Verkettung der Methoden irgendwo drin sind. Schauen Sie sich jedoch die __isset () -Methode für EntityStructureWrapper an .Überprüfen Sie wie:
und dann benutze einen
IF
Block, um deine Logik zu machen ...BEARBEITEN:
$has_headshot
ist jetzt gültiger Scheck erwünscht.quelle
__isset
Funktioniert hervorragend für diefield_contrib_headshot
contrib_headshot
field_contributor
verweist auf ein anderes Feldfield_contrib_headshot
... Sie haben dort irgendwie verschachtelt. Ich gehe davon aus, dass Sie entity_reference oder so etwas wie field_group verwenden, um diese Dinge zu verschachteln ... das ist alles, was ich gemeint habe.$item_wrapper->field_contributor->__isset('field_contrib_headshot')
$has_headshot = isset($item_wrapper->field_contributor->field_contrib_headshot);
Entitätsreferenzfelder und Feldsammlungen
Wird direkt von http://dropbucket.org/node/1201 kopiert und eingefügt , scheint aber ein besseres Beispiel zu sein als jede andere Antwort bisher ...
quelle
Für EntityMetadataWrapper:
Wenn Sie Codeblöcke haben, die nicht ausgeführt werden sollten, oder wenn Sie auf PHP-Fehler gestoßen sind, sehen Sie sich einige der folgenden Beispiele an. In diesem Beispiel wird die Eigenschaft nid verwendet.
MAI ALLE FEHLER
ODER
ODER
Sie können feststellen, dass die Verwendung von isset like so auch dann als true ausgewertet wird, wenn die nid nicht vorhanden ist. Die Befehle -> getIdentifier () oder -> value () oder -> raw () können Ausnahmen auslösen.
WAHRSCHEINLICH IMMER WAHR
BENUTZEN SIE DIESE STATT
quelle
Ich habe festgestellt, dass isset () nicht für das Ergebnis eines Funktionsaufrufs verwendet werden kann. Da ein Boolescher Wert mit der folgenden Anweisung zurückgegeben wird, konnte überprüft werden, ob das umgebrochene Element tatsächlich einen Wert aufweist.
quelle
Die Leute verstehen das oft falsch. Wenn Sie isset für einen Entitäts-Metadaten-Wrapper aufrufen, prüfen Sie, ob das Entitäts-Bundle diese Eigenschaft unterstützt. Es hat überhaupt nichts mit dem tatsächlichen Wert des Feldes zu tun.
Es gibt keine unabhängige Methode, um zu überprüfen, ob ein Wert festgelegt ist. Sie müssen nur value () oder vorzugsweise raw () auswerten. (Sie können count () auch aufrufen, wenn es sich um ein mehrwertiges Feld handelt, raw () gibt jedoch ein leeres Array zurück, sodass es eigentlich nicht erforderlich ist.)
Raw () ist der Wert, den Sie verwenden sollten, um zu überprüfen, ob ein Feld vorhanden ist. Es ist zuverlässig und rechnerisch günstig.
quelle
Hier ist meine persönliche Hilfsfunktion, um einen Wert aus einer potenziell nicht festgelegten Kette von Entitätsreferenzen zu erhalten:
$ wentity ist die umschlossene Entität, $ field_chain ist ein Array von field_names wie folgt:
Sie können auch tun:
es wird klappen
quelle