diff --git a/contrib/search_api_views/search_api_views.views.inc b/contrib/search_api_views/search_api_views.views.inc index b55a85a..5490cc2 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,22 +194,11 @@ function _search_api_views_add_handlers($id, array $field, EntityMetadataWrapper } $info = $wrapper->info(); - if (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'; - } - 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') { $table[$id]['filter']['handler'] = 'SearchApiViewsHandlerFilterTaxonomyTerm'; - $info = $wrapper->info(); $field_info = field_info_field($info['name']); // For the "Parent terms" and "All parent terms" properties, we can // extrapolate the vocabulary from the parent in the selector. (E.g., @@ -221,10 +210,20 @@ function _search_api_views_add_handlers($id, array $field, EntityMetadataWrapper $field_info = field_info_field($parts[count($parts) - 2]); } } - if (isset($field_info['settings']['allowed_values'][0]['vocabulary'])) { - $table[$id]['filter']['vocabulary'] = $field_info['settings']['allowed_values'][0]['vocabulary']; + 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'; } @@ -293,3 +292,22 @@ function search_api_views_views_plugins() { return $ret; } + +/** + * Returns vocabulary machine name of a term field. + */ +function _search_api_views_get_field_vocabulary($field_info) { + // "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); + } + } + } +}