%PDF- %PDF-
| Direktori : /home/vacivi36/intranet.vacivitta.com.br/protected/humhub/modules/ui/view/helpers/ |
| Current File : /home/vacivi36/intranet.vacivitta.com.br/protected/humhub/modules/ui/view/helpers/ThemeHelper.php |
<?php
/**
* @link https://www.humhub.org/
* @copyright Copyright (c) 2018 HumHub GmbH & Co. KG
* @license https://www.humhub.com/licences
*/
namespace humhub\modules\ui\view\helpers;
use humhub\modules\ui\view\components\Theme;
use Yii;
use yii\base\InvalidConfigException;
use yii\helpers\ArrayHelper;
/**
* ThemeHelper
*
* @since 1.3
*/
class ThemeHelper
{
/**
* @var Theme[] loaded themes
*/
protected static $_themes = null;
/**
* Returns an array of all available themes.
*
* @return Theme[] The themes
*/
public static function getThemes()
{
if (static::$_themes !== null) {
return static::$_themes;
}
$themes = self::getThemesByPath(Yii::getAlias('@themes'));
// Collect themes provided by modules
foreach (Yii::$app->getModules() as $id => $module) {
if (is_array($module) || is_string($module)) {
try {
$module = Yii::$app->getModule($id);
} catch (\Exception $ex) {
Yii::error('Could not load module to fetch themes! Module: ' . $id . ' Error: ' . $ex->getMessage(), 'ui');
continue;
}
}
$moduleThemePath = $module->getBasePath() . DIRECTORY_SEPARATOR . 'themes';
if (is_dir($moduleThemePath)) {
$themes = ArrayHelper::merge(
$themes,
self::getThemesByPath(
$moduleThemePath, ['publishResources' => true]
)
);
}
}
static::$_themes = $themes;
return $themes;
}
/**
* Returns an array of Theme instances of a given directory
*
* @param string $path the theme directory
* @param array $additionalOptions options for Theme instance
* @return Theme[]
*/
public static function getThemesByPath($path, $additionalOptions = [])
{
$themes = [];
foreach (scandir($path) as $file) {
if ($file == "." || $file == ".." || !is_dir($path . DIRECTORY_SEPARATOR . $file)) {
continue;
}
$theme = static::getThemeByPath($path . DIRECTORY_SEPARATOR . $file, $additionalOptions);
if ($theme !== null) {
$themes[$theme->name] = $theme;
}
}
return $themes;
}
/**
* Return a Theme instance by given path
*
* @param $path
* @param array $options additional options for Theme instance
* @return Theme|null
*/
public static function getThemeByPath($path, $options = [])
{
try {
/** @var Theme $theme */
$theme = Yii::createObject(ArrayHelper::merge([
'class' => 'humhub\modules\ui\view\components\Theme',
'basePath' => $path,
'name' => basename($path),
'publishResources' => (dirname($path) !== Yii::getAlias('@themes'))
], $options));
} catch (InvalidConfigException $e) {
Yii::error('Could not get theme by path "' . $path . '" - Error: ' . $e->getMessage());
return null;
}
return $theme;
}
/**
* Returns a Theme by given name
*
* @param string $name of the theme
* @return Theme
*/
public static function getThemeByName($name)
{
foreach (self::getThemes() as $theme) {
if ($theme->name === $name) {
return $theme;
}
}
return null;
}
/**
* @param Theme $theme
* @return array
*/
public static function getAllVariables(Theme $theme)
{
$variables = LessHelper::parseLessVariables(Yii::getAlias('@webroot-static/less/variables.less'));
foreach (array_reverse(static::getThemeTree($theme)) as $theme) {
$eeVariablesFile = $theme->getBasePath() . '/less/enterprise_variables.less';
if (file_exists($eeVariablesFile)) {
$variables = ArrayHelper::merge($variables, LessHelper::parseLessVariables($eeVariablesFile));
}
$variables = ArrayHelper::merge($variables, LessHelper::parseLessVariables(LessHelper::getVariableFile($theme)));
}
return LessHelper::updateLinkedLessVariables($variables);
}
/**
* Returns an array of all used themes
*
* @param Theme $theme
* @param boolean $includeBaseTheme should the given theme also included in the theme tree
* @return Theme[] the parent themes
*/
public static function getThemeTree(Theme $theme, $includeBaseTheme = true)
{
if (!$includeBaseTheme) {
$theme = static::getThemeParent($theme);
if ($theme === null) {
return [];
}
}
$parents = [];
do {
// check loop
if (array_key_exists($theme->name, $parents)) {
Yii::error('Theme parent loop detected: ' . $theme->name, 'ui');
return $parents;
}
$parents[$theme->name] = $theme;
$theme = static::getThemeParent($theme);
} while ($theme !== null);
return $parents;
}
/**
* @param Theme $theme
* @return Theme|null
*/
public static function getThemeParent(Theme $theme)
{
$themes = static::getThemes();
$variables = LessHelper::parseLessVariables(
LessHelper::getVariableFile($theme)
);
if (isset($variables['baseTheme']) && isset($themes[$variables['baseTheme']]) && $variables['baseTheme'] !== $theme->name) {
return $themes[$variables['baseTheme']];
}
return null;
}
/**
* @param Theme|null $theme
* @return bool
* @since 1.4
*/
public static function isFluid(Theme $theme = null)
{
if ($theme === null) {
$theme = Yii::$app->view->theme;
}
return $theme->variable('isFluid') == 'true';
}
}