Sprawdzanie istnienia pola w owijarce bytu_metadanych

22

Ieruję kolekcję pól i owijam elementy kolekcji pól enwertą_metadanych_wrappera. Chciałbym sprawdzić istnienie pola przed wywołaniem jego valuemetody (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_itemssprawdzeniu, czy pole jest puste, ale chciałbym móc to zrobić za pomocą opakowania metadanych, jeśli to możliwe.

Nick Tomlin
źródło

Odpowiedzi:

26

Wystarczy wywołać funkcję PHP isset():

$headshot = array();
if (isset($item_wrapper->field_contributor->field_contrib_headshot)) {
  $headshot = $item_wrapper->field_contributor->field_contrib_headshot->value();
}

EntityStructureWrapper implementuje __isset()funkcję zgodnie z zasadą przeciążenia .

piouPiouM
źródło
Tak, zawsze tak to robiłem, mniej przywiązany do wewnętrznych i łatwiejszy do odczytania IMO. Pozytywne!
Cottser
9

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:

if($wrapped_entity->entity_reference_field->getIdentifier()) {
  // This code only fires if there is an entity reference or field collection set.
}
Atomox
źródło
Ta odpowiedź i następujący post działały dla mnie: dropbucket.org/node/1201
tyler.frankenstein
4

Wygląda na to, że masz entity_referencegdzieś coś z powodu łączenia metod. Ale spójrz na metodę __isset () dla EntityStructureWrapper .

Sprawdź jak:

$has_headshot = $item_wrapper->field_contributor->__isset('field_contrib_headshot');

a następnie użyj IFbloku, aby wykonać logikę ...

EDYTOWAĆ:

$has_headshot jest teraz wymagane sprawdzenie poprawności.

tenken
źródło
Nie jestem pewien, co rozumiesz przez „wygląda na to, że masz gdzieś odniesienie do istoty”, jeśli mógłbyś wyjaśnić to trochę bardziej, doceniłbym to. __issetdziała świetnie w kolekcji pól, chociaż muszę dodać pełną nazwę pola: field_contrib_headshotzamiastcontrib_headshot
Nick Tomlin
pola są wartościami; ciąg, liczba, cokolwiek. field_contributorodnosi się do innego pola field_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.
tenken,
jaki fragment kodu __isset () działał dla Ciebie?
tenken,
To było:$item_wrapper->field_contributor->__isset('field_contrib_headshot')
Nick Tomlin
Dziwne jest dla mnie bezpośrednie wywoływanie __isset (), dlaczego nie: $has_headshot = isset($item_wrapper->field_contributor->field_contrib_headshot);
Cottser
1
$wrapper = entity_metadata_wrapper('node', 123);
if($wrapper->__isset('field_middle_name')) {
    // Do something awesome with the middle name.
} else {
    // Don't do anything awesome, they don't have a middle name.
}

Pola referencyjne encji i zbiory pól

// also check if there is an identifier, __isset alone is not enough!
if ($wrapper->__isset('field_project_number') && $wrapper->field_project_number->getIdentifier()) {
    $number =  $wrapper->field_project_number->field_project_number_complete->value();
    return $number;
}

Skopiowane i wklejone prosto z http://dropbucket.org/node/1201, ale wydaje się być lepszym przykładem niż jakakolwiek inna jak dotąd odpowiedź ...

Felix Eve
źródło
1

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

if ($wrapper->__isset('nid')) {
  $var = $wrapper->nid->value();
}
else {
  // Do something it's FALSE;
}

LUB

if ($wrapper->__isset('nid')) {
  $var = $wrapper->nid->getIdentifier();
}
else {
  // Do something it's FALSE;
}

LUB

if ($wrapper->nid->value()) {
  // Do something it's TRUE.
}
else {
  // Do something it's FALSE;
}

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

if (isset($wrapper->nid)) {
  // Do something it must be TRUE....Ah Hem wait.. this runs every time.
}

UŻYJ TEGO INSTEAD

try {
  $var = $wrapper->nid->raw();
} 
catch (EntityMetadataWrapperException $e) {
  $var = FALSE;
}
daveferrara1
źródło
0

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ść.

if ( $wrapper->field_media_alternate[0]->value() ) {
  //...valid logic...
} else {
  //...not valid logic...
}
knice
źródło
0

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).

$w = entity_metadata_wrapper('node', $nid);
//Start by checking whether the node bundle supports field_entityref_myfield.
if (isset($w->field_entityref_myfield)) {
  //If we called value(), then that would cause the referenced entity
  //to be loaded, whereas raw() just gives us the entity_id if the value
  //is set, and Null if it isn't.
  if ($w->field_entityref_myfield->raw()) {
    //Do some things based on the entity-reference being set.
  } else {
    //Do some other things based on the entity-reference NOT being set.
  }
}

Aby powtórzyć, raw () to wartość, której powinieneś użyć do sprawdzenia, czy pole istnieje. Jest niezawodny i tani pod względem obliczeniowym.

Scott Armstrong
źródło
0

Oto moja osobista funkcja pomocnika, aby uzyskać wartość z potencjalnie nie ustawionego łańcucha odniesień do encji:

function _get_wrapped_value_ifset($wentity, $field_chain){
  $root = $wentity;
  try{
    foreach ( $field_chain as $field_name ) {
      $root = $root->{$field_name};
    }
    return $root->value();
  }
  catch (EntityMetadataWrapperException $e){
    return null;
  }
}

$ Wentity jest opakowaną jednostką, $ field_chain to tablica nazw pól takich jak:

[
  'field_reference_from_the_wentity',
  'field_wanted_field_from_the_referenced_entity'
] 

możesz także:

[
  'field_reference_from_the_wentity', 
  'field_reference_from_the_referenced_entity',
  ... 
  'field_wanted_field_from_the_N_referenced_entity'
]

to zadziała!

Thony
źródło