plus-8.x-4.x-dev/src/Core/Extension/ThemeHandler.php
src/Core/Extension/ThemeHandler.php
<?php
namespace Drupal\plus\Core\Extension;
use Drupal\Core\Extension\Extension;
use Drupal\Core\Extension\ThemeHandler as CoreThemeHandler;
use Drupal\Core\Theme\ActiveTheme;
use Drupal\plus\Plugin\Theme\ThemeInterface;
/**
* {@inheritdoc}
*/
class ThemeHandler extends CoreThemeHandler {
/**
* A cached list of each theme's ancestry, keyed by machine name.
*
* @var array
*/
protected $ancestry = [];
/**
* Retrieves a list of the full ancestry of a theme.
*
* @param string $theme
* The theme name to retrieve ancestry for. If not provided, the ancestry
* for the active theme is returned.
* @param bool $reverse
* Whether or not to return the array of themes in reverse order, where the
* provided $theme is the first item in the list.
*
* @return \Drupal\Core\Extension\Extension[]
* An associative array of Extension objects, keyed by machine name.
*/
public function getAncestry($theme = NULL, $reverse = FALSE) {
$name = $this->normalizeThemeName($theme);
if (!isset($this->ancestry[$name])) {
$themes = $this->listInfo();
$this->ancestry[$name] = $this->getBaseThemes($themes, $name);
$this->ancestry[$name][$name] = $themes[$name];
}
return array_keys($reverse ? array_reverse($this->ancestry[$name]) : $this->ancestry[$name]);
}
/**
* Helper for normalizing an argument into the machine name of a theme.
*
* @param mixed $theme
* An object or string name of a theme.
*
* @return string
* The machine name of the theme.
*/
public function normalizeThemeName($theme = NULL) {
// Use active theme if no theme name or object was provided.
if (!isset($theme)) {
// Due to recursion, the Theme Manager service cannot be injected.
$name = \Drupal::service('theme.manager')->getActiveTheme()->getName();
}
elseif ($theme instanceof ThemeInterface || $theme instanceof Extension || $theme instanceof ActiveTheme) {
$name = $theme->getName();
}
else {
$name = (string) $theme;
}
return $name;
}
}
