You are here

entityreference_filter.views.inc in Views Reference Filter 8

Same filename and directory in other branches
  1. 7 entityreference_filter.views.inc

Contains views hooks.

File

entityreference_filter.views.inc
View source
<?php

/**
 * @file
 * Contains views hooks.
 */
use Drupal\Core\Entity\ContentEntityTypeInterface;
use Drupal\field\Entity\FieldStorageConfig;

/**
 * Implements hook_views_data_alter().
 */
function entityreference_filter_views_data_alter(array &$data) {

  // Apply to entity reference fields, nid, uid, tid and commerce variations.
  foreach ($data as $table_name => $table_info) {
    foreach ($table_info as $field_name => $field_info) {
      $base_table = NULL;
      $target_entity_type = NULL;
      if ($field_name === 'nid') {
        $target_entity_type = 'node';
      }
      elseif ($field_name === 'uid') {
        $target_entity_type = 'user';
      }
      elseif ($field_name === 'tid') {
        $target_entity_type = 'taxonomy_term';
      }
      elseif (mb_strpos($table_name, 'commerce_product') !== FALSE) {

        // Commerce product variations.
        if ($field_name === 'variation_id' || mb_substr($field_name, -10) === '_target_id' && $field_info['filter']['field_name'] === 'variations') {
          $target_entity_type = 'commerce_product_variation';
        }

        // Commerce product.
        if ($field_name === 'product_id') {
          $target_entity_type = 'commerce_product';
        }
      }
      elseif (!empty($field_info['filter']['field_name']) && !empty($field_info['filter']['entity_type']) && mb_substr($field_name, -10) === '_target_id') {
        $entity_type = $field_info['filter']['entity_type'];
        $entity_field_name = $field_info['filter']['field_name'];
        $field_storage_config = FieldStorageConfig::loadByName($entity_type, $entity_field_name);
        if (!is_null($field_storage_config)) {
          $target_entity_type = $field_storage_config
            ->getSetting('target_type');
        }
      }
      if (!$target_entity_type) {
        continue;
      }

      /** @var \Drupal\Core\Entity\EntityTypeInterface $entity_type_info */
      $target_entity_type_info = Drupal::entityTypeManager()
        ->getDefinition($target_entity_type);

      // Content entities.
      if ($target_entity_type_info instanceof ContentEntityTypeInterface) {
        $base_table = $target_entity_type_info
          ->getDataTable();
        if (!$base_table) {
          $base_table = $target_entity_type_info
            ->getBaseTable();
        }
      }

      // @todo Config entities support.
      if (empty($base_table)) {
        continue;
      }
      if ($base_table && !empty($field_info['filter']['id']) && $field_info['filter']['id'] !== 'entityreference_filter_view_result') {
        $filter = $field_info;

        // Filter title.

        /** @var \Drupal\Core\StringTranslation\TranslatableMarkup $title */
        $title = !empty($field_info['filter']['title']) ? $field_info['filter']['title'] : $field_info['title'];
        $title .= '';
        $filter['title'] = t('@title (entityreference filter)', [
          '@title' => $title,
        ]);

        // Filter title short.

        /** @var \Drupal\Core\StringTranslation\TranslatableMarkup $title */
        $title_short = !empty($field_info['filter']['title short']) ? $field_info['filter']['title short'] : $field_info['title'];
        $title_short .= '';
        $filter['title short'] = t('@title (ef)', [
          '@title' => $title_short,
        ]);
        $filter['filter']['id'] = 'entityreference_filter_view_result';

        // @todo do we need it ?
        $filter['filter']['proxy'] = $field_info['filter']['handler'] ?? NULL;
        $filter['filter']['field'] = $field_name;
        $filter['filter']['filter_base_table'] = $base_table;

        // Adds only filter field.
        unset($filter['filter']['title'], $filter['argument'], $filter['field'], $filter['relationship'], $filter['sort']);
        $data[$table_name][$field_name . '_entityreference_filter'] = $filter;
      }
    }
  }
}