public function getViewsFieldData(FieldStorageConfigInterface $field_storage) { // Make sure views.views.inc is loaded. module_load_include('inc', 'views', 'views.views'); // Get the default data from the views module. $data = views_field_default_views_data($field_storage); // Loop through all of the results and set our overrides. foreach ($data as $table_name => $table_data) { foreach ($table_data as $field_name => $field_data) { // only modify fields. if ($field_name != 'delta') { if (isset($field_data['field'])) { // Use our own field handler. $data[$table_name][$field_name]['field']['id'] = 'geolocation_field'; $data[$table_name][$field_name]['field']['click sortable'] = FALSE; } if (isset($field_data['filter'])) { // The default filters aren't useful at all so remove them. unset($data[$table_name][$field_name]['filter']); } if (isset($field_data['argument'])) { // The default arguments aren't useful at all so remove them. unset($data[$table_name][$field_name]['argument']); } if (isset($field_data['sort'])) { // The default arguments aren't useful at all so remove them. unset($data[$table_name][$field_name]['sort']); } } } $args = ['@field_name' => $field_storage->getName()]; $target_entity_type = \Drupal::entityManager()->getDefinition($field_storage->getTargetEntityTypeId()); $field_coordinates_table_data = $data[$target_entity_type->getBaseTable() . '__' . $field_storage->getName()][$field_storage->getName()]; // Add proximity handlers. $data[$table_name][$args['@field_name'] . '_proximity'] = ['group' => 'Content', 'title' => $this->t('Proximity (@field_name)', $args), 'title short' => $field_coordinates_table_data['title short'] . t(":proximity"), 'help' => $field_coordinates_table_data['help'], 'argument' => ['id' => 'geolocation_argument_proximity', 'table' => $table_name, 'entity_type' => $field_storage->get('entity_type'), 'field_name' => $args['@field_name'] . '_proximity', 'real field' => $args['@field_name'], 'label' => $this->t('Distance to !field_name', $args), 'empty field name' => '- No value -', 'additional fields' => [$args['@field_name'] . '_lat', $args['@field_name'] . '_lng', $args['@field_name'] . '_lat_sin', $args['@field_name'] . '_lat_cos', $args['@field_name'] . '_lng_rad']], 'filter' => ['id' => 'geolocation_filter_proximity', 'table' => $table_name, 'entity_type' => $field_storage->get('entity_type'), 'field_name' => $args['@field_name'] . '_proximity', 'real field' => $args['@field_name'], 'label' => $this->t('Distance to !field_name', $args), 'allow empty' => TRUE, 'additional fields' => [$args['@field_name'] . '_lat', $args['@field_name'] . '_lng', $args['@field_name'] . '_lat_sin', $args['@field_name'] . '_lat_cos', $args['@field_name'] . '_lng_rad']], 'field' => ['table' => $table_name, 'id' => 'geolocation_field_proximity', 'field_name' => $args['@field_name'] . '_proximity', 'entity_type' => $field_storage->get('entity_type'), 'real field' => $args['@field_name'], 'additional fields' => [$args['@field_name'] . '_lat', $args['@field_name'] . '_lng', $args['@field_name'] . '_lat_sin', $args['@field_name'] . '_lat_cos', $args['@field_name'] . '_lng_rad'], 'element type' => 'div', 'is revision' => isset($table_data[$args['@field_name']]['field']['is revision']) && $table_data[$args['@field_name']]['field']['is revision'], 'click sortable' => TRUE], 'sort' => ['table' => $table_name, 'id' => 'geolocation_sort_proximity', 'field_name' => $args['@field_name'] . '_proximity', 'entity_type' => $field_storage->get('entity_type'), 'real field' => $args['@field_name']]]; } return $data; }
/** * Override the default Views data for a Field API field. * * The field module's implementation of hook_views_data() invokes this for each * field storage, in the module that defines the field type. It is not invoked * in other modules. * * If no hook implementation exists, hook_views_data() falls back to * views_field_default_views_data(). * * @param \Drupal\field\FieldStorageConfigInterface $field_storage * The field storage config entity. * * @return array * An array of views data, in the same format as the return value of * hook_views_data(). * * @see views_views_data() * @see hook_field_views_data_alter() * @see hook_field_views_data_views_data_alter() */ function hook_field_views_data(\Drupal\field\FieldStorageConfigInterface $field_storage) { $data = views_field_default_views_data($field_storage); foreach ($data as $table_name => $table_data) { // Add the relationship only on the target_id field. $data[$table_name][$field_storage->getName() . '_target_id']['relationship'] = array('id' => 'standard', 'base' => 'file_managed', 'base field' => 'target_id', 'label' => t('image from !field_name', array('!field_name' => $field_storage->getName()))); } return $data; }