You are here

SelectionEntityTypeTaxonomyTerm.php in Entity reference 8

Definition of Drupal\entityreference\Plugin\entityreference\selection\SelectionEntityTypeTaxonomyTerm.

Provide entity type specific access control of the file entity type.

File

lib/Drupal/entityreference/Plugin/Type/Selection/SelectionEntityTypeTaxonomyTerm.php
View source
<?php

/**
 * @file
 * Definition of Drupal\entityreference\Plugin\entityreference\selection\SelectionEntityTypeTaxonomyTerm.
 *
 * Provide entity type specific access control of the file entity type.
 */
namespace Drupal\entityreference\Plugin\Type\Selection;

use Drupal\Core\Entity\EntityFieldQuery;
use Drupal\Core\Database\Query\AlterableInterface;
use Drupal\entityreference\Plugin\entityreference\selection\SelectionBase;
class SelectionEntityTypeTaxonomyTerm extends SelectionBase {
  public function entityFieldQueryAlter(AlterableInterface $query) {

    // The Taxonomy module doesn't implement any proper taxonomy term access,
    // and as a consequence doesn't make sure that taxonomy terms cannot be viewed
    // when the user doesn't have access to the vocabulary.
    $tables = $query
      ->getTables();
    $base_table = key($tables);
    $vocabulary_alias = $query
      ->innerJoin('taxonomy_vocabulary', 'n', '%alias.vid = ' . $base_table . '.vid');
    $query
      ->addMetadata('base_table', $vocabulary_alias);

    // Pass the query to the taxonomy access control.
    $this
      ->reAlterQuery($query, 'taxonomy_vocabulary_access', $vocabulary_alias);

    // Also, the taxonomy term entity exposes a bundle, but doesn't have a bundle
    // column in the database. We have to alter the query ourself to go fetch
    // the bundle.
    $conditions =& $query
      ->conditions();
    foreach ($conditions as $key => &$condition) {
      if ($key !== '#conjunction' && is_string($condition['field']) && $condition['field'] === 'vocabulary_machine_name') {
        $condition['field'] = $vocabulary_alias . '.machine_name';
        break;
      }
    }
  }

}