Mercurial > hg > isophonics-drupal-site
diff core/lib/Drupal/Core/Render/ElementInfoManager.php @ 0:4c8ae668cc8c
Initial import (non-working)
author | Chris Cannam |
---|---|
date | Wed, 29 Nov 2017 16:09:58 +0000 |
parents | |
children |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/core/lib/Drupal/Core/Render/ElementInfoManager.php Wed Nov 29 16:09:58 2017 +0000 @@ -0,0 +1,165 @@ +<?php + +namespace Drupal\Core\Render; + +use Drupal\Core\Cache\Cache; +use Drupal\Core\Cache\CacheBackendInterface; +use Drupal\Core\Cache\CacheTagsInvalidatorInterface; +use Drupal\Core\Extension\ModuleHandlerInterface; +use Drupal\Core\Plugin\DefaultPluginManager; +use Drupal\Core\Render\Element\FormElementInterface; +use Drupal\Core\Theme\ThemeManagerInterface; + +/** + * Provides a plugin manager for element plugins. + * + * @see \Drupal\Core\Render\Annotation\RenderElement + * @see \Drupal\Core\Render\Annotation\FormElement + * @see \Drupal\Core\Render\Element\RenderElement + * @see \Drupal\Core\Render\Element\FormElement + * @see \Drupal\Core\Render\Element\ElementInterface + * @see \Drupal\Core\Render\Element\FormElementInterface + * @see plugin_api + */ +class ElementInfoManager extends DefaultPluginManager implements ElementInfoManagerInterface { + + /** + * Stores the available element information. + * + * @var array + */ + protected $elementInfo; + + /** + * The theme manager. + * + * @var \Drupal\Core\Theme\ThemeManagerInterface + */ + protected $themeManager; + + /** + * The cache tag invalidator. + * + * @var \Drupal\Core\Cache\CacheTagsInvalidatorInterface + */ + protected $cacheTagInvalidator; + + /** + * Constructs a ElementInfoManager object. + * + * @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\Cache\CacheTagsInvalidatorInterface $cache_tag_invalidator + * The cache tag invalidator. + * @param \Drupal\Core\Extension\ModuleHandlerInterface $module_handler + * The module handler to invoke the alter hook with. + * @param \Drupal\Core\Theme\ThemeManagerInterface $theme_manager + * The theme manager. + */ + public function __construct(\Traversable $namespaces, CacheBackendInterface $cache_backend, CacheTagsInvalidatorInterface $cache_tag_invalidator, ModuleHandlerInterface $module_handler, ThemeManagerInterface $theme_manager) { + $this->setCacheBackend($cache_backend, 'element_info'); + $this->themeManager = $theme_manager; + $this->cacheTagInvalidator = $cache_tag_invalidator; + + parent::__construct('Element', $namespaces, $module_handler, 'Drupal\Core\Render\Element\ElementInterface', 'Drupal\Core\Render\Annotation\RenderElement'); + } + + /** + * {@inheritdoc} + */ + public function getInfo($type) { + $theme_name = $this->themeManager->getActiveTheme()->getName(); + if (!isset($this->elementInfo[$theme_name])) { + $this->elementInfo[$theme_name] = $this->buildInfo($theme_name); + } + $info = isset($this->elementInfo[$theme_name][$type]) ? $this->elementInfo[$theme_name][$type] : []; + $info['#defaults_loaded'] = TRUE; + return $info; + } + + /** + * {@inheritdoc} + */ + public function getInfoProperty($type, $property_name, $default = NULL) { + $info = $this->getInfo($type); + + return isset($info[$property_name]) ? $info[$property_name] : $default; + } + + /** + * Builds up all element information. + * + * @param string $theme_name + * The theme name. + * + * @return array + */ + protected function buildInfo($theme_name) { + // Get cached definitions. + $cid = $this->getCid($theme_name); + if ($cache = $this->cacheBackend->get($cid)) { + return $cache->data; + } + + // Otherwise, rebuild and cache. + $info = []; + foreach ($this->getDefinitions() as $element_type => $definition) { + $element = $this->createInstance($element_type); + $element_info = $element->getInfo(); + + // If this is element is to be used exclusively in a form, denote that it + // will receive input, and assign the value callback. + if ($element instanceof FormElementInterface) { + $element_info['#input'] = TRUE; + $element_info['#value_callback'] = [$definition['class'], 'valueCallback']; + } + $info[$element_type] = $element_info; + } + + foreach ($info as $element_type => $element) { + $info[$element_type]['#type'] = $element_type; + } + // Allow modules to alter the element type defaults. + $this->moduleHandler->alter('element_info', $info); + $this->themeManager->alter('element_info', $info); + + $this->cacheBackend->set($cid, $info, Cache::PERMANENT, ['element_info_build']); + + return $info; + } + + /** + * {@inheritdoc} + * + * @return \Drupal\Core\Render\Element\ElementInterface + */ + public function createInstance($plugin_id, array $configuration = []) { + return parent::createInstance($plugin_id, $configuration); + } + + /** + * {@inheritdoc} + */ + public function clearCachedDefinitions() { + $this->elementInfo = NULL; + $this->cacheTagInvalidator->invalidateTags(['element_info_build']); + + parent::clearCachedDefinitions(); + } + + /** + * Returns the CID used to cache the element info. + * + * @param string $theme_name + * The theme name. + * + * @return string + */ + protected function getCid($theme_name) { + return 'element_info_build:' . $theme_name; + } + +}