Como obtenho campos de um determinado tipo de campo?

13

Eu já vi como obter listas de campos por entidade e agrupar com field_info_instances()e field_info_field(), mas não estou vendo uma maneira de obter todos os campos de um tipo específico.

Consegui preparar isso para fazer exatamente o que eu quero:

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

Mas isso parece ser uma enorme quantidade de código e muito loop para obter algo que provavelmente deve ser alcançável por meio da API de campo.

Alguém sabe de uma função da API de campo que recuperará com mais eficiência os dados que estou procurando?

tmsimont
fonte

Respostas:

23

Me deparei com isso outro dia e lembrei de ter visto essa pergunta, então aqui está, uma função de alguma forma muito desconhecida (eu nunca vi alguém mencionar isso em um blog ou algo assim):

field_read_fields ()

e a função complementar:

field_read_instances ()

Por exemplo, obtenha todos os campos de termos de taxonomia:

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

Ou obtenha as instâncias para um campo com o nome de uma máquina field_image:

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