Skip to content
Snippets Groups Projects

Draft: Detect and update entity reference base field filters.

1 file
+ 46
7
Compare changes
  • Side-by-side
  • Inline
@@ -5,6 +5,7 @@
* Views data altering to opt-in to use the entity reference plugin in Core.
*/
use Drupal\Core\Field\FieldDefinitionInterface;
use Drupal\Core\Routing\RouteMatchInterface;
/**
@@ -32,6 +33,7 @@ function views_core_entity_reference_help($route_name, RouteMatchInterface $arg)
* Implements hook_views_data_alter().
*/
function views_core_entity_reference_views_data_alter(&$data) {
// Detect and setup fieldable field filters.
$manager = \Drupal::entityTypeManager();
$field_config_storage = $manager->getStorage('field_config');
/** @var \Drupal\field\FieldConfigInterface[] $field_configs */
@@ -39,13 +41,50 @@ function views_core_entity_reference_views_data_alter(&$data) {
'field_type' => 'entity_reference',
]);
foreach ($field_configs as $field_config) {
$table_name = $field_config->getTargetEntityTypeId() . '__' . $field_config->getName();
$column_name = $field_config->getName() . '_target_id';
if (
isset($data[$table_name][$column_name]['filter']['id'])
&& in_array($data[$table_name][$column_name]['filter']['id'], ['numeric', 'string'])
) {
$data[$table_name][$column_name]['filter']['id'] = 'entity_reference';
_views_core_entity_reference_define_filter($data, $field_config, FALSE);
}
// Detect and setup base field filters.
$entity_field_manager = \Drupal::service('entity_field.manager');
$entity_types = \Drupal::entityTypeManager()->getDefinitions();
foreach ($entity_types as $entity_type_id => $entity_type) {
try {
$base_fields = $entity_field_manager->getBaseFieldDefinitions($entity_type_id);
/** @var \Drupal\Core\Field\BaseFieldDefinition $field_definition */
foreach ($base_fields as $field_definition) {
if ('entity_reference' === $field_definition->getType()) {
_views_core_entity_reference_define_filter($data, $field_definition, TRUE);
}
}
}
catch (\Exception $e) {
// Ignore errors like "Getting the base fields is not supported for
// entity type Block.".
continue;
}
}
}
/**
* Update filter type to reference field filters.
*
* @param array $data
* Current views entity settings.
* @param \Drupal\Core\Field\FieldDefinitionInterface $fieldDefinition
* Field to fix.
* @param bool $isBaseField
* TRUE if the field is a base field.
*/
function _views_core_entity_reference_define_filter(&$data, FieldDefinitionInterface $fieldDefinition, bool $isBaseField) {
$table_name = $fieldDefinition->getTargetEntityTypeId();
$column_name = $fieldDefinition->getName();
if (!$isBaseField) {
$table_name .= '__' . $fieldDefinition->getName();
$column_name .= '_target_id';
}
if (
isset($data[$table_name][$column_name]['filter']['id'])
&& in_array($data[$table_name][$column_name]['filter']['id'], ['numeric', 'string'])
) {
$data[$table_name][$column_name]['filter']['id'] = 'entity_reference';
}
}
Loading