You are here

class OgSelection in Organic groups 8

Provide default OG selection handler.

Note that the id is correctly defined as "og:default" and not the other way around, as seen in most other default selection handler (e.g. "default:node") as OG's selection handler is a wrapper around those entity specific default ones. That is, the same selection handler will be returned no matter what is the target type of the reference field. Internally, it will call the original selection handler, and use it for building the queries.

Plugin annotation


@EntityReferenceSelection(
  id = "og:default",
  label = @Translation("OG selection"),
  group = "og",
  weight = 1,
)

Hierarchy

Expanded class hierarchy of OgSelection

File

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

Namespace

Drupal\og\Plugin\EntityReferenceSelection
View source
class OgSelection extends DefaultSelection {

  /**
   * Get the selection handler of the field.
   *
   * @return \Drupal\Core\Entity\Plugin\EntityReferenceSelection\DefaultSelection
   *   Returns the selection handler.
   */
  public function getSelectionHandler() {
    $options = $this
      ->getConfiguration();

    // The 'handler' key intentionally absent as we want the selection manager
    // to choose the best option.
    // @see \Drupal\Core\Entity\EntityReferenceSelection\SelectionPluginManager::getInstance()
    unset($options['handler']);

    // Remove also the backwards compatibility layer because that will be passed
    // to the chosen selection handler setter and, as an effect, will trigger a
    // deprecation notice.
    // @see \Drupal\Core\Entity\EntityReferenceSelection\SelectionPluginBase::resolveBackwardCompatibilityConfiguration()
    unset($options['handler_settings']);
    return \Drupal::service('plugin.manager.entity_reference_selection')
      ->getInstance($options);
  }

  /**
   * Overrides ::buildEntityQuery.
   *
   * Return only group in the matching results.
   *
   * @param string|null $match
   *   (Optional) Text to match the label against. Defaults to NULL.
   * @param string $match_operator
   *   (Optional) The operation the matching should be done with. Defaults
   *   to "CONTAINS".
   *
   * @return \Drupal\Core\Entity\Query\QueryInterface
   *   The EntityQuery object with the basic conditions and sorting applied to
   *   it.
   */
  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;
  }

  /**
   * Return all the user's groups.
   *
   * @return \Drupal\Core\Entity\ContentEntityInterface[]
   *   Array with the user's group, or an empty array if none found.
   */
  protected function getUserGroups() {

    /** @var \Drupal\og\MembershipManagerInterface $membership_manager */
    $membership_manager = \Drupal::service('og.membership_manager');
    $other_groups = $membership_manager
      ->getUserGroups($this->currentUser
      ->id());
    return isset($other_groups[$this->configuration['target_type']]) ? $other_groups[$this->configuration['target_type']] : [];
  }

}

Members

Namesort descending Modifiers Type Description Overrides
DefaultSelection::$currentUser protected property The current user.
DefaultSelection::$deprecatedProperties protected property
DefaultSelection::$entityFieldManager protected property The entity field manager service.
DefaultSelection::$entityRepository protected property The entity repository.
DefaultSelection::$entityTypeBundleInfo public property Entity type bundle info service.
DefaultSelection::$entityTypeManager protected property The entity type manager service.
DefaultSelection::$moduleHandler protected property The module handler service.
DefaultSelection::buildConfigurationForm public function Form constructor. Overrides SelectionPluginBase::buildConfigurationForm 3
DefaultSelection::countReferenceableEntities public function Counts entities that are referenceable. Overrides SelectionInterface::countReferenceableEntities 2
DefaultSelection::create public static function Creates an instance of the plugin. Overrides ContainerFactoryPluginInterface::create 2
DefaultSelection::createNewEntity public function Creates a new entity object that can be used as a valid reference. Overrides SelectionWithAutocreateInterface::createNewEntity 6
DefaultSelection::defaultConfiguration public function Gets default configuration for this plugin. Overrides SelectionPluginBase::defaultConfiguration 3
DefaultSelection::elementValidateFilter public static function Form element validation handler; Filters the #value property of an element.
DefaultSelection::getReferenceableEntities public function Gets the list of referenceable entities. Overrides SelectionInterface::getReferenceableEntities 3
DefaultSelection::reAlterQuery protected function Helper method: Passes a query to the alteration system again.
DefaultSelection::validateConfigurationForm public function Form validation handler. Overrides SelectionPluginBase::validateConfigurationForm
DefaultSelection::validateReferenceableEntities public function Validates which existing entities can be referenced. Overrides SelectionInterface::validateReferenceableEntities
DefaultSelection::validateReferenceableNewEntities public function Validates which newly created entities can be referenced. Overrides SelectionWithAutocreateInterface::validateReferenceableNewEntities 6
DefaultSelection::__construct public function Constructs a new DefaultSelection object. Overrides SelectionPluginBase::__construct 1
DependencySerializationTrait::$_entityStorages protected property An array of entity type IDs keyed by the property name of their storages.
DependencySerializationTrait::$_serviceIds protected property An array of service IDs keyed by property name used for serialization.
DependencySerializationTrait::__sleep public function 1
DependencySerializationTrait::__wakeup public function 2
DeprecatedServicePropertyTrait::__get public function Allows to access deprecated/removed properties.
MessengerTrait::$messenger protected property The messenger. 29
MessengerTrait::messenger public function Gets the messenger. 29
MessengerTrait::setMessenger public function Sets the messenger.
OgSelection::buildEntityQuery protected function Overrides ::buildEntityQuery. Overrides DefaultSelection::buildEntityQuery
OgSelection::getSelectionHandler public function Get the selection handler of the field.
OgSelection::getUserGroups protected function Return all the user's groups.
PluginBase::$configuration protected property Configuration information passed into the plugin. 1
PluginBase::$pluginDefinition protected property The plugin implementation definition. 1
PluginBase::$pluginId protected property The plugin_id.
PluginBase::DERIVATIVE_SEPARATOR constant A string which is used to separate base plugin IDs from the derivative ID.
PluginBase::getBaseId public function Gets the base_plugin_id of the plugin instance. Overrides DerivativeInspectionInterface::getBaseId
PluginBase::getDerivativeId public function Gets the derivative_id of the plugin instance. Overrides DerivativeInspectionInterface::getDerivativeId
PluginBase::getPluginDefinition public function Gets the definition of the plugin implementation. Overrides PluginInspectionInterface::getPluginDefinition 3
PluginBase::getPluginId public function Gets the plugin_id of the plugin instance. Overrides PluginInspectionInterface::getPluginId
PluginBase::isConfigurable public function Determines if the plugin is configurable.
SelectionPluginBase::calculateDependencies public function Calculates dependencies for the configured plugin. Overrides DependentPluginInterface::calculateDependencies
SelectionPluginBase::ensureBackwardCompatibilityConfiguration protected function Ensures a backward compatibility level configuration.
SelectionPluginBase::entityQueryAlter public function Allows the selection to alter the SelectQuery generated by EntityFieldQuery. Overrides SelectionInterface::entityQueryAlter 2
SelectionPluginBase::getConfiguration public function Gets this plugin's configuration. Overrides ConfigurableInterface::getConfiguration
SelectionPluginBase::resolveBackwardCompatibilityConfiguration protected function Moves the backward compatibility level configurations in the right place.
SelectionPluginBase::setConfiguration public function Sets the configuration for this plugin instance. Overrides ConfigurableInterface::setConfiguration
SelectionPluginBase::submitConfigurationForm public function Form submission handler. Overrides PluginFormInterface::submitConfigurationForm
StringTranslationTrait::$stringTranslation protected property The string translation service. 1
StringTranslationTrait::formatPlural protected function Formats a string containing a count of items.
StringTranslationTrait::getNumberOfPlurals protected function Returns the number of plurals supported by a given language.
StringTranslationTrait::getStringTranslation protected function Gets the string translation service.
StringTranslationTrait::setStringTranslation public function Sets the string translation service to use. 2
StringTranslationTrait::t protected function Translates a string to the current language or to a given language.