diff --git a/contrib/search_api_views/search_api_views.views.inc b/contrib/search_api_views/search_api_views.views.inc index a021186..bd138fe 100644 --- a/contrib/search_api_views/search_api_views.views.inc +++ b/contrib/search_api_views/search_api_views.views.inc @@ -134,8 +134,8 @@ function search_api_views_views_data() { if (isset($field['entity_type']) && $field['entity_type'] === 'taxonomy_term') { $field_id = ($pos = strrpos($key, ':')) ? substr($key, $pos + 1) : $key; $field_info = field_info_field($field_id); - if (isset($field_info['settings']['allowed_values'][0]['vocabulary'])) { - $vocabulary_fields[$field_info['settings']['allowed_values'][0]['vocabulary']][] = $key; + if ($vocabulary = _search_api_views_get_field_vocabulary($field_info)) { + $vocabulary_fields[$vocabulary][] = $key; } else { $vocabulary_fields[''][] = $key; @@ -194,13 +194,7 @@ function _search_api_views_add_handlers($id, array $field, EntityMetadataWrapper } $info = $wrapper->info(); - if ($inner_type == 'boolean') { - $table[$id]['filter']['handler'] = 'SearchApiViewsHandlerFilterBoolean'; - } - elseif ($inner_type == 'date') { - $table[$id]['filter']['handler'] = 'SearchApiViewsHandlerFilterDate'; - } - elseif (isset($field['entity_type']) && $field['entity_type'] === 'user') { + if (isset($field['entity_type']) && $field['entity_type'] === 'user') { $table[$id]['filter']['handler'] = 'SearchApiViewsHandlerFilterUser'; } elseif (isset($field['entity_type']) && $field['entity_type'] === 'taxonomy_term') { @@ -216,21 +210,20 @@ function _search_api_views_add_handlers($id, array $field, EntityMetadataWrapper $field_info = field_info_field($parts[count($parts) - 2]); } } - // "Terms reference" vocabulary - if (isset($field_info['settings']['allowed_values'][0]['vocabulary'])) { - $table[$id]['filter']['vocabulary'] = $field_info['settings']['allowed_values'][0]['vocabulary']; - } - // "Entity reference" vocabulary - elseif (isset($field_info['settings']['handler']) && $field_info['settings']['handler'] === 'base') { - if (!empty($field_info['settings']['handler_settings']['target_bundles'])) { - $table[$id]['filter']['vocabulary'] = key($field_info['settings']['handler_settings']['target_bundles']); - } + if ($vocabulary = _search_api_views_get_field_vocabulary($field_info)) { + $table[$id]['filter']['vocabulary'] = $vocabulary; } } elseif (isset($info['options list']) && is_callable($info['options list'])) { $table[$id]['filter']['handler'] = 'SearchApiViewsHandlerFilterOptions'; $table[$id]['filter']['multi-valued'] = search_api_is_list_type($type); } + elseif ($inner_type == 'boolean') { + $table[$id]['filter']['handler'] = 'SearchApiViewsHandlerFilterBoolean'; + } + elseif ($inner_type == 'date') { + $table[$id]['filter']['handler'] = 'SearchApiViewsHandlerFilterDate'; + } else { $table[$id]['filter']['handler'] = 'SearchApiViewsHandlerFilter'; } @@ -299,3 +292,24 @@ function search_api_views_views_plugins() { return $ret; } + +/** + * Returns vocabulary machine name of a term field. + */ +function _search_api_views_get_field_vocabulary($field_id) { + if ($field_info = field_info_field($field_id)) { + // "Terms reference" vocabulary. + if (isset($field_info['settings']['allowed_values'][0]['vocabulary'])) { + return $field_info['settings']['allowed_values'][0]['vocabulary']; + } + // "Entity reference" vocabulary. + elseif (isset($field_info['settings']['handler']) && $field_info['settings']['handler'] === 'base') { + if (!empty($field_info['settings']['handler_settings']['target_bundles'])) { + $bundles = $field_info['settings']['handler_settings']['target_bundles']; + if (count($bundles) == 1) { + return key($bundles); + } + } + } + } +}