Unverified Commit 0f2bebf2 authored by larowlan's avatar larowlan

Issue #2861840 by tim.plunkett, lauriii: Preprocess functions are not merged...

Issue #2861840 by tim.plunkett, lauriii: Preprocess functions are not merged when a module registers a theme hook for a theme-provided template
parent 71584842
...@@ -2,6 +2,7 @@ ...@@ -2,6 +2,7 @@
namespace Drupal\Core\Theme; namespace Drupal\Core\Theme;
use Drupal\Component\Utility\NestedArray;
use Drupal\Core\Cache\Cache; use Drupal\Core\Cache\Cache;
use Drupal\Core\Cache\CacheBackendInterface; use Drupal\Core\Cache\CacheBackendInterface;
use Drupal\Core\DestructableInterface; use Drupal\Core\DestructableInterface;
...@@ -565,10 +566,18 @@ protected function processExtension(array &$cache, $name, $type, $theme, $path) ...@@ -565,10 +566,18 @@ protected function processExtension(array &$cache, $name, $type, $theme, $path)
$info['preprocess functions'] = array_merge($cache[$hook]['preprocess functions'], $info['preprocess functions']); $info['preprocess functions'] = array_merge($cache[$hook]['preprocess functions'], $info['preprocess functions']);
} }
$result[$hook]['preprocess functions'] = $info['preprocess functions']; $result[$hook]['preprocess functions'] = $info['preprocess functions'];
// If a theme implementation definition provides both 'template' and
// 'function', the 'function' will be used. In this case, if the new
// result provides a 'template' value, any existing 'function' value
// must be removed for the override to be called.
if (isset($result[$hook]['template'])) {
unset($cache[$hook]['function']);
}
} }
// Merge the newly created theme hooks into the existing cache. // Merge the newly created theme hooks into the existing cache.
$cache = $result + $cache; $cache = NestedArray::mergeDeep($cache, $result);
} }
// Let themes have variable preprocessors even if they didn't register a // Let themes have variable preprocessors even if they didn't register a
......
...@@ -33,6 +33,17 @@ protected function setUp() { ...@@ -33,6 +33,17 @@ protected function setUp() {
$this->layoutPluginManager = $this->container->get('plugin.manager.core.layout'); $this->layoutPluginManager = $this->container->get('plugin.manager.core.layout');
} }
/**
* Tests that a layout provided by a theme has the preprocess function set.
*/
public function testThemeProvidedLayout() {
$this->container->get('theme_installer')->install(['test_layout_theme']);
$this->config('system.theme')->set('default', 'test_layout_theme')->save();
$theme_definitions = $this->container->get('theme.registry')->get();
$this->assertTrue(in_array('template_preprocess_layout', $theme_definitions['test_layout_theme']['preprocess functions']));
}
/** /**
* Test rendering a layout. * Test rendering a layout.
* *
......
name: 'Test layout theme'
type: theme
description: 'Theme for testing a theme-provided layout'
version: VERSION
base theme: classy
core: 8.x
test_layout_theme:
label: 'Test Layout - Theme'
category: 'Test Layout Theme'
template: templates/test-layout-theme
regions:
content:
label: Content
...@@ -66,6 +66,10 @@ function theme_test_theme($existing, $type, $theme, $path) { ...@@ -66,6 +66,10 @@ function theme_test_theme($existing, $type, $theme, $path) {
'bar' => '', 'bar' => '',
], ],
]; ];
$items['theme_test_registered_by_module'] = [
'render element' => 'content',
'base hook' => 'container',
];
return $items; return $items;
} }
...@@ -213,3 +217,9 @@ function theme_test_theme_suggestions_node(array $variables) { ...@@ -213,3 +217,9 @@ function theme_test_theme_suggestions_node(array $variables) {
return $suggestions; return $suggestions;
} }
/**
* Implements template_preprocess_HOOK() for theme_test_registered_by_module.
*/
function template_preprocess_theme_test_registered_by_module() {
}
{# Output for Theme API test #}
Template provided by theme is registered by module.
...@@ -192,4 +192,23 @@ public function testThemeSuggestions() { ...@@ -192,4 +192,23 @@ public function testThemeSuggestions() {
], $suggestions, 'Found expected page node suggestions.'); ], $suggestions, 'Found expected page node suggestions.');
} }
/**
* Tests theme-provided templates that are registered by modules.
*/
public function testThemeTemplatesRegisteredByModules() {
$theme_handler = \Drupal::service('theme_handler');
$theme_handler->install(['test_theme']);
$registry_theme = new Registry(\Drupal::root(), \Drupal::cache(), \Drupal::lock(), \Drupal::moduleHandler(), $theme_handler, \Drupal::service('theme.initialization'), 'test_theme');
$registry_theme->setThemeManager(\Drupal::theme());
$expected = [
'template_preprocess',
'template_preprocess_container',
'template_preprocess_theme_test_registered_by_module'
];
$registry = $registry_theme->get();
$this->assertEquals($expected, array_values($registry['theme_test_registered_by_module']['preprocess functions']));
}
} }
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment