function hook_query_TAG_alter

You are here

7 system.api.php hook_query_TAG_alter(QueryAlterableInterface $query)
8 system.api.php 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()

QueryAlterableInterface

SelectQueryInterface

Related topics

File

modules/system/system.api.php, line 3245
Hooks provided by Drupal core and the System module.

Code

function hook_query_TAG_alter(QueryAlterableInterface $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 (!user_access('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, '>=');
    }
  }
}

Comments

Heres a very simple but really handy example of use:
http://drupal.org/node/1157006#comment-7634027