Issue #2416831 by cilefen, vasi, tadityar, Noe_, lauriii, akalata, JeroenT, Cottser, davidhernandez: Add an active_theme twig function

8.0.x
Alex Pott 2015-05-28 23:05:26 +01:00
parent e96d427046
commit ffe9803c1b
3 changed files with 63 additions and 3 deletions

View File

@ -1323,6 +1323,7 @@ services:
- { name: twig.extension, priority: 100 }
calls:
- [setGenerators, ['@url_generator']]
- [setThemeManager, ['@theme.manager']]
# @todo Figure out what to do about debugging functions.
# @see https://www.drupal.org/node/1804998
twig.extension.debug:

View File

@ -15,6 +15,7 @@ namespace Drupal\Core\Template;
use Drupal\Component\Utility\SafeMarkup;
use Drupal\Core\Render\RendererInterface;
use Drupal\Core\Routing\UrlGeneratorInterface;
use Drupal\Core\Theme\ThemeManagerInterface;
use Drupal\Core\Url;
/**
@ -40,6 +41,13 @@ class TwigExtension extends \Twig_Extension {
*/
protected $renderer;
/**
* The theme manager.
*
* @var \Drupal\Core\Theme\ThemeManagerInterface
*/
protected $themeManager;
/**
* Constructs \Drupal\Core\Template\TwigExtension.
*
@ -63,11 +71,24 @@ class TwigExtension extends \Twig_Extension {
return $this;
}
/**
* 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() {
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 +98,9 @@ class TwigExtension extends \Twig_Extension {
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']),
];
}
/**
@ -246,6 +268,16 @@ class TwigExtension extends \Twig_Extension {
return $build;
}
/**
* 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.
*

View File

@ -72,4 +72,31 @@ class TwigExtensionTest extends UnitTestCase {
);
}
/**
* Tests the active_theme function.
*/
public function testActiveTheme() {
$renderer = $this->getMock('\Drupal\Core\Render\RendererInterface');
$extension = new TwigExtension($renderer);
$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->setThemeManager($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);
}
}