You are here

class PreprocessorPluginManager in Geocoder 8.3

Same name and namespace in other branches
  1. 8.2 modules/geocoder_field/src/PreprocessorPluginManager.php \Drupal\geocoder_field\PreprocessorPluginManager

Provides a plugin manager for geocoder data preprocessors.

Hierarchy

Expanded class hierarchy of PreprocessorPluginManager

2 files declare their use of PreprocessorPluginManager
FileGeocodeFormatter.php in modules/geocoder_field/src/Plugin/Field/FieldFormatter/FileGeocodeFormatter.php
GeoPhpGeocodeFormatter.php in modules/geocoder_geofield/src/Plugin/Field/FieldFormatter/GeoPhpGeocodeFormatter.php
1 string reference to 'PreprocessorPluginManager'
geocoder_field.services.yml in modules/geocoder_field/geocoder_field.services.yml
modules/geocoder_field/geocoder_field.services.yml
1 service uses PreprocessorPluginManager
plugin.manager.geocoder.preprocessor in modules/geocoder_field/geocoder_field.services.yml
Drupal\geocoder_field\PreprocessorPluginManager

File

modules/geocoder_field/src/PreprocessorPluginManager.php, line 17

Namespace

Drupal\geocoder_field
View source
class PreprocessorPluginManager extends GeocoderPluginManagerBase {

  /**
   * {@inheritdoc}
   */
  public function __construct(\Traversable $namespaces, CacheBackendInterface $cache_backend, ModuleHandlerInterface $module_handler) {
    parent::__construct('Plugin/Geocoder/Preprocessor', $namespaces, $module_handler, PreprocessorInterface::class, GeocoderPreprocessor::class);
    $this
      ->alterInfo('geocoder_preprocessor_info');
    $this
      ->setCacheBackend($cache_backend, 'geocoder_preprocessor_plugins');
  }

  /**
   * Pre-processes a field, running all plugins that support that field type.
   *
   * @param \Drupal\Core\Field\FieldItemListInterface $field
   *   The field item list to be processed.
   *
   * @throws \Drupal\Component\Plugin\Exception\PluginException
   *   If the instance cannot be created, such as if the ID is invalid.
   */
  public function preprocess(FieldItemListInterface &$field) {
    $type = $field
      ->getFieldDefinition()
      ->getType();

    // Get a list of plugins that are supporting fields of type $type.
    $definitions = array_filter($this
      ->getDefinitions(), function ($definition) use ($type) {
      return in_array($type, $definition['field_types']);
    });

    // Sort definitions by 'weight'.
    uasort($definitions, [
      SortArray::class,
      'sortByWeightElement',
    ]);
    foreach ($definitions as $plugin_id => $definition) {

      /** @var \Drupal\geocoder_field\PreprocessorInterface $preprocessor */
      $preprocessor = $this
        ->createInstance($plugin_id);
      $preprocessor
        ->setField($field)
        ->preprocess();
    }
  }

  /**
   * Get the ordered list of fields to be Geocoded | Reverse Geocoded.
   *
   * Reorders the fields based on the user-defined GeocoderField weights.
   *
   * @param \Drupal\Core\Entity\ContentEntityInterface $entity
   *   The Entity that needs to be preprocessed.
   *
   * @return \Drupal\Core\Field\FieldItemListInterface[]
   *   An array of field item lists implementing, keyed by field name.
   */
  public function getOrderedGeocodeFields(ContentEntityInterface $entity) {
    $geocoder_fields = [];
    $results = [];
    foreach ($entity
      ->getFields() as $field_name => $field) {

      /** @var \Drupal\Core\Field\FieldConfigInterface $field_config */
      if (!($field_config = $field
        ->getFieldDefinition()) instanceof FieldConfigInterface) {

        // Only configurable fields are subject of geocoding.
        continue;
      }
      $geocoder = $field_config
        ->getThirdPartySettings('geocoder_field');
      if (empty($geocoder['method']) || $geocoder['method'] === 'none') {

        // This field was not configured to geocode/reverse_geocode from/to
        // other field.
        continue;
      }
      $geocoder_fields[$field_name] = [
        'field_name' => $field_name,
        'field_value' => $field,
        'weight' => isset($geocoder['weight']) ? $geocoder['weight'] : 0,
      ];
    }
    usort($geocoder_fields, function ($a, $b) {
      if ($a['weight'] === $b['weight']) {
        return 0;
      }
      return $a['weight'] < $b['weight'] ? -1 : 1;
    });
    foreach ($geocoder_fields as $field) {
      $results[$field['field_name']] = $field['field_value'];
    }
    return $results;
  }

  /**
   * Check if the source and the original fields are the same.
   *
   * @param \Drupal\Core\Field\FieldItemListInterface $source_field
   *   The Source Field.
   * @param \Drupal\Core\Field\FieldItemListInterface $original_field
   *   The Original Field.
   *
   * @return bool
   *   The check result.
   */
  public function sourceFieldIsSameOfOriginal(FieldItemListInterface $source_field, FieldItemListInterface $original_field) {
    $source_value = $source_field
      ->getValue();
    $original_value = $original_field
      ->getValue();
    if (isset($source_value[0]) && !isset($source_value[0]['value']) && isset($source_value[0]['target_id'])) {
      foreach ($source_value as $i => $value) {
        $source_value[$i] = isset($value['target_id']) ? $value['target_id'] : '';
      }
    }
    if (isset($original_value[0]) && !isset($original_value[0]['value']) && isset($original_value[0]['target_id'])) {
      foreach ($original_value as $i => $value) {
        $original_value[$i] = isset($value['target_id']) ? $value['target_id'] : '';
      }
    }
    return $source_value == $original_value;
  }

}

Members

Namesort descending Modifiers Type Description Overrides
DefaultPluginManager::$additionalAnnotationNamespaces protected property Additional namespaces the annotation discovery mechanism should scan for annotation definitions.
DefaultPluginManager::$alterHook protected property Name of the alter hook if one should be invoked.
DefaultPluginManager::$cacheKey protected property The cache key.
DefaultPluginManager::$cacheTags protected property An array of cache tags to use for the cached definitions.
DefaultPluginManager::$defaults protected property A set of defaults to be referenced by $this->processDefinition() if additional processing of plugins is necessary or helpful for development purposes. 9
DefaultPluginManager::$moduleHandler protected property The module handler to invoke the alter hook. 1
DefaultPluginManager::$namespaces protected property An object that implements \Traversable which contains the root paths keyed by the corresponding namespace to look for plugin implementations.
DefaultPluginManager::$pluginDefinitionAnnotationName protected property The name of the annotation that contains the plugin definition.
DefaultPluginManager::$pluginInterface protected property The interface each plugin should implement. 1
DefaultPluginManager::$subdir protected property The subdirectory within a namespace to look for plugins, or FALSE if the plugins are in the top level of the namespace.
DefaultPluginManager::alterDefinitions protected function Invokes the hook to alter the definitions if the alter hook is set. 1
DefaultPluginManager::alterInfo protected function Sets the alter hook name.
DefaultPluginManager::clearCachedDefinitions public function Clears static and persistent plugin definition caches. Overrides CachedDiscoveryInterface::clearCachedDefinitions 5
DefaultPluginManager::extractProviderFromDefinition protected function Extracts the provider from a plugin definition.
DefaultPluginManager::findDefinitions protected function Finds plugin definitions. 7
DefaultPluginManager::fixContextAwareDefinitions private function Fix the definitions of context-aware plugins.
DefaultPluginManager::getCacheContexts public function The cache contexts associated with this object. Overrides CacheableDependencyInterface::getCacheContexts
DefaultPluginManager::getCachedDefinitions protected function Returns the cached plugin definitions of the decorated discovery class.
DefaultPluginManager::getCacheMaxAge public function The maximum age for which this object may be cached. Overrides CacheableDependencyInterface::getCacheMaxAge
DefaultPluginManager::getCacheTags public function The cache tags associated with this object. Overrides CacheableDependencyInterface::getCacheTags
DefaultPluginManager::getDefinitions public function Gets the definition of all plugins for this type. Overrides DiscoveryTrait::getDefinitions 2
DefaultPluginManager::getDiscovery protected function Gets the plugin discovery. Overrides PluginManagerBase::getDiscovery 12
DefaultPluginManager::getFactory protected function Gets the plugin factory. Overrides PluginManagerBase::getFactory
DefaultPluginManager::processDefinition public function Performs extra processing on plugin definitions. 13
DefaultPluginManager::providerExists protected function Determines if the provider of a definition exists. 3
DefaultPluginManager::setCacheBackend public function Initialize the cache backend.
DefaultPluginManager::setCachedDefinitions protected function Sets a cache of plugin definitions for the decorated discovery class.
DefaultPluginManager::useCaches public function Disable the use of caches. Overrides CachedDiscoveryInterface::useCaches 1
DiscoveryCachedTrait::$definitions protected property Cached definitions array. 1
DiscoveryCachedTrait::getDefinition public function Overrides DiscoveryTrait::getDefinition 3
DiscoveryTrait::doGetDefinition protected function Gets a specific plugin definition.
DiscoveryTrait::hasDefinition public function
GeocoderPluginManagerBase::$geocodeSourceFieldsTypes protected property List of fields types available as source for Geocode operations.
GeocoderPluginManagerBase::$reverseGeocodeSourceFieldsTypes protected property List of fields types available as source for Reverse Geocode operations.
GeocoderPluginManagerBase::getGeocodeSourceFieldsTypes public function Gets a list of fields types available for Geocode operations.
GeocoderPluginManagerBase::getPlugins public function Return the array of plugins and their settings if any. 1
GeocoderPluginManagerBase::getPluginsAsOptions public function Gets a list of available plugins to be used in forms.
GeocoderPluginManagerBase::getReverseGeocodeSourceFieldsTypes public function Gets a list of fields types available for Reverse Geocode operations.
PluginManagerBase::$discovery protected property The object that discovers plugins managed by this manager.
PluginManagerBase::$factory protected property The object that instantiates plugins managed by this manager.
PluginManagerBase::$mapper protected property The object that returns the preconfigured plugin instance appropriate for a particular runtime condition.
PluginManagerBase::createInstance public function Creates a pre-configured instance of a plugin. Overrides FactoryInterface::createInstance 12
PluginManagerBase::getInstance public function Gets a preconfigured instance of a plugin. Overrides MapperInterface::getInstance 7
PluginManagerBase::handlePluginNotFound protected function Allows plugin managers to specify custom behavior if a plugin is not found. 1
PreprocessorPluginManager::getOrderedGeocodeFields public function Get the ordered list of fields to be Geocoded | Reverse Geocoded.
PreprocessorPluginManager::preprocess public function Pre-processes a field, running all plugins that support that field type.
PreprocessorPluginManager::sourceFieldIsSameOfOriginal public function Check if the source and the original fields are the same.
PreprocessorPluginManager::__construct public function Creates the discovery object. Overrides DefaultPluginManager::__construct
UseCacheBackendTrait::$cacheBackend protected property Cache backend instance.
UseCacheBackendTrait::$useCaches protected property Flag whether caches should be used or skipped.
UseCacheBackendTrait::cacheGet protected function Fetches from the cache backend, respecting the use caches flag. 1
UseCacheBackendTrait::cacheSet protected function Stores data in the persistent cache, respecting the use caches flag.