Estou estudando o uso das classes Entity Metadata Wrapper (definidas pelo módulo de entidade no Drupal 7) para acessar valores de campo, pois essa parece ser uma maneira limpa de fazer isso.
No entanto, existem algumas coisas que tornam isso um pouco estranho. Suponha que eu tenho um wrapper para um tipo de conteúdo que define um campo nomeado field_something
como tal:
$wrapper = entity_metadata_wrapper('node', node_load($nid));
$value = $wrapper->field_something->value();
O primeiro problema que tenho é que não tenho como saber de antemão se o que recebo é um valor real (uma string, uma entidade etc.), outro invólucro da estrutura de metadados (quando os campos têm vários valores) ou uma matriz (quando campos possuem várias propriedades).
Eu encontrei uma maneira de responder a essas perguntas usando o info()
método:
$info = $wrapper->field_something->info();
$is_multi_value = (strpos($info['type'], 'list<') === 0);
$has_multiple_properties = isset($info['property info']]);
No entanto, isso não é prático. Sempre que eu quiser usar um campo sem saber sua definição antes, devo levar em consideração vários casos. Isso torna meu código bastante pesado.
Para lidar com isso, escrevi um código que:
- Garante que sempre recebemos uma matriz de retorno, mesmo que seja um campo de valor único;
- Quando houver várias propriedades, retorne o valor da primeira coluna.
O ponto 1. aqui sempre funcionará, a menos que o chamador deseje saber se esse foi um campo de valor único ou não. O ponto 2 funciona em alguns casos, não em todos, mas é conveniente quando aplicável.
Aqui está o 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;
}
Portanto, minha pergunta é: existem maneiras melhores / mais simples de resolver esse problema de obter valores do wrapper de metadados quando o tipo de campo não é conhecido?