diff --git a/core/core.services.yml b/core/core.services.yml index 6127c8f..5ca2638 100644 --- a/core/core.services.yml +++ b/core/core.services.yml @@ -1308,8 +1308,9 @@ services: tags: - { name: twig.extension, priority: 100 } calls: - - [setGenerators, ['@url_generator']] + - [setUrlGenerator, ['@url_generator']] - [setLinkGenerator, ['@link_generator']] + - [setThemeManager, ['@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 bb29cd1..432967f 100644 --- a/core/lib/Drupal/Core/Template/TwigExtension.php +++ b/core/lib/Drupal/Core/Template/TwigExtension.php @@ -17,6 +17,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. @@ -49,6 +50,13 @@ class TwigExtension extends \Twig_Extension { protected $renderer; /** + * The theme manager. + * + * @var \Drupal\Core\Theme\ThemeManagerInterface + */ + protected $themeManager; + + /** * Constructs \Drupal\Core\Template\TwigExtension. * * @param \Drupal\Core\Render\RendererInterface $renderer @@ -66,7 +74,7 @@ public function __construct(RendererInterface $renderer) { * * @return $this */ - public function setGenerators(UrlGeneratorInterface $url_generator) { + public function setUrlGenerator(UrlGeneratorInterface $url_generator) { $this->urlGenerator = $url_generator; return $this; } @@ -85,6 +93,19 @@ public function setLinkGenerator(LinkGeneratorInterface $link_generator) { } /** + * Sets the theme manager. + * + * @param \Drupal\Core\Theme\ThemeManagerInterface $theme_manager + * The theme manager. + * + * @return $this + */ + public function setThemeManager(ThemeManagerInterface $theme_manager) { + $this->themeManager = $theme_manager; + return $this; + } + + /** * {@inheritdoc} */ public function getFunctions() { @@ -98,7 +119,8 @@ 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('attach_library', array($this, 'attachLibrary')) + new \Twig_SimpleFunction('attach_library', array($this, 'attachLibrary')), + new \Twig_SimpleFunction('active_theme', array($this, 'activeTheme')) ); } @@ -243,6 +265,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 ff84af7..449bf03 100644 --- a/core/modules/system/src/Tests/Theme/EngineTwigTest.php +++ b/core/modules/system/src/Tests/Theme/EngineTwigTest.php @@ -112,6 +112,15 @@ public function testTwigFileUrls() { } /** + * 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 . '
'); + } + + /** * Tests the attach of asset libraries. */ public function testTwigAttachLibrary() { 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 50d6c99..9b39133 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 @@ -84,4 +84,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..5867b6e --- /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() }}
\ No newline at end of file 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 021d039..d3c5336 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 @@ -54,6 +54,10 @@ function twig_theme_test_theme($existing, $type, $theme, $path) { 'variables' => array(), 'template' => 'twig_theme_test.attach_library', ); + $items['twig_theme_test_active_theme'] = array( + 'variables' => array(), + 'template' => 'twig_theme_test.active_theme', + ); return $items; } @@ -93,5 +97,6 @@ function _test_theme_twig_php_values() { 'value' => 'Hello world!', 'expected' => 'Hello world!', ), + ); } 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 4cdfeca..0572dd8 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 @@ -55,3 +55,10 @@ twig_theme_test_registry_loader: no_cache: TRUE 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' \ No newline at end of file diff --git a/core/tests/Drupal/Tests/Core/Template/TwigExtensionTest.php b/core/tests/Drupal/Tests/Core/Template/TwigExtensionTest.php index 3866965..2b16e56 100644 --- a/core/tests/Drupal/Tests/Core/Template/TwigExtensionTest.php +++ b/core/tests/Drupal/Tests/Core/Template/TwigExtensionTest.php @@ -32,7 +32,7 @@ public function testEscaping($template, $expected) { 'autoescape' => TRUE, 'optimizations' => 0 )); - $twig->addExtension((new TwigExtension($renderer))->setGenerators($this->getMock('Drupal\Core\Routing\UrlGeneratorInterface'))); + $twig->addExtension((new TwigExtension($renderer))->setUrlGenerator($this->getMock('Drupal\Core\Routing\UrlGeneratorInterface'))); $nodes = $twig->parse($twig->tokenize($template));