Comment obtenir des champs d'un certain type de champ?

13

J'ai vu comment obtenir des listes de champs par entité et regrouper avec field_info_instances()et field_info_field(), mais je ne vois pas de moyen d'obtenir tous les champs d'un type particulier.

J'ai pu cuisiner pour faire exactement ce que je veux:

function field_get_fields_of_type($type) {
  $fields_info = field_info_instances();
  $return = array();
  foreach ($fields_info as $entity => $bundles) {
    foreach ($bundles as $bundle => $fields) {
      foreach ($fields as $field_name => $info) {
        $more_info_because_type_isnt_included = field_info_field($field_name);
        if ( $more_info_because_type_isnt_included['type'] == $type) {
          $return[$field_name] = $more_info_because_type_isnt_included;
        }
      }
    }
  }
  return $return;
}

dpm(field_get_fields_of_type('entityreference')); // prints out all entityreference fields

Mais cela semble être énormément de code et énormément de boucles pour obtenir quelque chose qui devrait probablement être accessible via l'API de champ.

Quelqu'un connaît-il une fonction Field API qui récupérera plus efficacement les données que je recherche?

tmsimont
la source

Réponses:

23

Je suis tombé sur cela l'autre jour et je me suis souvenu avoir vu cette question, alors la voici, une fonction en quelque sorte très inconnue (je n'ai jamais vu personne le mentionner dans un blog ou quoi que ce soit):

field_read_fields ()

et la fonction compagnon:

field_read_instances ()

Par exemple, obtenez tous les champs de termes de taxonomie:

$taxonomy_fields = field_read_fields(array('type' => 'taxonomy_term_reference'));

Ou obtenez les instances d'un champ avec le nom d'une machine field_image:

$image_field_instances = field_read_instances(array('field_name' => 'field_image'));
rooby
la source