function _views_test_query_access_restrict_by_uuid

Same name and namespace in other branches
  1. 8.9.x core/modules/views/tests/modules/views_test_query_access/views_test_query_access.module \_views_test_query_access_restrict_by_uuid()
  2. 10 core/modules/views/tests/modules/views_test_query_access/views_test_query_access.module \_views_test_query_access_restrict_by_uuid()
  3. 11.x core/modules/views/tests/modules/views_test_query_access/views_test_query_access.module \_views_test_query_access_restrict_by_uuid()

Excludes entities with the 'hidden-ENTITY_TYPE_ID' UUID from a query.

Parameters

\Drupal\Core\Database\Query\AlterableInterface $query: The Views select query to alter.

2 calls to _views_test_query_access_restrict_by_uuid()
views_test_query_access_query_block_content_access_alter in core/modules/views/tests/modules/views_test_query_access/views_test_query_access.module
Implements hook_query_TAG_alter() for the 'block_content_access' query tag.
views_test_query_access_query_media_access_alter in core/modules/views/tests/modules/views_test_query_access/views_test_query_access.module
Implements hook_query_TAG_alter() for the 'media_access' query tag.

File

core/modules/views/tests/modules/views_test_query_access/views_test_query_access.module, line 33

Code

function _views_test_query_access_restrict_by_uuid(AlterableInterface $query) {
    if (!$query instanceof SelectInterface) {
        return;
    }
    
    /** @var \Drupal\views\ViewExecutable $view */
    $view = $query->getMetaData('view');
    $entity_type = $view->getBaseEntityType();
    $storage = \Drupal::entityTypeManager()->getStorage($entity_type->id());
    if (!$storage instanceof SqlEntityStorageInterface) {
        return;
    }
    $table_mapping = $storage->getTableMapping();
    if (!$table_mapping instanceof DefaultTableMapping) {
        return;
    }
    $base_table = $table_mapping->getBaseTable();
    $data_table = $table_mapping->getDataTable();
    // We are excluding entities by UUID, which means we need to be certain the
    // base table is joined in the query.
    $tables = $query->getTables();
    if (isset($tables[$data_table]) && !isset($tables[$base_table])) {
        $data_table_alias = $tables[$data_table]['alias'];
        $id_key = $entity_type->getKey('id');
        $base_table = $query->innerJoin($base_table, NULL, "[{$data_table_alias}].[{$id_key}] = [{$base_table}].[{$id_key}]");
    }
    // Figure out the column name of the UUID field and add a condition on that.
    $base_field_definitions = \Drupal::service('entity_field.manager')->getBaseFieldDefinitions($entity_type->id());
    $uuid_key = $entity_type->getKey('uuid');
    $uuid_column_name = $table_mapping->getFieldColumnName($base_field_definitions[$uuid_key], NULL);
    $query->condition("{$base_table}.{$uuid_column_name}", 'hidden-' . $entity_type->id(), '<>');
}

Buggy or inaccurate documentation? Please file an issue. Need support? Need help programming? Connect with the Drupal community.