class WebformElementManager in Webform 8.5
Same name and namespace in other branches
- 6.x src/Plugin/WebformElementManager.php \Drupal\webform\Plugin\WebformElementManager
Provides a plugin manager for webform element plugins.
Hierarchy
- class \Drupal\Component\Plugin\PluginManagerBase implements PluginManagerInterface uses DiscoveryTrait
- class \Drupal\Core\Plugin\DefaultPluginManager implements CachedDiscoveryInterface, PluginManagerInterface, CacheableDependencyInterface uses DiscoveryCachedTrait, UseCacheBackendTrait
- class \Drupal\webform\Plugin\WebformElementManager implements FallbackPluginManagerInterface, WebformElementManagerInterface uses CategorizingPluginManagerTrait
- class \Drupal\Core\Plugin\DefaultPluginManager implements CachedDiscoveryInterface, PluginManagerInterface, CacheableDependencyInterface uses DiscoveryCachedTrait, UseCacheBackendTrait
Expanded class hierarchy of WebformElementManager
See also
hook_webform_element_info_alter()
\Drupal\webform\Annotation\WebformElement
\Drupal\webform\Plugin\WebformElementInterface
\Drupal\webform\Plugin\WebformElementBase
1 string reference to 'WebformElementManager'
1 service uses WebformElementManager
File
- src/
Plugin/ WebformElementManager.php, line 27
Namespace
Drupal\webform\PluginView source
class WebformElementManager extends DefaultPluginManager implements FallbackPluginManagerInterface, WebformElementManagerInterface {
use CategorizingPluginManagerTrait;
/**
* The theme handler.
*
* @var \Drupal\Core\Extension\ThemeHandlerInterface
*/
protected $themeHandler;
/**
* The configuration object factory.
*
* @var \Drupal\Core\Config\ConfigFactoryInterface
*/
protected $configFactory;
/**
* A element info manager.
*
* @var \Drupal\Core\Render\ElementInfoManagerInterface
*/
protected $elementInfo;
/**
* List of already instantiated webform element plugins.
*
* @var array
*/
protected $instances = [];
/**
* Constructs a WebformElementManager.
*
* @param \Traversable $namespaces
* An object that implements \Traversable which contains the root paths
* keyed by the corresponding namespace to look for plugin implementations.
* @param \Drupal\Core\Cache\CacheBackendInterface $cache_backend
* Cache backend instance to use.
* @param \Drupal\Core\Extension\ModuleHandlerInterface $module_handler
* The module handler.
* @param \Drupal\Core\Extension\ThemeHandlerInterface $theme_handler
* The theme handler.
* @param \Drupal\Core\Config\ConfigFactoryInterface $config_factory
* The configuration object factory.
* @param \Drupal\Core\Render\ElementInfoManagerInterface $element_info
* The element info manager.
*/
public function __construct(\Traversable $namespaces, CacheBackendInterface $cache_backend, ModuleHandlerInterface $module_handler, ThemeHandlerInterface $theme_handler, ConfigFactoryInterface $config_factory, ElementInfoManagerInterface $element_info) {
parent::__construct('Plugin/WebformElement', $namespaces, $module_handler, 'Drupal\\webform\\Plugin\\WebformElementInterface', 'Drupal\\webform\\Annotation\\WebformElement');
$this->configFactory = $config_factory;
$this->elementInfo = $element_info;
$this->themeHandler = $theme_handler;
$this
->alterInfo('webform_element_info');
$this
->setCacheBackend($cache_backend, 'webform_element_plugins');
}
/**
* {@inheritdoc}
*/
protected function alterDefinitions(&$definitions) {
// Prevents Fatal error: Class 'Drupal\bootstrap\Bootstrap' during install
// w/ Bootstrap theme and webform.
$this->themeHandler
->reset();
// Unset elements that are missing target element or dependencies.
foreach ($definitions as $element_key => $element_definition) {
// Check that the webform element's target element info exists.
if (!$this->elementInfo
->getInfo($element_key)) {
unset($definitions[$element_key]);
continue;
}
// Check element's (module) dependencies exist.
foreach ($element_definition['dependencies'] as $dependency) {
if (!$this->moduleHandler
->moduleExists($dependency)) {
unset($definitions[$element_key]);
continue;
}
}
}
parent::alterDefinitions($definitions);
}
/**
* {@inheritdoc}
*/
public function getFallbackPluginId($plugin_id, array $configuration = []) {
return 'webform_element';
}
/**
* {@inheritdoc}
*/
public function createInstance($plugin_id, array $configuration = []) {
// If configuration is empty create a single reusable instance for each
// Webform element plugin.
if (empty($configuration)) {
if (!isset($this->instances[$plugin_id])) {
$this->instances[$plugin_id] = parent::createInstance($plugin_id, $configuration);
}
return $this->instances[$plugin_id];
}
else {
return parent::createInstance($plugin_id, $configuration);
}
}
/**
* {@inheritdoc}
*/
public function getInstances() {
$plugin_definitions = $this
->getDefinitions();
$plugin_definitions = $this
->getSortedDefinitions($plugin_definitions);
$plugin_definitions = $this
->removeExcludeDefinitions($plugin_definitions);
// Initialize and return all plugin instances.
foreach ($plugin_definitions as $plugin_id => $plugin_definition) {
$this
->createInstance($plugin_id);
}
return $this->instances;
}
/**
* {@inheritdoc}
*/
public function initializeElement(array &$element) {
$element_plugin = $this
->getElementInstance($element);
$element_plugin
->initialize($element);
}
/**
* {@inheritdoc}
*/
public function buildElement(array &$element, array $form, FormStateInterface $form_state) {
// Get the webform submission.
$form_object = $form_state
->getFormObject();
/** @var \Drupal\webform\WebformSubmissionInterface $webform_submission */
$webform_submission = $form_object instanceof WebformSubmissionForm ? $form_object
->getEntity() : NULL;
$webform = $webform_submission ? $webform_submission
->getWebform() : NULL;
$element_plugin = $this
->getElementInstance($element, $webform_submission ?: $webform);
$element_plugin
->prepare($element, $webform_submission);
$element_plugin
->finalize($element, $webform_submission);
$element_plugin
->setDefaultValue($element);
// Allow modules to alter the webform element.
// @see \Drupal\Core\Field\WidgetBase::formSingleElement()
$hooks = [
'webform_element',
];
if (!empty($element['#type'])) {
$hooks[] = 'webform_element_' . $element['#type'];
}
$context = [
'form' => $form,
];
$this->moduleHandler
->alter($hooks, $element, $form_state, $context);
// Allow handlers to alter the webform element.
if ($webform_submission) {
$webform
->invokeHandlers('alterElement', $element, $form_state, $context);
}
}
/**
* {@inheritdoc}
*/
public function processElement(array &$element) {
$element_plugin = $this
->getElementInstance($element);
$element_plugin
->initialize($element);
$element_plugin
->prepare($element);
$element_plugin
->finalize($element);
$element_plugin
->setDefaultValue($element);
return $element;
}
/**
* {@inheritdoc}
*/
public function processElements(array &$elements) {
foreach ($elements as $key => &$element) {
if (!WebformElementHelper::isElement($element, $key)) {
continue;
}
// Process the webform element.
$this
->processElement($element);
// Recurse and prepare nested elements.
$this
->processElements($element);
}
}
/**
* {@inheritdoc}
*/
public function invokeMethod($method, array &$element, &$context1 = NULL, &$context2 = NULL) {
// Make sure element has a #type.
if (!isset($element['#type'])) {
return NULL;
}
$plugin_id = $this
->getElementPluginId($element);
/** @var \Drupal\webform\Plugin\WebformElementInterface $webform_element */
$webform_element = $this
->createInstance($plugin_id);
return $webform_element
->{$method}($element, $context1, $context2);
}
/**
* {@inheritdoc}
*/
public function getElementPluginId(array $element) {
if (isset($element['#webform_plugin_id']) && $this
->hasDefinition($element['#webform_plugin_id'])) {
return $element['#webform_plugin_id'];
}
elseif (isset($element['#type']) && $this
->hasDefinition($element['#type'])) {
return $element['#type'];
}
elseif (isset($element['#markup'])) {
return 'webform_markup';
}
return $this
->getFallbackPluginId(NULL);
}
/**
* {@inheritdoc}
*/
public function getElementInstance(array $element, EntityInterface $entity = NULL) {
$plugin_id = $this
->getElementPluginId($element);
/** @var \Drupal\webform\Plugin\WebformElementInterface $element_plugin */
$element_plugin = $this
->createInstance($plugin_id, $element);
if ($entity) {
$element_plugin
->setEntities($entity);
}
else {
$element_plugin
->resetEntities();
}
return $element_plugin;
}
/**
* {@inheritdoc}
*/
public function getSortedDefinitions(array $definitions = NULL, $sort_by = 'label') {
$definitions = isset($definitions) ? $definitions : $this
->getDefinitions();
switch ($sort_by) {
case 'category':
uasort($definitions, function ($a, $b) use ($sort_by) {
return strnatcasecmp($a['category'] . '-' . $a[$sort_by], $b['category'] . '-' . $b[$sort_by]);
});
break;
default:
uasort($definitions, function ($a, $b) use ($sort_by) {
return strnatcasecmp($a[$sort_by], $b[$sort_by]);
});
break;
}
return $definitions;
}
/**
* {@inheritdoc}
*/
public function getGroupedDefinitions(array $definitions = NULL, $label_key = 'label') {
/** @var \Drupal\Core\Plugin\CategorizingPluginManagerTrait|\Drupal\Component\Plugin\PluginManagerInterface $this */
$definitions = $this
->getSortedDefinitions(isset($definitions) ? $definitions : $this
->getDefinitions(), $label_key);
// Organize grouped definition with basic and advanced first and other last.
$basic_category = (string) $this
->t('Basic elements');
$advanced_category = (string) $this
->t('Advanced elements');
$other_category = (string) $this
->t('Other elements');
$grouped_definitions = [
$basic_category => [],
$advanced_category => [],
];
foreach ($definitions as $id => $definition) {
$grouped_definitions[(string) $definition['category']][$id] = $definition;
}
if (isset($grouped_definitions[''])) {
$no_category = $grouped_definitions[''];
unset($grouped_definitions['']);
$grouped_definitions += [
$other_category => $no_category,
];
}
return $grouped_definitions;
}
/**
* {@inheritdoc}
*/
public function removeExcludeDefinitions(array $definitions) {
$definitions = isset($definitions) ? $definitions : $this
->getDefinitions();
$excluded = $this->configFactory
->get('webform.settings')
->get('element.excluded_elements');
return $excluded ? array_diff_key($definitions, $excluded) : $definitions;
}
/**
* {@inheritdoc}
*/
public function getTranslatableProperties() {
$properties = [];
$webform_elements = $this
->getInstances();
foreach ($webform_elements as $webform_element) {
$translatable_properties = $webform_element
->getTranslatableProperties();
$properties += array_combine($translatable_properties, $translatable_properties);
}
ksort($properties);
return $properties;
}
/**
* {@inheritdoc}
*/
public function getAllProperties() {
$properties = [];
$webform_elements = $this
->getInstances();
foreach ($webform_elements as $webform_element) {
$default_properties = array_keys($webform_element
->getDefaultProperties());
$properties += array_combine($default_properties, $default_properties);
}
ksort($properties);
return $properties;
}
/**
* {@inheritdoc}
*/
public function isExcluded($type) {
return $this->configFactory
->get('webform.settings')
->get('element.excluded_elements.' . $type) ? TRUE : FALSE;
}
}
Members
Name | Modifiers | Type | Description | Overrides |
---|---|---|---|---|
CategorizingPluginManagerTrait:: |
public | function | ||
CategorizingPluginManagerTrait:: |
public | function | Returns the module handler used. | |
CategorizingPluginManagerTrait:: |
protected | function | Gets the name of a provider. | |
CategorizingPluginManagerTrait:: |
protected | function | Processes a plugin definition to ensure there is a category. | |
DefaultPluginManager:: |
protected | property | Additional namespaces the annotation discovery mechanism should scan for annotation definitions. | |
DefaultPluginManager:: |
protected | property | Name of the alter hook if one should be invoked. | |
DefaultPluginManager:: |
protected | property | The cache key. | |
DefaultPluginManager:: |
protected | property | An array of cache tags to use for the cached definitions. | |
DefaultPluginManager:: |
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:: |
protected | property | The module handler to invoke the alter hook. | 1 |
DefaultPluginManager:: |
protected | property | An object that implements \Traversable which contains the root paths keyed by the corresponding namespace to look for plugin implementations. | |
DefaultPluginManager:: |
protected | property | The name of the annotation that contains the plugin definition. | |
DefaultPluginManager:: |
protected | property | The interface each plugin should implement. | 1 |
DefaultPluginManager:: |
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:: |
protected | function | Sets the alter hook name. | |
DefaultPluginManager:: |
public | function |
Clears static and persistent plugin definition caches. Overrides CachedDiscoveryInterface:: |
5 |
DefaultPluginManager:: |
protected | function | Extracts the provider from a plugin definition. | |
DefaultPluginManager:: |
protected | function | Finds plugin definitions. | 7 |
DefaultPluginManager:: |
private | function | Fix the definitions of context-aware plugins. | |
DefaultPluginManager:: |
public | function |
The cache contexts associated with this object. Overrides CacheableDependencyInterface:: |
|
DefaultPluginManager:: |
protected | function | Returns the cached plugin definitions of the decorated discovery class. | |
DefaultPluginManager:: |
public | function |
The maximum age for which this object may be cached. Overrides CacheableDependencyInterface:: |
|
DefaultPluginManager:: |
public | function |
The cache tags associated with this object. Overrides CacheableDependencyInterface:: |
|
DefaultPluginManager:: |
public | function |
Gets the definition of all plugins for this type. Overrides DiscoveryTrait:: |
2 |
DefaultPluginManager:: |
protected | function |
Gets the plugin discovery. Overrides PluginManagerBase:: |
12 |
DefaultPluginManager:: |
protected | function |
Gets the plugin factory. Overrides PluginManagerBase:: |
|
DefaultPluginManager:: |
public | function | Performs extra processing on plugin definitions. | 13 |
DefaultPluginManager:: |
protected | function | Determines if the provider of a definition exists. | 3 |
DefaultPluginManager:: |
public | function | Initialize the cache backend. | |
DefaultPluginManager:: |
protected | function | Sets a cache of plugin definitions for the decorated discovery class. | |
DefaultPluginManager:: |
public | function |
Disable the use of caches. Overrides CachedDiscoveryInterface:: |
1 |
DiscoveryCachedTrait:: |
protected | property | Cached definitions array. | 1 |
DiscoveryCachedTrait:: |
public | function |
Overrides DiscoveryTrait:: |
3 |
DiscoveryTrait:: |
protected | function | Gets a specific plugin definition. | |
DiscoveryTrait:: |
public | function | ||
PluginManagerBase:: |
protected | property | The object that discovers plugins managed by this manager. | |
PluginManagerBase:: |
protected | property | The object that instantiates plugins managed by this manager. | |
PluginManagerBase:: |
protected | property | The object that returns the preconfigured plugin instance appropriate for a particular runtime condition. | |
PluginManagerBase:: |
public | function |
Gets a preconfigured instance of a plugin. Overrides MapperInterface:: |
7 |
PluginManagerBase:: |
protected | function | Allows plugin managers to specify custom behavior if a plugin is not found. | 1 |
StringTranslationTrait:: |
protected | property | The string translation service. | 1 |
StringTranslationTrait:: |
protected | function | Formats a string containing a count of items. | |
StringTranslationTrait:: |
protected | function | Returns the number of plurals supported by a given language. | |
StringTranslationTrait:: |
protected | function | Gets the string translation service. | |
StringTranslationTrait:: |
public | function | Sets the string translation service to use. | 2 |
StringTranslationTrait:: |
protected | function | Translates a string to the current language or to a given language. | |
UseCacheBackendTrait:: |
protected | property | Cache backend instance. | |
UseCacheBackendTrait:: |
protected | property | Flag whether caches should be used or skipped. | |
UseCacheBackendTrait:: |
protected | function | Fetches from the cache backend, respecting the use caches flag. | 1 |
UseCacheBackendTrait:: |
protected | function | Stores data in the persistent cache, respecting the use caches flag. | |
WebformElementManager:: |
protected | property | The configuration object factory. | |
WebformElementManager:: |
protected | property | A element info manager. | |
WebformElementManager:: |
protected | property | List of already instantiated webform element plugins. | |
WebformElementManager:: |
protected | property | The theme handler. | |
WebformElementManager:: |
protected | function |
Invokes the hook to alter the definitions if the alter hook is set. Overrides DefaultPluginManager:: |
|
WebformElementManager:: |
public | function |
Build a Webform element. Overrides WebformElementManagerInterface:: |
|
WebformElementManager:: |
public | function |
Creates a pre-configured instance of a plugin. Overrides PluginManagerBase:: |
|
WebformElementManager:: |
public | function |
Get all properties for all elements. Overrides WebformElementManagerInterface:: |
|
WebformElementManager:: |
public | function |
Get a webform element plugin instance for an element. Overrides WebformElementManagerInterface:: |
|
WebformElementManager:: |
public | function |
Is an element's plugin id. Overrides WebformElementManagerInterface:: |
|
WebformElementManager:: |
public | function |
Gets a fallback id for a missing plugin. Overrides FallbackPluginManagerInterface:: |
|
WebformElementManager:: |
public | function |
Gets sorted plugin definitions grouped by category. Overrides CategorizingPluginManagerTrait:: |
|
WebformElementManager:: |
public | function |
Get all available webform element plugin instances. Overrides WebformElementManagerInterface:: |
|
WebformElementManager:: |
public | function |
Gets sorted plugin definitions. Overrides CategorizingPluginManagerTrait:: |
|
WebformElementManager:: |
public | function |
Get all translatable properties from all elements. Overrides WebformElementManagerInterface:: |
|
WebformElementManager:: |
public | function |
Build a Webform element. Overrides WebformElementManagerInterface:: |
|
WebformElementManager:: |
public | function |
Invoke a method for a Webform element. Overrides WebformElementManagerInterface:: |
|
WebformElementManager:: |
public | function |
Determine if an element type is excluded. Overrides WebformElementManagerInterface:: |
|
WebformElementManager:: |
public | function |
Process a form element and apply webform element specific enhancements. Overrides WebformElementManagerInterface:: |
|
WebformElementManager:: |
public | function |
Process form elements and apply webform element specific enhancements. Overrides WebformElementManagerInterface:: |
|
WebformElementManager:: |
public | function |
Remove excluded plugin definitions. Overrides WebformPluginManagerExcludedInterface:: |
|
WebformElementManager:: |
public | function |
Constructs a WebformElementManager. Overrides DefaultPluginManager:: |