You are here

class TermSelection in Taxonomy container 8

Taxonomy container implementation of the entity reference selection plugin.

Plugin annotation


@EntityReferenceSelection(
  id = "taxonomy_container",
  label = @Translation("Taxonomy term selection (with groups)"),
  entity_types = {"taxonomy_term"},
  group = "taxonomy_container"
)

Hierarchy

Expanded class hierarchy of TermSelection

1 file declares its use of TermSelection
TermSelectionTest.php in tests/src/Unit/TermSelectionTest.php

File

src/Plugin/EntityReferenceSelection/TermSelection.php, line 19

Namespace

Drupal\taxonomy_container\Plugin\EntityReferenceSelection
View source
class TermSelection extends BaseTermSelection {

  /**
   * {@inheritdoc}
   */
  public function defaultConfiguration() {
    return [
      'prefix' => '-',
    ] + parent::defaultConfiguration();
  }

  /**
   * {@inheritdoc}
   */
  public function buildConfigurationForm(array $form, FormStateInterface $form_state) {
    $form = parent::buildConfigurationForm($form, $form_state);
    $form['auto_create']['#access'] = FALSE;
    $form['auto_create_bundle']['#access'] = FALSE;
    $form['prefix'] = [
      '#title' => $this
        ->t('List item prefix'),
      '#type' => 'textfield',
      '#size' => 5,
      '#maxlength' => 5,
      '#description' => $this
        ->t('The character before each child term.'),
      '#default_value' => $this->configuration['prefix'],
    ];
    return $form;
  }

  /**
   * {@inheritdoc}
   *
   * That actually violates parent interface. The method should return entity
   * labels not grouped options for a select list. Technically core selection
   * plugin also does this in a wrong way because it puts dashed in front of
   * entity labels. The proper solution could be creating a field widget for
   * entity_reference field. However that would be not possible to register it
   * only for a specific entity type (Taxonomy Term).
   *
   * @see \Drupal\Core\Entity\EntityReferenceSelection\SelectionInterface::getReferenceableEntities()
   */
  public function getReferenceableEntities($match = NULL, $match_operator = 'CONTAINS', $limit = 0) {
    if ($match || $limit) {
      return parent::getReferenceableEntities($match, $match_operator, $limit);
    }
    $bundles = $this->entityTypeBundleInfo
      ->getBundleInfo('taxonomy_term');
    $bundle_names = $this
      ->getConfiguration()['target_bundles'] ?: array_keys($bundles);

    /** @var \Drupal\taxonomy\TermStorageInterface $term_storage */
    $term_storage = $this->entityTypeManager
      ->getStorage('taxonomy_term');
    $prefix = $this->configuration['prefix'];
    $options = [];
    foreach ($bundle_names as $bundle) {

      // Use first bundle as key. This prevents turning bundle labels into
      // optgroups when more than one bundle were provided.
      // See \Drupal\Core\Field\Plugin\Field\FieldType\EntityReferenceItem::getSettableOptions().
      // phpcs:ignore DrupalPractice.CodeAnalysis.VariableAnalysis.UndefinedVariable
      if (!isset($key)) {
        $key = $bundle;
      }

      /** @var \Drupal\taxonomy\TermInterface[] $terms */
      $terms = $term_storage
        ->loadTree($bundle, 0, NULL, TRUE);
      $protected_terms = [];

      /** @var string $parent_id */

      /** @var string $parent_label */
      foreach ($terms as $term) {
        $access = TRUE;
        if (!$term
          ->access('view') || in_array($term->parent->target_id, $protected_terms)) {
          $protected_terms[] = $term
            ->id();
          $access = FALSE;
        }

        // Check if this is a parent item. We do a loose comparison on the
        // string value of zero ('0') so that the result is correct both for
        // numeric and string IDs. If we would compare to the numeric value of
        // zero (0) PHP would cast both arguments to numbers. In the case of
        // string IDs the ID would always be casted to a 0 causing the
        // condition to always be TRUE.
        if ($term->parent->target_id == '0') {
          $parent_id = $term
            ->id();
          $parent_label = Html::escape($this->entityRepository
            ->getTranslationFromContext($term)
            ->label());
          if ($access) {
            $options[$key][$term
              ->id()] = $parent_label;
          }
        }
        else {
          if ($access) {
            $label = Html::escape($this->entityRepository
              ->getTranslationFromContext($term)
              ->label());
            $options[$key][$parent_label][$term
              ->id()] = str_repeat($prefix, $term->depth) . $label;
          }

          // If at least on child has been found, remove the top level term.
          unset($options[$key][$parent_id]);
        }
      }
    }
    return $options;
  }

}

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::create public static function Creates an instance of the plugin. Overrides ContainerFactoryPluginInterface::create 2
DefaultSelection::elementValidateFilter public static function Form element validation handler; Filters the #value property of an element.
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::__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.
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.
TermSelection::buildConfigurationForm public function Form constructor. Overrides TermSelection::buildConfigurationForm
TermSelection::buildEntityQuery protected function Builds an EntityQuery to get referenceable entities. Overrides DefaultSelection::buildEntityQuery
TermSelection::countReferenceableEntities public function Counts entities that are referenceable. Overrides DefaultSelection::countReferenceableEntities
TermSelection::createNewEntity public function Creates a new entity object that can be used as a valid reference. Overrides DefaultSelection::createNewEntity
TermSelection::defaultConfiguration public function Gets default configuration for this plugin. Overrides TermSelection::defaultConfiguration
TermSelection::getReferenceableEntities public function That actually violates parent interface. The method should return entity labels not grouped options for a select list. Technically core selection plugin also does this in a wrong way because it puts dashed in front of entity labels. The proper… Overrides TermSelection::getReferenceableEntities
TermSelection::validateReferenceableNewEntities public function Validates which newly created entities can be referenced. Overrides DefaultSelection::validateReferenceableNewEntities