You are here

function hook_query_TAG_alter in Zircon Profile 8.0

Same name and namespace in other branches
  1. 8 core/lib/Drupal/Core/Database/database.api.php \hook_query_TAG_alter()

Perform alterations to a structured query for a given tag.

Parameters

$query: An Query object describing the composite parts of a SQL query.

See also

hook_query_alter()

node_query_node_access_alter()

AlterableInterface

SelectInterface

Related topics

7 functions implement hook_query_TAG_alter()

Note: this list is generated by pattern matching, so it may include some functions that are not actually implementations of this hook.

database_test_query_database_test_alter_remove_range_alter in core/modules/system/tests/modules/database_test/database_test.module
Implements hook_query_TAG_alter().
field_test_query_efq_metadata_test_alter in core/modules/field/tests/modules/field_test/field_test.module
Implements hook_query_TAG_alter() for tag 'efq_metadata_test'.
field_test_query_efq_table_prefixing_test_alter in core/modules/field/tests/modules/field_test/field_test.module
Implements hook_query_TAG_alter() for tag 'efq_table_prefixing_test'.
node_query_node_access_alter in core/modules/node/node.module
Implements hook_query_TAG_alter().
search_query_alter_query_search_node_search_alter in core/modules/search/tests/modules/search_query_alter/search_query_alter.module
Implements hook_query_TAG_alter(): tag search_$type with $type node_search.

... See full list

File

core/lib/Drupal/Core/Database/database.api.php, line 422
Hooks related to the Database system and the Schema API.

Code

function hook_query_TAG_alter(Drupal\Core\Database\Query\AlterableInterface $query) {

  // Skip the extra expensive alterations if site has no node access control modules.
  if (!node_access_view_all_nodes()) {

    // Prevent duplicates records.
    $query
      ->distinct();

    // The recognized operations are 'view', 'update', 'delete'.
    if (!($op = $query
      ->getMetaData('op'))) {
      $op = 'view';
    }

    // Skip the extra joins and conditions for node admins.
    if (!\Drupal::currentUser()
      ->hasPermission('bypass node access')) {

      // The node_access table has the access grants for any given node.
      $access_alias = $query
        ->join('node_access', 'na', '%alias.nid = n.nid');
      $or = db_or();

      // If any grant exists for the specified user, then user has access to the node for the specified operation.
      foreach (node_access_grants($op, $query
        ->getMetaData('account')) as $realm => $gids) {
        foreach ($gids as $gid) {
          $or
            ->condition(db_and()
            ->condition($access_alias . '.gid', $gid)
            ->condition($access_alias . '.realm', $realm));
        }
      }
      if (count($or
        ->conditions())) {
        $query
          ->condition($or);
      }
      $query
        ->condition($access_alias . 'grant_' . $op, 1, '>=');
    }
  }
}