class LayoutPluginManager in Layout Plugin (obsolete, use core's Layout Discovery) 8
Plugin type manager for all layouts.
Hierarchy
- class \Drupal\Component\Plugin\PluginManagerBase implements PluginManagerInterface uses DiscoveryTrait
- class \Drupal\Core\Plugin\DefaultPluginManager implements CachedDiscoveryInterface, PluginManagerInterface, CacheableDependencyInterface uses DiscoveryCachedTrait, UseCacheBackendTrait
- class \Drupal\layout_plugin\Plugin\Layout\LayoutPluginManager implements LayoutPluginManagerInterface uses CategorizingPluginManagerTrait
- class \Drupal\Core\Plugin\DefaultPluginManager implements CachedDiscoveryInterface, PluginManagerInterface, CacheableDependencyInterface uses DiscoveryCachedTrait, UseCacheBackendTrait
Expanded class hierarchy of LayoutPluginManager
1 file declares its use of LayoutPluginManager
- PluginManagerTest.php in tests/
src/ Unit/ PluginManagerTest.php
1 string reference to 'LayoutPluginManager'
1 service uses LayoutPluginManager
File
- src/
Plugin/ Layout/ LayoutPluginManager.php, line 15
Namespace
Drupal\layout_plugin\Plugin\LayoutView source
class LayoutPluginManager extends DefaultPluginManager implements LayoutPluginManagerInterface {
use CategorizingPluginManagerTrait;
/**
* The theme handler.
*
* @var \Drupal\Core\Extension\ThemeHandlerInterface
*/
protected $themeHandler;
/**
* Constructs a LayoutPluginManager 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\Extension\ModuleHandlerInterface $module_handler
* The module handler to invoke the alter hook with.
* @param \Drupal\Core\Extension\ThemeHandlerInterface $theme_handler
* The theme handle to invoke the alter hook with.
*/
public function __construct(\Traversable $namespaces, CacheBackendInterface $cache_backend, ModuleHandlerInterface $module_handler, ThemeHandlerInterface $theme_handler) {
$plugin_interface = 'Drupal\\layout_plugin\\Plugin\\Layout\\LayoutInterface';
$plugin_definition_annotation_name = 'Drupal\\layout_plugin\\Annotation\\Layout';
parent::__construct("Plugin/Layout", $namespaces, $module_handler, $plugin_interface, $plugin_definition_annotation_name);
$discovery = $this
->getDiscovery();
$this->discovery = new YamlDiscoveryDecorator($discovery, 'layouts', $module_handler
->getModuleDirectories() + $theme_handler
->getThemeDirectories());
$this->themeHandler = $theme_handler;
$this->defaults += array(
'type' => 'page',
// Used for plugins defined in layouts.yml that do not specify a class
// themselves.
'class' => 'Drupal\\layout_plugin\\Plugin\\Layout\\LayoutDefault',
);
$this
->setCacheBackend($cache_backend, 'layout');
$this
->alterInfo('layout');
}
/**
* {@inheritdoc}
*/
protected function providerExists($provider) {
return $this->moduleHandler
->moduleExists($provider) || $this->themeHandler
->themeExists($provider);
}
/**
* {@inheritdoc}
*/
public function processDefinition(&$definition, $plugin_id) {
parent::processDefinition($definition, $plugin_id);
// Add the module or theme path to the 'path'.
if ($this->moduleHandler
->moduleExists($definition['provider'])) {
$definition['provider_type'] = 'module';
$base_path = $this->moduleHandler
->getModule($definition['provider'])
->getPath();
}
elseif ($this->themeHandler
->themeExists($definition['provider'])) {
$definition['provider_type'] = 'theme';
$base_path = $this->themeHandler
->getTheme($definition['provider'])
->getPath();
}
else {
$base_path = '';
}
$definition['path'] = !empty($definition['path']) ? $base_path . '/' . $definition['path'] : $base_path;
// Add a dependency on the provider of the library.
if (!empty($definition['library'])) {
list($library_provider, ) = explode('/', $definition['library']);
if ($this->moduleHandler
->moduleExists($library_provider)) {
$definition['dependencies'] = [
'module' => [
$library_provider,
],
];
}
elseif ($this->themeHandler
->themeExists($library_provider)) {
$definition['dependencies'] = [
'theme' => [
$library_provider,
],
];
}
}
// Add the path to the icon filename.
if (!empty($definition['icon'])) {
$definition['icon'] = $definition['path'] . '/' . $definition['icon'];
}
// If 'template' is set, then we'll derive 'template_path' and 'theme'.
if (!empty($definition['template'])) {
$template_parts = explode('/', $definition['template']);
$definition['template'] = array_pop($template_parts);
$definition['theme'] = strtr($definition['template'], '-', '_');
$definition['template_path'] = $definition['path'];
if (count($template_parts) > 0) {
$definition['template_path'] .= '/' . implode('/', $template_parts);
}
}
// If 'css' is set, then we'll derive 'library'.
if (!empty($definition['css'])) {
$definition['css'] = $definition['path'] . '/' . $definition['css'];
$definition['library'] = 'layout_plugin/' . $plugin_id;
}
// Generate the 'region_names' key from the 'regions' key.
$definition['region_names'] = array();
if (!empty($definition['regions']) && is_array($definition['regions'])) {
foreach ($definition['regions'] as $region_id => $region_definition) {
$definition['region_names'][$region_id] = $region_definition['label'];
}
}
}
/**
* {@inheritdoc}
*/
public function getLayoutOptions(array $params = []) {
$group_by_category = !empty($params['group_by_category']);
$plugins = $group_by_category ? $this
->getGroupedDefinitions() : [
'default' => $this
->getDefinitions(),
];
$categories = $group_by_category ? $this
->getCategories() : [
'default',
];
// Go through each category, sort it, and get just the labels out.
$options = array();
foreach ($categories as $category) {
// Convert from a translation to a real string.
$category = (string) $category;
// Sort the category.
$plugins[$category] = $this
->getSortedDefinitions($plugins[$category]);
// Put only the label in the options array.
foreach ($plugins[$category] as $id => $plugin) {
$options[$category][$id] = $plugin['label'];
}
}
return $group_by_category ? $options : $options['default'];
}
/**
* {@inheritdoc}
*/
public function getThemeImplementations() {
$plugins = $this
->getDefinitions();
$theme_registry = [];
foreach ($plugins as $id => $definition) {
if (!empty($definition['template']) && !empty($definition['theme'])) {
$theme_registry[$definition['theme']] = [
'render element' => 'content',
'template' => $definition['template'],
'path' => $definition['template_path'],
];
}
}
return $theme_registry;
}
/**
* {@inheritdoc}
*/
public function alterThemeImplementations(array &$theme_registry) {
$plugins = $this
->getDefinitions();
// Find all the theme hooks which are for automatically registered templates
// (we ignore manually set theme hooks because we don't know how they were
// registered).
$layout_theme_hooks = [];
foreach ($plugins as $id => $definition) {
if (!empty($definition['template']) && !empty($definition['theme']) && isset($theme_registry[$definition['theme']])) {
$layout_theme_hooks[] = $definition['theme'];
}
}
// Go through the theme registry looking for our theme hooks and any
// suggestions based on them.
foreach ($theme_registry as $theme_hook => &$info) {
if (in_array($theme_hook, $layout_theme_hooks) || !empty($info['base hook']) && in_array($info['base hook'], $layout_theme_hooks)) {
// If 'template_preprocess' is included, we want to put our preprocess
// after to not mess up the expectation that 'template_process' always
// runs first.
if (($index = array_search('template_preprocess', $info['preprocess functions'])) !== FALSE) {
$index++;
}
else {
// Otherwise, put our preprocess function first.
$index = 0;
}
array_splice($info['preprocess functions'], $index, 0, '_layout_plugin_preprocess_layout');
}
}
}
/**
* Gets the version of the given provider.
*
* Wraps system_get_info() so that we can mock it in our tests.
*
* @param string $provider_type
* The provider type (ex. module or theme).
* @param string $provider
* The name of the provider.
*
* @return string
* The version string for the provider or 'VERSION' if it can't be found.
*/
protected function getProviderVersion($provider_type, $provider) {
$info = system_get_info($provider_type, $provider);
return !empty($info['version']) ? $info['version'] : 'VERSION';
}
/**
* {@inheritdoc}
*/
public function getLibraryInfo() {
$plugins = $this
->getDefinitions();
$library_info = [];
foreach ($plugins as $id => $definition) {
if (!empty($definition['css']) && !empty($definition['library'])) {
list($library_module, $library_name) = explode('/', $definition['library']);
// Make sure the library is from layout_plugin.
if ($library_module != 'layout_plugin') {
continue;
}
$library_info[$library_name] = [
'version' => $this
->getProviderVersion($definition['provider_type'], $definition['provider']),
'css' => [
'theme' => [
'/' . $definition['css'] => [],
],
],
];
}
}
return $library_info;
}
}
Members
Name | Modifiers | Type | Description | Overrides |
---|---|---|---|---|
CategorizingPluginManagerTrait:: |
public | function | ||
CategorizingPluginManagerTrait:: |
public | function | ||
CategorizingPluginManagerTrait:: |
public | function | Returns the module handler used. | |
CategorizingPluginManagerTrait:: |
protected | function | Gets the name of a provider. | |
CategorizingPluginManagerTrait:: |
public | function | ||
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 | Invokes the hook to alter the definitions if the alter hook is set. | 1 |
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 | 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 | ||
LayoutPluginManager:: |
protected | property | The theme handler. | |
LayoutPluginManager:: |
public | function |
Modifies the theme implementations for the layouts that we registered. Overrides LayoutPluginManagerInterface:: |
|
LayoutPluginManager:: |
public | function |
Get all available layouts as an options array. Overrides LayoutPluginManagerInterface:: |
|
LayoutPluginManager:: |
public | function |
Get library info for layouts that want to automatically register CSS. Overrides LayoutPluginManagerInterface:: |
|
LayoutPluginManager:: |
protected | function | Gets the version of the given provider. | |
LayoutPluginManager:: |
public | function |
Get theme implementations for layouts that give only a template. Overrides LayoutPluginManagerInterface:: |
|
LayoutPluginManager:: |
public | function |
Performs extra processing on plugin definitions. Overrides DefaultPluginManager:: |
|
LayoutPluginManager:: |
protected | function |
Determines if the provider of a definition exists. Overrides DefaultPluginManager:: |
|
LayoutPluginManager:: |
public | function |
Constructs a LayoutPluginManager object. Overrides DefaultPluginManager:: |
|
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 |
Creates a pre-configured instance of a plugin. Overrides FactoryInterface:: |
12 |
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. |