Ich habe versucht, mithilfe der Entity Metadata Wrapper-Klassen (definiert durch das Entity-Modul in Drupal 7) auf Feldwerte zuzugreifen, da dies eine saubere Methode zu sein scheint.
Es gibt ein paar Dinge, die dies jedoch etwas umständlich machen. Angenommen, ich habe einen Wrapper für einen Inhaltstyp, der ein Feld mit folgendem Namen definiert field_something
:
$wrapper = entity_metadata_wrapper('node', node_load($nid));
$value = $wrapper->field_something->value();
Das erste Problem, das ich habe, ist, dass ich vorher nicht wissen kann, ob ich einen tatsächlichen Wert (eine Zeichenfolge, eine Entität usw.), einen anderen Metadatenstruktur-Wrapper (wenn Felder mehrere Werte haben) oder ein Array (wenn) erhalte Felder haben mehrere Eigenschaften).
Ich habe einen Weg gefunden, diese Fragen mit der info()
Methode zu beantworten :
$info = $wrapper->field_something->info();
$is_multi_value = (strpos($info['type'], 'list<') === 0);
$has_multiple_properties = isset($info['property info']]);
Das ist jedoch kaum praktikabel. Wenn ich ein Feld verwenden möchte, ohne vorher die Definition zu kennen, muss ich mehrere Fälle berücksichtigen. Das macht meinen Code ziemlich schwer.
Um damit umzugehen, habe ich einen Code geschrieben, der:
- Stellt sicher, dass immer ein Array zurückgegeben wird, auch wenn es sich um ein einzelnes Wertefeld handelt.
- Wenn mehrere Eigenschaften vorhanden sind, geben Sie den Wert der ersten Spalte zurück.
Punkt 1. hier wird immer funktionieren, es sei denn, der Anrufer möchte wissen, ob dies ein einzelnes Wertefeld war oder nicht. Punkt 2 funktioniert in einigen Fällen nicht bei allen, ist aber praktisch, wenn es zutrifft.
Hier ist der Code:
function entity_metadata_simple_values($field) {
$fields = array();
$values = array();
$info = $field->info();
if (strpos($info['type'], 'list<') === 0) {
foreach ($field->getIterator() as $field_iteration) {
$fields[] = $field_iteration;
}
} else {
$fields[] = $field;
}
foreach ($fields as $final_field) {
$ff_info = $final_field->info();
if (isset($ff_info['property info'])) {
$column = reset(array_keys($ff_info['property info']));
$values[] = $final_field->{$column}->value();
} else {
$values[] = $final_field->value();
}
}
return $values;
}
Meine Frage lautet daher: Gibt es einfachere / bessere Möglichkeiten, um dieses Problem des Abrufs von Werten aus dem Metadaten-Wrapper zu lösen, wenn der Feldtyp nicht bekannt ist?