diff --git a/core/core.services.yml b/core/core.services.yml
index a7a2b3b..6c6f229 100644
--- a/core/core.services.yml
+++ b/core/core.services.yml
@@ -1219,8 +1219,7 @@ services:
tags:
- { name: twig.extension, priority: 100 }
calls:
- - [setGenerators, ['@url_generator']]
- - [setLinkGenerator, ['@link_generator']]
+ - [setDependencies, ['@url_generator', '@link_generator', '@theme.manager']]
# @todo Figure out what to do about debugging functions.
# @see http://drupal.org/node/1804998
twig.extension.debug:
diff --git a/core/lib/Drupal/Core/Template/TwigExtension.php b/core/lib/Drupal/Core/Template/TwigExtension.php
index 551e3cb..0934c68 100644
--- a/core/lib/Drupal/Core/Template/TwigExtension.php
+++ b/core/lib/Drupal/Core/Template/TwigExtension.php
@@ -15,6 +15,7 @@
use Drupal\Core\Routing\UrlGeneratorInterface;
use Drupal\Core\Url;
use Drupal\Core\Utility\LinkGeneratorInterface;
+use Drupal\Core\Theme\ThemeManagerInterface;
/**
* A class providing Drupal Twig extensions.
@@ -40,26 +41,28 @@ class TwigExtension extends \Twig_Extension {
protected $linkGenerator;
/**
- * Constructs \Drupal\Core\Template\TwigExtension.
+ * The theme manager.
*
- * @param \Drupal\Core\Routing\UrlGeneratorInterface $url_generator
- * The URL generator.
+ * @var \Drupal\Core\Theme\ThemeManagerInterface;
*/
- public function setGenerators(UrlGeneratorInterface $url_generator) {
- $this->urlGenerator = $url_generator;
- return $this;
- }
+ protected $themeManager;
/**
- * Sets the link generator.
+ * Constructs \Drupal\Core\Template\TwigExtension.
*
+ * @param \Drupal\Core\Routing\UrlGeneratorInterface $url_generator
+ * The URL generator.
* @param \Drupal\Core\Utility\LinkGeneratorInterface $link_generator
* The link generator.
+ * @param \Drupal\Core\Theme\ThemeManagerInterface $theme_manager
+ * The theme manager.
*
* @return $this
*/
- public function setLinkGenerator(LinkGeneratorInterface $link_generator) {
+ public function setDependencies(UrlGeneratorInterface $url_generator, LinkGeneratorInterface $link_generator, ThemeManagerInterface $theme_manager) {
+ $this->urlGenerator = $url_generator;
$this->linkGenerator = $link_generator;
+ $this->themeManager = $theme_manager;
return $this;
}
@@ -77,6 +80,7 @@ public function getFunctions() {
new \Twig_SimpleFunction('url_from_path', array($this, 'getUrlFromPath'), array('is_safe_callback' => array($this, 'isUrlGenerationSafe'))),
new \Twig_SimpleFunction('link', array($this, 'getLink')),
new \Twig_SimpleFunction('file_url', 'file_create_url'),
+ new \Twig_SimpleFunction('active_theme', array($this, 'activeTheme')),
);
}
@@ -219,6 +223,16 @@ public function getLink($text, $url) {
}
/**
+ * Gets the name of the active theme.
+ *
+ * @return string
+ * The name of the active theme.
+ */
+ public function activeTheme() {
+ return $this->themeManager->getActiveTheme()->getName();
+ }
+
+ /**
* Determines at compile time whether the generated URL will be safe.
*
* Saves the unneeded automatic escaping for performance reasons.
diff --git a/core/modules/system/src/Tests/Theme/EngineTwigTest.php b/core/modules/system/src/Tests/Theme/EngineTwigTest.php
index 750ae2e..9989e60 100644
--- a/core/modules/system/src/Tests/Theme/EngineTwigTest.php
+++ b/core/modules/system/src/Tests/Theme/EngineTwigTest.php
@@ -111,4 +111,13 @@ public function testTwigFileUrls() {
$this->assertRaw('
file_url: ' . $filepath . '
');
}
+ /**
+ * Tests the active_theme() function.
+ */
+ public function testActiveTheme() {
+ $this->drupalGet('/twig-theme-test/active_theme');
+ $theme = \Drupal::service('theme.manager')->getActiveTheme()->getName();
+ $this->assertRaw('active theme: ' . $theme . '
');
+ }
+
}
diff --git a/core/modules/system/tests/modules/twig_theme_test/src/TwigThemeTestController.php b/core/modules/system/tests/modules/twig_theme_test/src/TwigThemeTestController.php
index ff49bd6..15a8bbb 100644
--- a/core/modules/system/tests/modules/twig_theme_test/src/TwigThemeTestController.php
+++ b/core/modules/system/tests/modules/twig_theme_test/src/TwigThemeTestController.php
@@ -75,4 +75,11 @@ public function registryLoaderRender() {
return array('#theme' => 'twig_registry_loader_test');
}
+ /**
+ * Menu callback for testing the active theme function.
+ */
+ public function activeThemeRender() {
+ return array('#theme' => 'twig_theme_test_active_theme');
+ }
+
}
diff --git a/core/modules/system/tests/modules/twig_theme_test/templates/twig_theme_test.active_theme.html.twig b/core/modules/system/tests/modules/twig_theme_test/templates/twig_theme_test.active_theme.html.twig
new file mode 100644
index 0000000..fdf29fe
--- /dev/null
+++ b/core/modules/system/tests/modules/twig_theme_test/templates/twig_theme_test.active_theme.html.twig
@@ -0,0 +1 @@
+active theme: {{ active_theme() }}
diff --git a/core/modules/system/tests/modules/twig_theme_test/twig_theme_test.module b/core/modules/system/tests/modules/twig_theme_test/twig_theme_test.module
index 7f6fe35..8c7873e 100644
--- a/core/modules/system/tests/modules/twig_theme_test/twig_theme_test.module
+++ b/core/modules/system/tests/modules/twig_theme_test/twig_theme_test.module
@@ -50,6 +50,10 @@ function twig_theme_test_theme($existing, $type, $theme, $path) {
'variables' => array(),
'template' => 'twig_theme_test.file_url',
);
+ $items['twig_theme_test_active_theme'] = array(
+ 'variables' => array(),
+ 'template' => 'twig_theme_test.active_theme',
+ );
return $items;
}
diff --git a/core/modules/system/tests/modules/twig_theme_test/twig_theme_test.routing.yml b/core/modules/system/tests/modules/twig_theme_test/twig_theme_test.routing.yml
index 1001b47..c0b8116 100644
--- a/core/modules/system/tests/modules/twig_theme_test/twig_theme_test.routing.yml
+++ b/core/modules/system/tests/modules/twig_theme_test/twig_theme_test.routing.yml
@@ -46,3 +46,10 @@ twig_theme_test_registry_loader:
_controller: '\Drupal\twig_theme_test\TwigThemeTestController::registryLoaderRender'
requirements:
_access: 'TRUE'
+
+twig_theme_test_active_theme:
+ path: '/twig-theme-test/active_theme'
+ defaults:
+ _controller: '\Drupal\twig_theme_test\TwigThemeTestController::activeThemeRender'
+ requirements:
+ _access: 'TRUE'
diff --git a/core/tests/Drupal/Tests/Core/Template/TwigExtensionTest.php b/core/tests/Drupal/Tests/Core/Template/TwigExtensionTest.php
index 31352a6..035fadb 100644
--- a/core/tests/Drupal/Tests/Core/Template/TwigExtensionTest.php
+++ b/core/tests/Drupal/Tests/Core/Template/TwigExtensionTest.php
@@ -31,7 +31,13 @@ public function testEscaping($template, $expected) {
'autoescape' => TRUE,
'optimizations' => 0
));
- $twig->addExtension((new TwigExtension())->setGenerators($this->getMock('Drupal\Core\Routing\UrlGeneratorInterface')));
+ $twig->addExtension((new TwigExtension())
+ ->setDependencies(
+ $this->getMock('Drupal\Core\Routing\UrlGeneratorInterface'),
+ $this->getMock('Drupal\Core\Utility\LinkGeneratorInterface'),
+ $this->getMock('Drupal\Core\Theme\ThemeManagerInterface')
+ )
+ );
$nodes = $twig->parse($twig->tokenize($template));