Jak uzyskać pola określonego typu?

13

Widziałem, jak uzyskać listy pól według encji i paczki z field_info_instances()i field_info_field(), ale nie widzę sposobu na uzyskanie wszystkich pól określonego typu.

Byłem w stanie to ugotować, aby robić dokładnie to, co chcę:

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

Ale wydaje się, że to okropnie dużo kodu i okropnie dużo zapętleń, aby uzyskać coś, co prawdopodobnie powinno być osiągalne za pośrednictwem interfejsu API pola.

Czy ktoś wie o funkcji Field API, która bardziej efektywnie pobiera dane, których szukam?

tmsimont
źródło

Odpowiedzi:

23

Natknąłem się na to pewnego dnia i przypomniałem sobie, że widziałem to pytanie, więc oto jakoś bardzo nieznana funkcja (nigdy nie widziałem, żeby ktoś wspominał o tym na blogu lub czymkolwiek):

field_read_fields ()

oraz funkcja towarzysząca:

field_read_instances ()

Na przykład uzyskaj wszystkie pola terminów taksonomii:

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

Lub uzyskaj instancje dla pola o nazwie komputera field_image:

$image_field_instances = field_read_instances(array('field_name' => 'field_image'));
dureń
źródło