You are here

class PhpSelection in Zircon Profile 8.0

Same name and namespace in other branches
  1. 8 core/lib/Drupal/Core/Entity/Plugin/EntityReferenceSelection/PhpSelection.php \Drupal\Core\Entity\Plugin\EntityReferenceSelection\PhpSelection

Defines an alternative to the default Entity Reference Selection plugin.

This selection plugin uses PHP for more advanced cases when the entity query cannot filter properly, for example when the target entity type has no 'label' key provided in the entity type plugin definition.

Hierarchy

Expanded class hierarchy of PhpSelection

See also

\Drupal\Core\Entity\Plugin\Derivative\DefaultSelectionDeriver

File

core/lib/Drupal/Core/Entity/Plugin/EntityReferenceSelection/PhpSelection.php, line 22
Contains \Drupal\Core\Entity\Plugin\EntityReferenceSelection\PhpSelection.

Namespace

Drupal\Core\Entity\Plugin\EntityReferenceSelection
View source
class PhpSelection extends DefaultSelection {

  /**
   * {@inheritdoc}
   */
  public function getReferenceableEntities($match = NULL, $match_operator = 'CONTAINS', $limit = 0) {

    // No input, return everything from the entity query.
    if ($match === NULL || $match === '') {
      return parent::getReferenceableEntities($match, $match_operator, $limit);
    }

    // Start with the selection results returned by the entity query. Don't use
    // any limit because we have to apply a limit after filtering the items.
    $options = parent::getReferenceableEntities($match, $match_operator);

    // Always use a case-insensitive, escaped match. Entity labels returned by
    // SelectionInterface::getReferenceableEntities() are already escaped, so
    // the incoming $match needs to be escaped as well, making the comparison
    // possible.
    // @see \Drupal\Core\Entity\EntityReferenceSelection\SelectionInterface::getReferenceableEntities()
    if (is_string($match)) {
      $match = Html::escape(Unicode::strtolower($match));
    }
    elseif (is_array($match)) {
      array_walk($match, function (&$item) {
        $item = Html::escape(Unicode::strtolower($item));
      });
    }
    $filtered = [];
    $count = 0;

    // Filter target entities by the output of their label() method.
    foreach ($options as $bundle => &$items) {
      foreach ($items as $entity_id => $label) {
        if ($this
          ->matchLabel($match, $match_operator, $label)) {
          $filtered[$bundle][$entity_id] = $label;
          $count++;
          if ($limit && $count >= $limit) {
            break 2;
          }
        }
      }
    }
    return $filtered;
  }

  /**
   * {@inheritdoc}
   */
  public function countReferenceableEntities($match = NULL, $match_operator = 'CONTAINS') {
    $count = 0;
    foreach ($this
      ->getReferenceableEntities($match, $match_operator) as &$items) {
      $count += count($items);
    }
    return $count;
  }

  /**
   * Matches an entity label to an input string.
   *
   * @param mixed $match
   *   The value to compare. This can be any valid entity query condition value.
   * @param string $match_operator
   *   The comparison operator.
   * @param string $label
   *   The entity label to match against.
   *
   * @return bool
   *   TRUE when matches, FALSE otherwise.
   */
  protected function matchLabel($match, $match_operator, $label) {

    // Always use a case-insensitive value.
    $label = Unicode::strtolower($label);
    switch ($match_operator) {
      case '=':
        return $label == $match;
      case '>':
        return $label > $match;
      case '<':
        return $label < $match;
      case '>=':
        return $label >= $match;
      case '<=':
        return $label <= $match;
      case '<>':
        return $label != $match;
      case 'IN':
        return array_search($label, $match) !== FALSE;
      case 'NOT IN':
        return array_search($label, $match) === FALSE;
      case 'STARTS_WITH':
        return strpos($label, $match) === 0;
      case 'CONTAINS':
        return strpos($label, $match) !== FALSE;
      case 'ENDS_WITH':
        return Unicode::substr($label, -Unicode::strlen($match)) === (string) $match;
      case 'IS NOT NULL':
        return TRUE;
      case 'IS NULL':
        return FALSE;
      default:

        // Invalid match operator.
        return FALSE;
    }
  }

}

Members

Namesort descending Modifiers Type Description Overrides
DefaultSelection::$currentUser protected property The current user.
DefaultSelection::$entityManager protected property The entity manager.
DefaultSelection::$moduleHandler protected property The module handler service.
DefaultSelection::buildConfigurationForm public function Form constructor. Overrides PluginFormInterface::buildConfigurationForm 3
DefaultSelection::buildEntityQuery protected function Builds an EntityQuery to get referenceable entities. 4
DefaultSelection::create public static function Creates an instance of the plugin. Overrides ContainerFactoryPluginInterface::create 1
DefaultSelection::createNewEntity public function Creates a new entity object that can be used as a valid reference. Overrides SelectionWithAutocreateInterface::createNewEntity 4
DefaultSelection::elementValidateFilter public static function Form element validation handler; Filters the #value property of an element.
DefaultSelection::entityQueryAlter public function Allows the selection to alter the SelectQuery generated by EntityFieldQuery. Overrides SelectionInterface::entityQueryAlter 3
DefaultSelection::reAlterQuery protected function Helper method: Passes a query to the alteration system again.
DefaultSelection::submitConfigurationForm public function Form submission handler. Overrides PluginFormInterface::submitConfigurationForm
DefaultSelection::validateConfigurationForm public function Form validation handler. Overrides PluginFormInterface::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 4
DefaultSelection::__construct public function Constructs a new SelectionBase object. Overrides PluginBase::__construct 1
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
PhpSelection::countReferenceableEntities public function Counts entities that are referenceable. Overrides DefaultSelection::countReferenceableEntities
PhpSelection::getReferenceableEntities public function Gets the list of referenceable entities. Overrides DefaultSelection::getReferenceableEntities
PhpSelection::matchLabel protected function Matches an entity label to an input string.
PluginBase::$configuration protected property Configuration information passed into the plugin. 2
PluginBase::$pluginDefinition protected property The plugin implementation definition.
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
PluginBase::getPluginId public function Gets the plugin_id of the plugin instance. Overrides PluginInspectionInterface::getPluginId
StringTranslationTrait::$stringTranslation protected property The string translation service.
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.