hook_query_TAG_alter

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

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

Database abstraction layer
Allow the use of different database servers using the same code base.
Hooks
Define functions that alter the behavior of Drupal core.

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, '>=');
    }
  }
}
doc_Drupal
2016-10-29 09:18:27
Comments
Leave a Comment

Please login to continue.