class PhpSelection

Same name in other branches
  1. 9 core/lib/Drupal/Core/Entity/Plugin/EntityReferenceSelection/PhpSelection.php \Drupal\Core\Entity\Plugin\EntityReferenceSelection\PhpSelection
  2. 8.9.x core/lib/Drupal/Core/Entity/Plugin/EntityReferenceSelection/PhpSelection.php \Drupal\Core\Entity\Plugin\EntityReferenceSelection\PhpSelection
  3. 10 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 16

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(mb_strtolower($match));
        }
        elseif (is_array($match)) {
            array_walk($match, function (&$item) {
                $item = Html::escape(mb_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 = mb_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 str_starts_with($label, $match);
            case 'CONTAINS':
                return str_contains($label, $match);
            case 'ENDS_WITH':
                return str_ends_with($label, $match);
            case 'IS NOT NULL':
                return TRUE;
            case 'IS NULL':
                return FALSE;
            default:
                // Invalid match operator.
                return FALSE;
        }
    }

}

Members

Title Sort descending Modifiers Object type Summary Overriden Title Overrides
DefaultSelection::$currentUser protected property The current user.
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 Overrides SelectionPluginBase::buildConfigurationForm 3
DefaultSelection::buildEntityQuery protected function Builds an EntityQuery to get referenceable entities. 8
DefaultSelection::create public static function Overrides ContainerFactoryPluginInterface::create 2
DefaultSelection::createNewEntity public function Overrides SelectionWithAutocreateInterface::createNewEntity 6
DefaultSelection::defaultConfiguration public function Overrides SelectionPluginBase::defaultConfiguration 3
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::validateReferenceableEntities public function Overrides SelectionInterface::validateReferenceableEntities 1
DefaultSelection::validateReferenceableNewEntities public function Overrides SelectionWithAutocreateInterface::validateReferenceableNewEntities 6
DefaultSelection::validateTargetBundles public static function Validates a target_bundles element.
DefaultSelection::validateTargetBundlesUpdate public static function Validates a target_bundles_update element.
DefaultSelection::__construct public function Constructs a new DefaultSelection object. Overrides SelectionPluginBase::__construct 1
PhpSelection::countReferenceableEntities public function Overrides DefaultSelection::countReferenceableEntities
PhpSelection::getReferenceableEntities public function Overrides DefaultSelection::getReferenceableEntities
PhpSelection::matchLabel protected function Matches an entity label to an input string.
SelectionPluginBase::calculateDependencies public function Overrides DependentPluginInterface::calculateDependencies
SelectionPluginBase::entityQueryAlter public function Overrides SelectionInterface::entityQueryAlter 2
SelectionPluginBase::getConfiguration public function Overrides ConfigurableInterface::getConfiguration
SelectionPluginBase::setConfiguration public function Overrides ConfigurableInterface::setConfiguration
SelectionPluginBase::submitConfigurationForm public function Overrides PluginFormInterface::submitConfigurationForm
SelectionPluginBase::validateConfigurationForm public function Overrides PluginFormInterface::validateConfigurationForm

Buggy or inaccurate documentation? Please file an issue. Need support? Need help programming? Connect with the Drupal community.