castopod/app/Libraries/ViewThemes/Theme.php

100 lines
2.0 KiB
PHP

<?php
declare(strict_types=1);
namespace ViewThemes;
use ViewThemes\Config\Themes;
/**
* Borrowed and adapted from https://github.com/lonnieezell/Bonfire2
*/
class Theme
{
protected Themes $config;
/**
* @var string
*/
protected static $defaultTheme = 'app';
/**
* @var string
*/
protected static $currentTheme;
/**
* Holds theme info retrieved
*
* @var array<int, array<string, mixed>>
*/
protected static array $info = [];
public function __construct()
{
$this->config = config('Themes');
}
/**
* Sets the active theme.
*/
public static function setTheme(string $theme): void
{
static::$currentTheme = $theme;
}
/**
* Returns the path to the specified theme folder. If no theme is provided, will use the current theme.
*/
public static function path(string $theme = null): string
{
if ($theme === null) {
$theme = static::current();
}
// Ensure we've pulled the theme info
if (static::$info === []) {
static::$info = self::available();
}
foreach (static::$info as $info) {
if ($info['name'] === $theme) {
return $info['path'];
}
}
return '';
}
/**
* Returns the name of the active theme.
*/
public static function current(): string
{
return static::$currentTheme !== null
? static::$currentTheme
: static::$defaultTheme;
}
/**
* Returns an array of all available themes and the paths to their directories.
*
* @return array<int, array<string, mixed>>
*/
public static function available(): array
{
$themes = [];
$config = config('Themes');
foreach ($config->themes as $name => $folder) {
$themes[] = [
'name' => $name,
'path' => $config->themesDirectory . '/' . $folder . '/',
];
}
return $themes;
}
}