function forum_access_query_taxonomy_term_access_alter in Forum Access 8
Implements hook_query_TAG_alter() for tag 'taxonomy_term_access'.
@inheritdoc
File
- ./
forum_access.module, line 420 - Contains forum_access.module.
Code
function forum_access_query_taxonomy_term_access_alter(SelectInterface $query) {
// Read meta-data from query, if provided.
if (!($account = $query
->getMetaData('account'))) {
$account = \Drupal::currentUser();
}
if (!($op = $query
->getMetaData('op'))) {
$op = 'view';
}
// If $account can bypass node access, or there are no node access
// modules, we don't need to alter the query.
if ($account
->hasPermission('bypass node access')) {
return;
}
// Prevent duplicate records.
$query
->distinct();
// Find all instances of the {taxonomy_term_data} table being joined --
// could appear more than once in the query, and could be aliased.
// Join each one to the forum_access table.
$tables = $query
->getTables();
$rids = $account
->getRoles();
foreach ($tables as $talias => $tableinfo) {
$table = $tableinfo['table'];
if ($table == 'taxonomy_term_field_data') {
// The node_access table has the access grants for any given node.
$access_alias = $query
->leftJoin('forum_access', 'fa', '%alias.tid = ' . $talias . '.tid');
$acl_alias = $query
->leftJoin('acl', 'acl', "%alias.figure = {$talias}.tid AND %alias.module = 'forum_access' AND %alias.name=:name", [
':name' => 'moderate',
]);
$aclu_alias = $query
->leftJoin('acl_user', 'aclu', "%alias.acl_id = {$acl_alias}.acl_id AND %alias.uid = :uid", [
':uid' => $account
->id(),
]);
$query
->condition((new Condition('OR'))
->isNull("{$access_alias}.rid")
->condition((new Condition('AND'))
->condition("{$access_alias}.rid", $rids, 'IN')
->condition("{$access_alias}.grant_{$op}", 1, '>='))
->condition("{$aclu_alias}.uid", $account
->id()));
}
}
}