View source
<?php
namespace Drupal\layout_plugin\Plugin\Layout;
use Drupal\Core\Cache\CacheBackendInterface;
use Drupal\Core\Extension\ModuleHandlerInterface;
use Drupal\Core\Extension\ThemeHandlerInterface;
use Drupal\Core\Plugin\CategorizingPluginManagerTrait;
use Drupal\Core\Plugin\DefaultPluginManager;
use Drupal\Core\Plugin\Discovery\YamlDiscoveryDecorator;
class LayoutPluginManager extends DefaultPluginManager implements LayoutPluginManagerInterface {
use CategorizingPluginManagerTrait;
protected $themeHandler;
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',
'class' => 'Drupal\\layout_plugin\\Plugin\\Layout\\LayoutDefault',
);
$this
->setCacheBackend($cache_backend, 'layout');
$this
->alterInfo('layout');
}
protected function providerExists($provider) {
return $this->moduleHandler
->moduleExists($provider) || $this->themeHandler
->themeExists($provider);
}
public function processDefinition(&$definition, $plugin_id) {
parent::processDefinition($definition, $plugin_id);
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;
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,
],
];
}
}
if (!empty($definition['icon'])) {
$definition['icon'] = $definition['path'] . '/' . $definition['icon'];
}
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 (!empty($definition['css'])) {
$definition['css'] = $definition['path'] . '/' . $definition['css'];
$definition['library'] = 'layout_plugin/' . $plugin_id;
}
$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'];
}
}
}
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',
];
$options = array();
foreach ($categories as $category) {
$category = (string) $category;
$plugins[$category] = $this
->getSortedDefinitions($plugins[$category]);
foreach ($plugins[$category] as $id => $plugin) {
$options[$category][$id] = $plugin['label'];
}
}
return $group_by_category ? $options : $options['default'];
}
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;
}
public function alterThemeImplementations(array &$theme_registry) {
$plugins = $this
->getDefinitions();
$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'];
}
}
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 (($index = array_search('template_preprocess', $info['preprocess functions'])) !== FALSE) {
$index++;
}
else {
$index = 0;
}
array_splice($info['preprocess functions'], $index, 0, '_layout_plugin_preprocess_layout');
}
}
}
protected function getProviderVersion($provider_type, $provider) {
$info = system_get_info($provider_type, $provider);
return !empty($info['version']) ? $info['version'] : 'VERSION';
}
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']);
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;
}
}