diff options
Diffstat (limited to 'modules/node/node.module')
-rw-r--r-- | modules/node/node.module | 45 |
1 files changed, 22 insertions, 23 deletions
diff --git a/modules/node/node.module b/modules/node/node.module index adb807437..a8fd56528 100644 --- a/modules/node/node.module +++ b/modules/node/node.module @@ -2341,35 +2341,34 @@ function node_db_rewrite_sql($query, $primary_table, $primary_field) { } } - /** * Implementation of hook_query_alter(). - * @todo This doesn't quite work yet. */ -function DISABLED_node_query_alter(Query $query) { - if ($query->hasTag('node_access')) { - if (! user_access('administer nodes')) { - $query->distinct(); - $access_alias = $query->join('node_access', 'na', 'na.nid = n.nid'); - dsm('hello'); - _node_query_alter_where($query, 'view', $access_alias); +function node_query_alter(QueryAlterableInterface $query) { + if ($query->hasTag('node_access') && !node_access_view_all_nodes()) { + $query->distinct(); + if (!$op = $query->getMetaData('op')) { + $op = 'view'; } - } -} + if (!user_access('bypass node access')) { + $access_alias = $query->join('node_access', 'na', 'na.nid = n.nid'); + $or = db_or(); + 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) + ); + } + } -function _node_query_alter_where($query, $op = 'view', $node_access_alias = 'na', $account = NULL) { - $or = db_or(); - foreach (node_access_grants($op, $account) as $realm => $gids) { - foreach ($gids as $gid) { - $or->condition("{$node_access_alias}.gid = :gid AND {$node_access_alias}.realm = :realm", array(':gid' => $gid, ':realm' => $realm)); + if (count($or->conditions())) { + $query->condition($or); + } + + $query->condition("{$access_alias}.grant_$op", 1, '>='); } - } - - if (count($or->conditions())) { - $query->condition($or); - } - - $query->condition("$node_access_alias.grant_$op", '>=', 1); + } } /** |