Überprüfung auf Existenz eines Feldes auf einem entity_metadata_wrapper

22

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

Nick Tomlin
quelle

Antworten:

26

Rufen Sie einfach die PHP-Funktion auf isset():

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

EntityStructureWrapper implementiert die __isset()Funktion nach dem Prinzip des Überladens .

piouPiouM
quelle
Ja, das ist immer so, wie ich es gemacht habe, weniger eingebunden in die Interna und einfacher zu lesen, IMO. Upvoted!
Cottser
9

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:

if($wrapped_entity->entity_reference_field->getIdentifier()) {
  // This code only fires if there is an entity reference or field collection set.
}
Atomox
quelle
Diese Antwort und der folgende Beitrag haben bei mir funktioniert
tyler.frankenstein 16.03.15
4

Es sieht so aus, als ob Sie entity_referenceaufgrund der Verkettung der Methoden irgendwo drin sind. Schauen Sie sich jedoch die __isset () -Methode für EntityStructureWrapper an .

Überprüfen Sie wie:

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

und dann benutze einen IFBlock, um deine Logik zu machen ...

BEARBEITEN:

$has_headshot ist jetzt gültiger Scheck erwünscht.

tenken
quelle
Ich bin mir nicht sicher, was Sie mit "es sieht so aus, als hätten Sie irgendwo eine Entitätsreferenz" meinen, wenn Sie das etwas näher erläutern könnten, würde ich es schätzen. __issetFunktioniert hervorragend für die field_contrib_headshotcontrib_headshot
Nick Tomlin
Felder sind Werte; eine Zeichenfolge, eine Zahl, was auch immer. field_contributorverweist auf ein anderes Feld field_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.
Tenken
Was war der Code von __isset (), der für Sie funktioniert hat?
Tenken
Es war:$item_wrapper->field_contributor->__isset('field_contrib_headshot')
Nick Tomlin
Es kommt mir komisch vor, die __isset () direkt aufzurufen, warum nicht: $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.
}

Entitätsreferenzfelder und Feldsammlungen

// 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;
}

Wird direkt von http://dropbucket.org/node/1201 kopiert und eingefügt , scheint aber ein besseres Beispiel zu sein als jede andere Antwort bisher ...

Felix Eve
quelle
1

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

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

ODER

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

ODER

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

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

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

BENUTZEN SIE DIESE STATT

try {
  $var = $wrapper->nid->raw();
} 
catch (EntityMetadataWrapperException $e) {
  $var = FALSE;
}
daveferrara1
quelle
0

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.

if ( $wrapper->field_media_alternate[0]->value() ) {
  //...valid logic...
} else {
  //...not valid logic...
}
knice
quelle
0

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

$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.
  }
}

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.

Scott Armstrong
quelle
0

Hier ist meine persönliche Hilfsfunktion, um einen Wert aus einer potenziell nicht festgelegten Kette von Entitätsreferenzen zu erhalten:

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 ist die umschlossene Entität, $ field_chain ist ein Array von field_names wie folgt:

[
  'field_reference_from_the_wentity',
  'field_wanted_field_from_the_referenced_entity'
] 

Sie können auch tun:

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

es wird klappen

Thony
quelle