monster_menus-9.0.x-dev/modules/mm_fields/mm_fields.views.inc

modules/mm_fields/mm_fields.views.inc
<?php

use Drupal\field\FieldStorageConfigInterface;
use Drupal\Core\Entity\Sql\DefaultTableMapping;

/**
 * Implements hook_field_views_data().
 */
function mm_fields_field_views_data(FieldStorageConfigInterface $field) {
  $data = views_field_default_views_data($field);
  foreach ($data as $table_name => $table_data) {
    foreach ($table_data as $field_name => $field_data) {
      if (isset($field_data['filter']) && $field_name != 'delta') {
        // Filter: swap the handler to the 'in' operator.
        $data[$table_name][$field_name]['filter']['id'] = 'many_to_one';
      }
    }

    if ($field->getType() == 'mm_catlist') {
      // Relationship: add a relationship for related MM page.
      $field_name = $field->getName() . '_' . $field->getMainPropertyName();
      [$label] = views_entity_field_label('node', $field->getName());
      $data[$table_name][$field_name . '_contents']['relationship'] = [
        'base' => 'node_field_data',
        'base field' => 'nid',
        'label' => t('Page contents referred to by @field.', ['@field' => $label]),
        'id' => 'sequential_join',
        'joins' => [
          [
            'left table' => $table_name,
            'left field' => $field_name,
            'table' => 'mm_node2tree',
            'field' => 'mmtid',
          ],
          [
            'left field' => 'nid',
            'table' => 'node_field_data',
            'field' => 'nid',
          ],
        ],
      ];
    }
  }
  return $data;
}

/**
 * Implements hook_field_views_data_views_data_alter().
 *
 * Views integration to provide reverse relationships on mm_catlist fields.
 */
function mm_fields_field_views_data_views_data_alter(array &$data, FieldStorageConfigInterface $field_storage) {
  if ($field_storage->getType() != 'mm_catlist') {
    return;
  }
  $entity_type_id = $field_storage->getTargetEntityTypeId();
  $field_name = $field_storage->getName();
  $entity_type_manager = \Drupal::entityTypeManager();
  $entity_type = $entity_type_manager->getDefinition($entity_type_id);
  $pseudo_field_name = 'reverse_' . $field_name . '_' . $entity_type_id;
  /** @var DefaultTableMapping $table_mapping */
  $table_mapping = $entity_type_manager->getStorage($entity_type_id)->getTableMapping();
  [$label] = views_entity_field_label($entity_type_id, $field_name);

  $data['node_field_data'][$pseudo_field_name]['relationship'] = [
    'title' => t('@entity using @field', ['@entity' => $entity_type->getLabel(), '@field' => $label]),
    'label' => t('@field_name', ['@field_name' => $field_name]),
    'help' => t('Relate page contents to a @field field.', ['@field' => $label]),
    'group' => $entity_type->getLabel(),
    'base' => $entity_type->getDataTable() ?: $entity_type->getBaseTable(),
    'entity_type' => $entity_type_id,
//    'base field' => $entity_type->getKey('id'),
    'id' => 'sequential_join',
    'joins' => [
      [
        'left table' => 'node_field_data',
        'left field' => 'nid',
        'table' => 'mm_node2tree',
        'field' => 'nid',
      ],
      [
        'left field' => 'mmtid',
        'table' => $table_mapping->getDedicatedDataTableName($field_storage),
        'field' => $field_name . '_' . $field_storage->getMainPropertyName(),
      ],
      [
        'left field' => 'entity_id',
        'table' => 'node_field_data',
        'field' => 'nid',
      ],
    ],
  ];
}

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

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