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
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
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 | 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, '>=' ); } } } |
Please login to continue.