You are here

protected function OgSelection::buildEntityQuery in Organic groups 8

Overrides ::buildEntityQuery.

Return only group in the matching results.

Parameters

string|null $match: (Optional) Text to match the label against. Defaults to NULL.

string $match_operator: (Optional) The operation the matching should be done with. Defaults to "CONTAINS".

Return value

\Drupal\Core\Entity\Query\QueryInterface The EntityQuery object with the basic conditions and sorting applied to it.

Overrides DefaultSelection::buildEntityQuery

File

src/Plugin/EntityReferenceSelection/OgSelection.php, line 64

Class

OgSelection
Provide default OG selection handler.

Namespace

Drupal\og\Plugin\EntityReferenceSelection

Code

protected function buildEntityQuery($match = NULL, $match_operator = 'CONTAINS') {

  // Getting the original entity selection handler. OG selection handler using
  // the default selection handler of the entity, which the field reference
  // to, and add another logic to the query object i.e. check if the entities
  // bundle defined as group.
  $query = $this
    ->getSelectionHandler()
    ->buildEntityQuery($match, $match_operator);
  $target_type = $this->configuration['target_type'];
  $definition = \Drupal::entityTypeManager()
    ->getDefinition($target_type);
  if ($bundle_key = $definition
    ->getKey('bundle')) {
    $bundles = Og::groupTypeManager()
      ->getGroupBundleIdsByEntityType($target_type);
    if (!$bundles) {

      // If there are no bundles defined, we can return early.
      return $query;
    }
    $query
      ->condition($bundle_key, $bundles, 'IN');
  }
  $user_groups = $this
    ->getUserGroups();
  if (!$user_groups) {
    return $query;
  }
  $identifier_key = $definition
    ->getKey('id');
  $ids = [];
  if (!empty($this
    ->getConfiguration()['field_mode']) && $this
    ->getConfiguration()['field_mode'] === 'admin') {

    // Don't include the groups, the user doesn't have create permission.
    foreach ($user_groups as $group) {
      $ids[] = $group
        ->id();
    }
    if ($ids) {
      $query
        ->condition($identifier_key, $ids, 'NOT IN');
    }
  }
  else {

    // Determine which groups should be selectable.
    foreach ($user_groups as $group) {
      $ids[] = $group
        ->id();
    }
    if ($ids) {
      $query
        ->condition($identifier_key, $ids, 'IN');
    }
    else {

      // User doesn't have permission to select any group so falsify this
      // query.
      $query
        ->condition($identifier_key, -1, '=');
    }
  }
  return $query;
}