geolocation-8.x-3.x-dev/modules/geolocation_geometry/src/Hook/Views.php

modules/geolocation_geometry/src/Hook/Views.php
<?php

namespace Drupal\geolocation_geometry\Hook;

use Drupal\Core\Hook\Attribute\Hook;
use Drupal\field\FieldStorageConfigInterface;

/**
 * Hook implementations for geolocation_geometry module views functionality.
 */
class Views {

  /**
   * Implements hook_field_views_data().
   */
  #[Hook('field_views_data')]
  public function fieldViewsData(FieldStorageConfigInterface $field_storage): array {

    $geometry_fields = [];
    foreach (
      [
        'geolocation',
        'geolocation_geometry_geometry',
        'geolocation_geometry_polygon',
        'geolocation_geometry_multipolygon',
        'geolocation_geometry_linestring',
        'geolocation_geometry_multilinestring',
        'geolocation_geometry_point',
        'geolocation_geometry_multipoint',
      ] as $field_type
    ) {
      foreach (\Drupal::service('entity_field.manager')->getFieldMapByFieldType($field_type) as $entity_type_id => $geometry_field_list) {
        /** @var \Drupal\Core\Entity\Sql\SqlEntityStorageInterface $entity_storage */
        $entity_storage = \Drupal::entityTypeManager()->getStorage($entity_type_id);
        $entity_definition = \Drupal::entityTypeManager()->getDefinition($entity_type_id);
        $entity_table_mapping = $entity_storage->getTableMapping();
        $entity_label = $entity_definition->getLabel();
        foreach ($geometry_field_list as $geometry_field_name => $geometry_field_data) {
          $geometry_field_id = $entity_type_id . '__' . $geometry_field_name;
          $geometry_fields[$geometry_field_id] = $geometry_field_data;
          $geometry_fields[$geometry_field_id]['field_type'] = $field_type;
          $geometry_fields[$geometry_field_id]['entity_type'] = $entity_type_id;
          $geometry_fields[$geometry_field_id]['entity_id_field'] = $entity_definition->getKey('id');
          // @phpstan-ignore-next-line
          $geometry_fields[$geometry_field_id]['entity_data_table'] = $entity_table_mapping->getDataTable();
          $geometry_fields[$geometry_field_id]['entity_label'] = $entity_label;
          $geometry_fields[$geometry_field_id]['geometry_field_name'] = $geometry_field_name;
          $geometry_fields[$geometry_field_id]['geometry_field_table'] = $entity_table_mapping->getFieldTableName($geometry_field_name);
        }
      }
    }

    $entity_definition = \Drupal::entityTypeManager()->getDefinition($field_storage->getTargetEntityTypeId());
    $entity_type_storage = \Drupal::entityTypeManager()->getStorage($entity_definition->getBundleEntityType());

    $bundle_labels = [];
    foreach ($field_storage->getBundles() as $bundle_id) {
      $bundle_labels[] = $entity_type_storage->load($bundle_id)->label();
    }

    // Get the default data from the views module.
    if (\Drupal::hasService('views.field_data_provider')) {
      $data = \Drupal::service('views.field_data_provider')->defaultFieldImplementation($field_storage);
    }
    // Compatibility with D10. Remove after D12.
    elseif (function_exists('views_field_default_views_data')) {
      // @phpstan-ignore-next-line
      $data = views_field_default_views_data($field_storage);
    }
    else {
      return [];
    }

    $args = ['@field_name' => $field_storage->getName()];

    // Loop through all the results and set our overrides.
    foreach ($data as $table_name => $table_data) {
      $data[$table_name]['table']['entity type'] = $field_storage->getTargetEntityTypeId();
      foreach ($table_data as $field_name => $field_data) {
        // Only modify fields.
        if ($field_name == 'delta') {
          continue;
        }
        if (isset($field_data['filter'])) {
          if (str_ends_with($field_name, '_geometry')) {
            $data[$table_name][$field_name]['title'] = t('Geometry (@field_name)', $args);
            continue;
          }
          if (str_ends_with($field_name, '_geojson')) {
            $data[$table_name][$field_name]['title'] = t('GeoJSON (@field_name)', $args);
            continue;
          }
          // The default filters are mostly not useful except lat/lng.
          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']);
        }
      }

      $title_short = '';

      $help = t('Appears in: @bundles.', ['@bundles' => implode(', ', $bundle_labels)]);

      // Add proximity handlers.
      $data[$table_name][$args['@field_name'] . '_proximity'] = [
        'group' => $entity_definition->getLabel(),
        'title' => t('Geo Proximity (@field_name)', $args),
        'title short' => $title_short . ' - ' . t("Geo Proximity"),
        'help' => $help,
        'argument' => [
          'id' => 'geolocation_geometry_argument_proximity',
          'table' => $table_name,
          'entity_type' => $field_storage->getTargetEntityTypeId(),
          'field_name' => $args['@field_name'] . '_proximity',
          'real field' => $args['@field_name'],
          'label' => t('Geo Distance to !field_name', $args),
          'empty field name' => '- No value -',
          'additional fields' => [
            $args['@field_name'] . '_geometry',
          ],
        ],
        'filter' => [
          'id' => 'geolocation_geometry_filter_proximity',
          'table' => $table_name,
          'entity_type' => $field_storage->getTargetEntityTypeId(),
          'field_name' => $args['@field_name'] . '_proximity',
          'real field' => $args['@field_name'],
          'label' => t('Geo Distance to !field_name', $args),
          'allow empty' => TRUE,
          'additional fields' => [
            $args['@field_name'] . '_geometry',
          ],
        ],
        'field' => [
          'table' => $table_name,
          'id' => 'geolocation_geometry_field_proximity',
          'field_name' => $args['@field_name'] . '_proximity',
          'entity_type' => $field_storage->getTargetEntityTypeId(),
          'real field' => $args['@field_name'],
          'float' => TRUE,
          'additional fields' => [
            $args['@field_name'] . '_geometry',
          ],
          '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->getTargetEntityTypeId(),
          'real field' => $args['@field_name'],
        ],
      ];

      // Add boundary handlers.
      $data[$table_name][$args['@field_name'] . '_boundary'] = [
        'group' => $entity_definition->getLabel(),
        'title' => t('Geo Boundary (@field_name)', $args),
        'title short' => $title_short . ' - ' . t("Boundary"),
        'help' => $help,
        'argument' => [
          'id' => 'geolocation_geometry_argument_boundary',
          'table' => $table_name,
          'entity_type' => $field_storage->getTargetEntityTypeId(),
          'field_name' => $args['@field_name'] . '_boundary',
          'real field' => $args['@field_name'],
          'label' => t('Geo Boundaries around !field_name', $args),
          'empty field name' => '- No value -',
          'additional fields' => [
            $args['@field_name'] . '_geometry',
          ],
        ],
        'filter' => [
          'id' => 'geolocation_geometry_filter_boundary',
          'table' => $table_name,
          'entity_type' => $field_storage->getTargetEntityTypeId(),
          'field_name' => $args['@field_name'] . '_boundary',
          'real field' => $args['@field_name'],
          'label' => t('Geo Boundaries around !field_name', $args),
          'allow empty' => TRUE,
          'additional fields' => [
            $args['@field_name'] . '_geometry',
          ],
        ],
      ];

      foreach ($geometry_fields as $geometry_field_id => $geometry_field_data) {
        if ($field_storage->getName() == $geometry_field_data['geometry_field_name'] && $field_storage->getTargetEntityTypeId() == $geometry_field_data['entity_type']) {
          continue;
        }
        $data[$table_name][$geometry_field_id] = [
          'group' => t('Geolocation Geometry'),
          'title' => t('Geolocation Geometry'),
          'title short' => t('Geolocation Geometry'),
          'help' => $help,
          'relationship' => [
            'title' => t('@entity_type (@field_name) via @source_field_name', [
              '@source_field_name' => $field_storage->getName(),
              '@entity_type' => $geometry_field_data['entity_label'],
              '@field_name' => $geometry_field_data['geometry_field_name'],
            ]),
            'label' => t('@entity_type (@field_name) via @source_field_name', [
              '@source_field_name' => $field_storage->getName(),
              '@entity_type' => $geometry_field_data['entity_label'],
              '@field_name' => $geometry_field_data['geometry_field_name'],
            ]),
            'group' => t('Geolocation Geometry'),
            'id' => 'geolocation_geometry',
            'field_type' => $field_storage->getType(),
            'table' => $table_name,
            'field' => $field_storage->getName(),
            'relationship field' => $geometry_field_data['geometry_field_name'],
            'relationship table' => $geometry_field_data['geometry_field_table'],
            'base' => $geometry_field_data['entity_data_table'],
            'base field' => $geometry_field_data['entity_id_field'],
          ],
        ];
      }
    }

    return $data;
  }

  /**
   * Implements hook_field_views_data_views_data_alter().
   */
  #[Hook('field_views_data_views_data_alter')]
  public function fieldViewsDataViewsDataAlter(array &$data, FieldStorageConfigInterface $field_storage): void {
    $entity_type_id = $field_storage->getTargetEntityTypeId();
    /** @var \Drupal\Core\Entity\Sql\SqlEntityStorageInterface $entity_storage */
    $entity_storage = \Drupal::entityTypeManager()->getStorage($entity_type_id);
    $entity_definition = \Drupal::entityTypeManager()->getDefinition($entity_type_id);
    $entity_table_mapping = $entity_storage->getTableMapping();
    $entity_label = $entity_definition->getLabel();
    $entity_type_storage = \Drupal::entityTypeManager()->getStorage($entity_definition->getBundleEntityType());

    $bundle_labels = [];
    foreach ($field_storage->getBundles() as $bundle_id) {
      $bundle_labels[] = $entity_type_storage->load($bundle_id)->label();
    }

    $geometry_field_id = $entity_type_id . '__' . $field_storage->getName();
    $geometry_field_data = [
      'field_type' => $field_storage->getType(),
      'entity_type' => $entity_type_id,
      'entity_id_field' => $entity_definition->getKey('id'),
      // @phpstan-ignore-next-line
      'entity_data_table' => $entity_table_mapping->getDataTable(),
      'entity_label' => $entity_label,
      'geometry_field_name' => $field_storage->getName(),
      'geometry_field_table' => $entity_table_mapping->getFieldTableName($field_storage->getName()),
    ];

    foreach (\Drupal::service('entity_field.manager')->getFieldMapByFieldType('geolocation') as $entity_type => $geolocation_fields) {
      /** @var \Drupal\Core\Entity\Sql\DefaultTableMapping $geolocation_table_mapping */
      // @phpstan-ignore-next-line
      $geolocation_table_mapping = \Drupal::entityTypeManager()->getStorage($entity_type)->getTableMapping();

      foreach ($geolocation_fields as $geolocation_field_name => $geolocation_field_data) {
        $geolocation_field_table_name = $geolocation_table_mapping->getFieldTableName($geolocation_field_name);
        if (empty($data[$geolocation_field_table_name])) {
          continue;
        }

        $help = t('Appears in: @bundles.', ['@bundles' => implode(', ', $bundle_labels)]);

        $data[$geolocation_field_table_name][$geometry_field_id] = [
          'group' => t('Geolocation Geometry'),
          'title' => t('Geolocation Geometry'),
          'title short' => t('Geolocation Geometry'),
          'help' => $help,
          'relationship' => [
            'title' => t('@entity_type (@field_name) via @source_field_name', [
              '@source_field_name' => $geolocation_field_name,
              '@entity_type' => $geometry_field_data['entity_label'],
              '@field_name' => $geometry_field_data['geometry_field_name'],
            ]),
            'label' => t('@entity_type (@field_name) via @source_field_name', [
              '@source_field_name' => $geolocation_field_name,
              '@entity_type' => $geometry_field_data['entity_label'],
              '@field_name' => $geometry_field_data['geometry_field_name'],
            ]),
            'group' => t('Geolocation Geometry'),
            'id' => 'geolocation_geometry',
            'field_type' => 'geolocation',
            'table' => $geolocation_field_table_name,
            'field' => $geolocation_field_name,
            'relationship field' => $geometry_field_data['geometry_field_name'],
            'relationship table' => $geometry_field_data['geometry_field_table'],
            'base' => $geometry_field_data['entity_data_table'],
            'base field' => $geometry_field_data['entity_id_field'],
          ],
        ];
      }
    }

  }

}

Главная | Обратная связь

drupal hosting | друпал хостинг | it patrol .inc