blue-twilight/app/Helpers/ThemeHelper.php

88 lines
2.4 KiB
PHP

<?php
namespace App\Helpers;
use App\Configuration;
use App\Facade\UserConfig;
class ThemeHelper
{
const DEFAULT_THEME = 'base';
public function current()
{
return $this->getThemeName();
}
public function hasStylesheet()
{
$cssFilename = sprintf('%s/%s/theme.css', $this->getThemePublicPath(), $this->getThemeName());
return file_exists($cssFilename);
}
public function info()
{
$themeName = $this->getThemeName();
$jsonFile = sprintf('%s/%s/theme.json', $this->getThemePrivatePath(), $this->sanitiseThemeName($themeName));
if (file_exists($jsonFile))
{
return json_decode(file_get_contents($jsonFile), true);
}
return array();
}
public function render($viewPath, array $viewData = array())
{
return view($this->viewName($viewPath), $viewData);
}
public function viewName($viewPath)
{
$themeName = $this->getThemeName();
// First see if the current theme has the specified file
$requestedViewFilename = $this->getRealFilePath($themeName, $viewPath);
if (!file_exists($requestedViewFilename))
{
// If it doesn't, revert to the base theme
// TODO allow themes to specify another theme as the parent, and traverse up the theme tree to find the
// relevant file - this allows for sub-themes
$themeName = ThemeHelper::DEFAULT_THEME;
}
return sprintf('themes.%s.%s', $themeName, $viewPath);
}
private function getRealFilePath($themeName, $viewPath)
{
return sprintf(
'%s/%s/%s.blade.php',
$this->getThemePrivatePath(),
$themeName,
str_replace('.', DIRECTORY_SEPARATOR, $viewPath)
);
}
private function getThemePrivatePath()
{
return sprintf('%s/resources/views/themes', dirname(dirname(__DIR__)));
}
private function getThemePublicPath()
{
return sprintf('%s/public/themes', dirname(dirname(__DIR__)));
}
private function getThemeName()
{
return $this->sanitiseThemeName(UserConfig::get('theme'));
}
private function sanitiseThemeName($themeName)
{
// Ensure nasty people can't try and trick us into traversing the directory tree
return preg_replace('/[\\\.\/]/', '', strtolower($themeName));
}
}