ElementInfoManager.php in Drupal 8
File
core/lib/Drupal/Core/Render/ElementInfoManager.php
View source
<?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;
class ElementInfoManager extends DefaultPluginManager implements ElementInfoManagerInterface {
protected $elementInfo;
protected $themeManager;
protected $cacheTagInvalidator;
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');
$this
->alterInfo('element_plugin');
}
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;
}
public function getInfoProperty($type, $property_name, $default = NULL) {
$info = $this
->getInfo($type);
return isset($info[$property_name]) ? $info[$property_name] : $default;
}
protected function buildInfo($theme_name) {
$cid = $this
->getCid($theme_name);
if ($cache = $this->cacheBackend
->get($cid)) {
return $cache->data;
}
$info = [];
foreach ($this
->getDefinitions() as $element_type => $definition) {
$element = $this
->createInstance($element_type);
$element_info = $element
->getInfo();
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;
}
$this->moduleHandler
->alter('element_info', $info);
$this->themeManager
->alter('element_info', $info);
$this->cacheBackend
->set($cid, $info, Cache::PERMANENT, [
'element_info_build',
]);
return $info;
}
public function createInstance($plugin_id, array $configuration = []) {
return parent::createInstance($plugin_id, $configuration);
}
public function clearCachedDefinitions() {
$this->elementInfo = NULL;
$this->cacheTagInvalidator
->invalidateTags([
'element_info_build',
]);
parent::clearCachedDefinitions();
}
protected function getCid($theme_name) {
return 'element_info_build:' . $theme_name;
}
}