J'ai cherché à utiliser les classes Entity Metadata Wrapper (définies par le module d'entité dans Drupal 7) pour accéder aux valeurs de champ, car cela semble être une manière propre de le faire.
Il y a quelques choses qui rendent cela un peu gênant cependant. Supposons que j'ai un wrapper pour un type de contenu qui définit un champ nommé field_something
comme tel:
$wrapper = entity_metadata_wrapper('node', node_load($nid));
$value = $wrapper->field_something->value();
Le premier problème que j'ai est que je n'ai aucun moyen de savoir à l'avance si ce que j'obtiens est une valeur réelle (une chaîne, une entité, etc.), un autre wrapper de structure de métadonnées (lorsque les champs ont plusieurs valeurs) ou un tableau (lorsque les champs ont plusieurs propriétés).
J'ai trouvé un moyen de répondre à ces questions en utilisant la info()
méthode:
$info = $wrapper->field_something->info();
$is_multi_value = (strpos($info['type'], 'list<') === 0);
$has_multiple_properties = isset($info['property info']]);
Mais ce n'est guère pratique. Chaque fois que je veux utiliser un champ sans connaître sa définition au préalable, je dois prendre en compte plusieurs cas. Cela rend mon code assez lourd.
Pour y faire face, j'ai écrit du code qui:
- Garantit que nous recevons toujours un tableau, même s'il s'agit d'un champ à valeur unique;
- Lorsqu'il existe plusieurs propriétés, renvoyez la valeur de la première colonne.
Le point 1 ici fonctionnera toujours, à moins que l'appelant ne veuille savoir s'il s'agit d'un champ à valeur unique ou non. Le point 2 fonctionne dans certains cas, pas tous, mais est pratique lorsqu'il s'applique.
Voici le 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;
}
Ma question est donc la suivante: existe-t-il des moyens plus simples / meilleurs de résoudre ce problème d'obtention de valeurs à partir du wrapper de métadonnées lorsque le type de champ n'est pas connu?