You are here

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()));
    }
  }
}