Ieruję kolekcję pól i owijam elementy kolekcji pól enwertą_metadanych_wrappera. Chciałbym sprawdzić istnienie pola przed wywołaniem jego value
metody (co powoduje błąd w polach, które nie mają wartości), ale nie mogę znaleźć sposobu, aby to zrobić.
$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();
Moje obecne obejście polega na field_get_items
sprawdzeniu, czy pole jest puste, ale chciałbym móc to zrobić za pomocą opakowania metadanych, jeśli to możliwe.
Za każdym razem, gdy istnieje odwołanie do obiektu lub zbiór pól, isset () nigdy dla mnie nie działało. Co wydaje się działać, ilekroć mamy odwołanie do encji, robi:
źródło
Wygląda na to, że masz
entity_reference
gdzieś coś z powodu łączenia metod. Ale spójrz na metodę __isset () dla EntityStructureWrapper .Sprawdź jak:
a następnie użyj
IF
bloku, aby wykonać logikę ...EDYTOWAĆ:
$has_headshot
jest teraz wymagane sprawdzenie poprawności.źródło
__isset
działa świetnie w kolekcji pól, chociaż muszę dodać pełną nazwę pola:field_contrib_headshot
zamiastcontrib_headshot
field_contributor
odnosi się do innego polafield_contrib_headshot
... jakoś tam się zagnieżdżasz. Zakładam, że używasz odwołania encji lub czegoś innego jak grupa_pola do zagnieżdżania tych rzeczy ... to wszystko, co miałem na myśli.$item_wrapper->field_contributor->__isset('field_contrib_headshot')
$has_headshot = isset($item_wrapper->field_contributor->field_contrib_headshot);
Pola referencyjne encji i zbiory pól
Skopiowane i wklejone prosto z http://dropbucket.org/node/1201, ale wydaje się być lepszym przykładem niż jakakolwiek inna jak dotąd odpowiedź ...
źródło
W przypadku EntityMetadataWrapper:
Jeśli masz uruchomione bloki kodu, które nie powinny lub napotykasz błędy PHP, spójrz na niektóre z poniższych przykładów. W tym przykładzie użyto właściwości nid.
MAY ALL ERROR
LUB
LUB
Może się okazać, że użycie typu isset może więc mieć wartość true, nawet jeśli identyfikator nid nie jest obecny. -> getIdentifier () lub -> value () lub -> raw () może zgłaszać wyjątki.
PRAWDO ZAWSZE PRAWDA
UŻYJ TEGO INSTEAD
źródło
Odkryłem, że isset () nie może być użyty w wyniku wywołania funkcji. Ponieważ wartość logiczna jest zwracana z następującą instrukcją, byłem w stanie sprawdzić, czy zawinięty element w rzeczywistości miał wartość.
źródło
Ludzie często mylą się. Kiedy wywołujesz isset na opakowaniu metadanych encji, sprawdzasz, czy pakiet encji obsługuje tę właściwość. Nie ma to nic wspólnego z rzeczywistą wartością pola.
Tak naprawdę nie ma niezależnej metody sprawdzania, czy ustawiona jest wartość. Musisz tylko ocenić wartość () lub, najlepiej, raw (). (Możesz także wywołać count (), jeśli jest to pole wielowartościowe, ale raw () zwróci pustą tablicę, więc nie jest tak naprawdę wymagane).
Aby powtórzyć, raw () to wartość, której powinieneś użyć do sprawdzenia, czy pole istnieje. Jest niezawodny i tani pod względem obliczeniowym.
źródło
Oto moja osobista funkcja pomocnika, aby uzyskać wartość z potencjalnie nie ustawionego łańcucha odniesień do encji:
$ Wentity jest opakowaną jednostką, $ field_chain to tablica nazw pól takich jak:
możesz także:
to zadziała!
źródło