diff --git a/core/core.services.yml b/core/core.services.yml index 58db84c..97e408b 100644 --- a/core/core.services.yml +++ b/core/core.services.yml @@ -1322,7 +1322,7 @@ services: tags: - { name: twig.extension, priority: 100 } calls: - - [setGenerators, ['@url_generator']] + - [setGenerators, ['@url_generator', '@theme.manager']] # @todo Figure out what to do about debugging functions. # @see https://www.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 1902113..88c6add 100644 --- a/core/lib/Drupal/Core/Template/TwigExtension.php +++ b/core/lib/Drupal/Core/Template/TwigExtension.php @@ -15,6 +15,7 @@ use Drupal\Component\Utility\SafeMarkup; use Drupal\Core\Render\RendererInterface; use Drupal\Core\Routing\UrlGeneratorInterface; +use Drupal\Core\Theme\ThemeManagerInterface; use Drupal\Core\Url; /** @@ -41,6 +42,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 @@ -58,8 +66,9 @@ public function __construct(RendererInterface $renderer) { * * @return $this */ - public function setGenerators(UrlGeneratorInterface $url_generator) { + public function setGenerators(UrlGeneratorInterface $url_generator, ThemeManagerInterface $theme_manager) { $this->urlGenerator = $url_generator; + $this->themeManager = $theme_manager; return $this; } @@ -67,7 +76,7 @@ public function setGenerators(UrlGeneratorInterface $url_generator) { * {@inheritdoc} */ public function getFunctions() { - return array( + return [ // This function will receive a renderable array, if an array is detected. new \Twig_SimpleFunction('render_var', array($this, 'renderVar')), // The url and path function are defined in close parallel to those found @@ -77,8 +86,9 @@ 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', [$this, 'attachLibrary']), + new \Twig_SimpleFunction('active_theme', [$this, 'getActiveTheme']), + ]; } /** @@ -247,6 +257,16 @@ public function getLink($text, $url, array $attributes = []) { } /** + * Gets the name of the active theme. + * + * @return string + * The name of the active theme. + */ + public function getActiveTheme() { + 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/tests/Drupal/Tests/Core/Template/TwigExtensionTest.php b/core/tests/Drupal/Tests/Core/Template/TwigExtensionTest.php index 3866965..06d6dc3 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))->setGenerators($this->getMock('Drupal\Core\Routing\UrlGeneratorInterface'), $this->getMock('Drupal\Core\Theme\ThemeManagerInterface'))); $nodes = $twig->parse($twig->tokenize($template)); @@ -72,4 +72,32 @@ public function providerTestEscaping() { ); } + /** + * Tests the active_theme function. + */ + public function testActiveTheme() { + $renderer = $this->getMock('\Drupal\Core\Render\RendererInterface'); + $extension = new TwigExtension($renderer); + $url_generator = $this->getMock('\Drupal\Core\Routing\UrlGeneratorInterface'); + $theme_manager = $this->getMock('\Drupal\Core\Theme\ThemeManagerInterface'); + $active_theme = $this->getMockBuilder('\Drupal\Core\Theme\ActiveTheme') + ->disableOriginalConstructor() + ->getMock(); + $active_theme + ->expects($this->once()) + ->method('getName') + ->willReturn('test_theme'); + $theme_manager + ->expects($this->once()) + ->method('getActiveTheme') + ->willReturn($active_theme); + $extension->setGenerators($url_generator, $theme_manager); + + $loader = new \Twig_Loader_String(); + $twig = new \Twig_Environment($loader); + $twig->addExtension($extension); + $result = $twig->render('{{ active_theme() }}'); + $this->assertEquals('test_theme', $result); + } + }