Как получить поля определенного типа?

13

Я видел, как получить списки полей по сущности и связке с field_info_instances()и field_info_field(), но я не вижу способа получить все поля определенного типа.

Я был в состоянии приготовить это, чтобы сделать именно то, что я хочу:

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

Но это, кажется, очень много кода и очень много циклов, чтобы получить что-то, что, вероятно, должно быть доступно через полевой API.

Кто-нибудь знает функцию Field API, которая будет более эффективно извлекать данные, которые я ищу?

tmsimont
источник

Ответы:

23

Я столкнулся с этим на днях и вспомнил, что видел этот вопрос, так что вот он, как-то очень неизвестная функция (я никогда не видел, чтобы кто-нибудь упоминал об этом в блоге или что-то еще):

field_read_fields ()

и сопутствующая функция:

field_read_instances ()

Например, получить все поля терминов таксономии:

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

Или получите экземпляры для поля с именем машины field_image:

$image_field_instances = field_read_instances(array('field_name' => 'field_image'));
rooby
источник