He estado buscando usar las clases Entity Metadata Wrapper (definidas por el módulo de entidad en Drupal 7) para acceder a los valores de campo, ya que parece ser una forma limpia de hacerlo.
Sin embargo, hay un par de cosas que hacen que esto sea un poco incómodo. Supongamos que tengo un contenedor para un tipo de contenido que define un campo denominado field_something
como tal:
$wrapper = entity_metadata_wrapper('node', node_load($nid));
$value = $wrapper->field_something->value();
El primer problema que tengo es que no tengo forma de saber de antemano si lo que obtengo es un valor real (una cadena, una entidad, etc.), otro contenedor de estructura de metadatos (cuando los campos tienen múltiples valores) o una matriz (cuando los campos tienen múltiples propiedades).
He encontrado una manera de responder esas preguntas usando el info()
método:
$info = $wrapper->field_something->info();
$is_multi_value = (strpos($info['type'], 'list<') === 0);
$has_multiple_properties = isset($info['property info']]);
Sin embargo, eso no es práctico. Siempre que quiera usar un campo sin saber de antemano su definición, debo tener en cuenta varios casos. Esto hace que mi código sea bastante pesado.
Para lidiar con esto, he escrito un código que:
- Asegura que siempre nos devuelva una matriz, incluso si es un campo de valor único;
- Cuando hay varias propiedades, devuelve el valor de la primera columna.
El punto 1. aquí siempre funcionará, a menos que la persona que llama quiera saber si este era un campo de valor único o no. El punto 2 funciona en algunos casos, no en todos, pero es conveniente cuando corresponde.
Aquí está el código:
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;
}
Entonces mi pregunta es: ¿hay formas más simples / mejores de abordar este problema de obtener valores del envoltorio de metadatos cuando no se conoce el tipo de campo?