Ho cercato di utilizzare le classi di wrapper di metadati di entità (definite dal modulo entità in Drupal 7) per accedere ai valori dei campi, poiché questo sembra essere un modo pulito per farlo.
Ci sono un paio di cose che lo rendono un po 'imbarazzante comunque. Supponiamo di avere un wrapper per un tipo di contenuto che definisce un campo denominato field_something
come tale:
$wrapper = entity_metadata_wrapper('node', node_load($nid));
$value = $wrapper->field_something->value();
Il primo problema che ho è che non ho modo di sapere in anticipo se ciò che ottengo è un valore effettivo (una stringa, un'entità, ecc.), Un altro wrapper di struttura di metadati (quando i campi hanno più valori) o un array (quando i campi hanno più proprietà).
Ho trovato il modo di rispondere a queste domande usando il info()
metodo:
$info = $wrapper->field_something->info();
$is_multi_value = (strpos($info['type'], 'list<') === 0);
$has_multiple_properties = isset($info['property info']]);
Tuttavia, questo non è pratico. Ogni volta che voglio usare un campo senza conoscerne prima la definizione, devo prendere in considerazione diversi casi. Questo rende il mio codice abbastanza pesante.
Per far fronte a questo ho scritto un codice che:
- Assicura che venga sempre restituito un array, anche se si tratta di un campo a valore singolo;
- Quando sono presenti più proprietà, restituisce il valore della prima colonna.
Il punto 1. qui funzionerà sempre, a meno che il chiamante non voglia sapere se si tratta o meno di un campo a valore singolo. Il punto 2 funziona in alcuni casi, non tutti, ma è conveniente quando si applica.
Ecco il codice:
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;
}
Quindi la mia domanda è: ci sono modi più semplici / migliori per affrontare questo problema di ottenere valori dal wrapper dei metadati quando il tipo di campo non è noto?