%PDF- %PDF-
| Direktori : /home/vacivi36/intranet.vacivitta.com.br/protected/humhub/modules/ui/view/components/ |
| Current File : /home/vacivi36/intranet.vacivitta.com.br/protected/humhub/modules/ui/view/components/Theme.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\components;
use humhub\assets\AppAsset;
use humhub\assets\CoreBundleAsset;
use humhub\libs\BaseSettingsManager;
use humhub\modules\ui\view\helpers\ThemeHelper;
use Yii;
use yii\base\Theme as BaseTheme;
/**
* Theme represents a HumHub theme.
*
* - Overwrite views
* When [[View]] renders a view file, it will check the [[View::theme|active theme]]
* to see if there is a themed version of the view file exists. If so, the themed version will be rendered instead.
* See [[ThemeViews]] for more details.
*
* - Using less variables
* Using this theme class you can also access all LESS style variables of the current theme.
*
* Examples:
*
* ```php
* $primaryColorCode = Yii::$app->view->theme->variable('primary');
* $isFluid = (boolean) Yii::$app->view->theme->variable('isFluid');
* ```
*
* See [[ThemeVariables]] for more details.
*
* @since 1.3
* @inheritdoc
*/
class Theme extends BaseTheme
{
/**
* @var string the name of the theme
*/
public $name;
/**
* @inheritdoc
*/
private $_baseUrl = null;
/**
* @var boolean indicates that resources should be published via assetManager
*/
public $publishResources = false;
/**
* @var ThemeVariables
*/
public $variables = null;
/**
* @var ThemeViews
*/
public $views = null;
/**
* @var Theme[] the parent themes
*/
protected $parents;
/**
* @inheritdoc
*/
public function init()
{
if ($this->getBasePath() == '') {
$this->setBasePath('@webroot/themes/' . $this->name);
}
$this->variables = new ThemeVariables(['theme' => $this]);
$this->views = new ThemeViews(['theme' => $this]);
parent::init();
}
/**
* @inheritdoc
*/
public function getBaseUrl()
{
if ($this->_baseUrl !== null) {
return $this->_baseUrl;
}
$this->_baseUrl = ($this->publishResources) ? $this->publishResources() : rtrim(Yii::getAlias('@web/themes/' . $this->name), '/');
return $this->_baseUrl;
}
/**
* Registers theme css and resources to the view
* @param bool $includeParents also register parent themes
*/
public function register($includeParents = true)
{
if(Yii::$app->request->isAjax) {
return;
}
if ($includeParents) {
foreach (array_reverse($this->getParents()) as $parent) {
/** @var Theme $parent */
$parent->register(false);
}
}
if (file_exists($this->getBasePath() . '/css/theme.css')) {
$mtime = filemtime($this->getBasePath() . '/css/theme.css');
Yii::$app->view->registerCssFile($this->getBaseUrl() . '/css/theme.css?v=' . $mtime, ['depends' => CoreBundleAsset::class]);
}
}
/**
* Activate this theme
*/
public function activate()
{
$this->publishResources(true);
$this->variables->flushCache();
Yii::$app->settings->set('theme', $this->getBasePath());
Yii::$app->settings->delete('themeParents');
}
/**
* Checks whether the Theme is currently active.
*
* @return boolean
*/
public function isActive()
{
return ($this->name === Yii::$app->view->theme->name);
}
/**
* @inheritdoc
*/
public function applyTo($path)
{
$this->initPathMap();
$translated = $this->views->translate($path);
if ($translated !== null) {
return $translated;
}
// Check if a parent theme may translate this view
foreach ($this->getParents() as $theme) {
$translated = $theme->views->translate($path);
if ($translated !== null) {
return $translated;
}
}
return parent::applyTo($path);
}
/**
* Initialize the default view path map including all parent themes
*/
protected function initPathMap()
{
if ($this->pathMap === null) {
$this->pathMap = ['@humhub/views' => [$this->getBasePath() . '/views']];
foreach ($this->getParents() as $theme) {
$this->pathMap['@humhub/views'][] = $theme->getBasePath() . '/views';
}
}
}
/**
* Publishs theme assets (e.g. images or css)
*
* @param boolean|null $force
* @return string url of published resources
*/
public function publishResources($force = null)
{
if ($force === null) {
$force = (YII_DEBUG);
}
$published = Yii::$app->assetManager->publish(
$this->getBasePath(), ['forceCopy' => $force, 'except' => ['views/']]
);
return $published[1];
}
/**
* Returns the value of a given theme variable
*
* @since 1.2
* @param string $key the variable name
* @return string the variable value
*/
public function variable($key, $default = null)
{
return $this->variables->get($key, $default);
}
/**
* Returns the base/parent themes of this theme.
* The parent is specified in the LESS Variable file as variable "baseTheme".
*
* @see ThemeVariables
* @return Theme[] the theme parents
*/
public function getParents()
{
if ($this->parents !== null) {
return $this->parents;
}
if ($this->isActive() && BaseSettingsManager::isDatabaseInstalled()) {
$this->parents = static::getActiveParents();
}
if ($this->parents === null) {
$this->parents = ThemeHelper::getThemeTree($this, false);
if ($this->isActive()) {
// Store parent path of currently active theme as settings
// This avoids theme paths lookups
$parentPaths = [];
foreach ($this->parents as $theme) {
$parentPaths[] = $theme->getBasePath();
}
if (BaseSettingsManager::isDatabaseInstalled()) {
Yii::$app->settings->setSerialized('themeParents', $parentPaths);
}
}
}
return $this->parents;
}
/**
* Returns the parent themes of the currently active theme.
* These parents are stored in the setting variable "themeParents" for faster lookup.
*
* @return Theme[]|null the themes or null
*/
protected static function getActiveParents()
{
$parentPaths = Yii::$app->settings->getSerialized('themeParents');
if (!is_array($parentPaths)) {
return null;
}
$parents = [];
foreach ($parentPaths as $parentPath) {
$theme = ThemeHelper::getThemeByPath($parentPath);
if ($theme === null) {
Yii::$app->settings->delete('themeParents');
Yii::error('Could not load stored theme parent! - Deleted parent path.', 'ui');
return null;
}
$parents[] = $theme;
}
return $parents;
}
}