mirror of
https://github.com/Combodo/iTop.git
synced 2026-02-26 13:44:19 +01:00
Compare commits
3 Commits
test_eric
...
feature/37
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
1c1bfaa4a8 | ||
|
|
2f54f0a253 | ||
|
|
27022ed93a |
@@ -73,15 +73,42 @@ class ThemeHandler
|
||||
*/
|
||||
public static function GetApplicationThemeId(): string
|
||||
{
|
||||
$sThemeId = null;
|
||||
try {
|
||||
$sThemeId = utils::GetConfig()->Get('backoffice_default_theme');
|
||||
//environment type from config.php
|
||||
$sEnvType = MetaModel::GetConfig()->Get('local_branding');
|
||||
//environment type from config.php
|
||||
if (utils::IsNotNullOrEmptyString($sEnvType)) {
|
||||
$sWorkingPath = APPROOT.'env-'.utils::GetCurrentEnvironment().'/';
|
||||
$aThemeParameters = json_decode(@file_get_contents($sWorkingPath.'branding/themes.json'), true);
|
||||
if ( isset($aThemeParameters[$sEnvType]) ) {
|
||||
if (isset($aThemeParameters[$sEnvType]['allowed_theme'])) {
|
||||
$aThemeId = $aThemeParameters[$sEnvType]['allowed_theme'];
|
||||
if (in_array($sThemeId, $aThemeId) == false) {
|
||||
$sThemeId = null;
|
||||
}
|
||||
}
|
||||
if (is_null($sThemeId)) {
|
||||
//environment type from config.php
|
||||
if (isset($aThemeParameters[$sEnvType]['default_theme'])) {
|
||||
$sThemeId = $aThemeParameters[$sEnvType]['default_theme'];
|
||||
} else {
|
||||
$aDefaultTheme = ThemeHandler::GetDefaultThemeInformation();
|
||||
$sThemeId = $aDefaultTheme['name'];
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
if (is_null($sThemeId)) {
|
||||
$sThemeId = utils::GetConfig()->Get('backoffice_default_theme');
|
||||
}
|
||||
}
|
||||
catch (CoreException $oCompileException) {
|
||||
// Fallback on our default theme in case the config. is not available yet
|
||||
$aDefaultTheme = ThemeHandler::GetDefaultThemeInformation();
|
||||
$sThemeId = $aDefaultTheme['name'];
|
||||
}
|
||||
|
||||
IssueLog::Error("GetApplicationThemeId: ".$sThemeId);
|
||||
return $sThemeId;
|
||||
}
|
||||
|
||||
@@ -101,11 +128,24 @@ class ThemeHandler
|
||||
catch (Exception $oException) {
|
||||
// Do nothing, already handled by $sThemeId null by default
|
||||
}
|
||||
$sEnvType = MetaModel::GetConfig()->Get('local_branding');
|
||||
//environment type from config.php
|
||||
if (utils::IsNotNullOrEmptyString($sEnvType)) {
|
||||
$sWorkingPath = APPROOT.'env-'.utils::GetCurrentEnvironment().'/';
|
||||
$aThemeParameters = json_decode(@file_get_contents($sWorkingPath.'branding/themes.json'), true);
|
||||
if (isset($aThemeParameters[$sEnvType]) && isset($aThemeParameters[$sEnvType]['allowed_theme'])) {
|
||||
$aThemeId = $aThemeParameters[$sEnvType]['allowed_theme'];
|
||||
if ( in_array($sThemeId,$aThemeId) == false) {
|
||||
$sThemeId = null;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// Fallback on the app. theme
|
||||
if (is_null($sThemeId)) {
|
||||
$sThemeId = static::GetApplicationThemeId();
|
||||
}
|
||||
IssueLog::Error("GetCurrentUserThemeId: ".$sThemeId);
|
||||
|
||||
return $sThemeId;
|
||||
}
|
||||
@@ -142,6 +182,25 @@ class ThemeHandler
|
||||
}
|
||||
asort($aThemes);
|
||||
|
||||
$sEnvType = MetaModel::GetConfig()->Get('local_branding');
|
||||
if (!utils::IsNullOrEmptyString($sEnvType)) {
|
||||
$sWorkingPath = APPROOT . 'env-' . utils::GetCurrentEnvironment() . '/';
|
||||
$aThemeParameters = json_decode(@file_get_contents($sWorkingPath . 'branding/themes.json'), true);
|
||||
//environment type from config.php
|
||||
if (isset($aThemeParameters[$sEnvType])) {
|
||||
$aThemeId = $aThemeParameters[$sEnvType]['allowed_theme'];
|
||||
$aAvailableThemes = [];
|
||||
foreach ($aThemeId as $sThemeId) {
|
||||
if (isset($aThemes[$sThemeId])) {
|
||||
$aAvailableThemes[$sThemeId] = $aThemes[$sThemeId];
|
||||
}
|
||||
}
|
||||
if (count($aAvailableThemes) > 0) {
|
||||
$aThemes = $aAvailableThemes;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return $aThemes;
|
||||
}
|
||||
|
||||
|
||||
@@ -185,7 +185,7 @@ class Config
|
||||
'source_of_value' => '',
|
||||
'show_in_conf_sample' => false,
|
||||
],
|
||||
'temporary_object.garbage_interval' => [
|
||||
'temporary_object.garbage_interval' => [
|
||||
'type' => 'integer',
|
||||
'description' => 'Seconds between garbage collections',
|
||||
'default' => 60,
|
||||
@@ -193,7 +193,7 @@ class Config
|
||||
'source_of_value' => '',
|
||||
'show_in_conf_sample' => false,
|
||||
],
|
||||
'app_env_label' => [
|
||||
'app_env_label' => [
|
||||
'type' => 'string',
|
||||
'description' => 'Label displayed to describe the current application environment, defaults to the environment name (e.g. "production")',
|
||||
'default' => '',
|
||||
@@ -201,7 +201,7 @@ class Config
|
||||
'source_of_value' => '',
|
||||
'show_in_conf_sample' => false,
|
||||
],
|
||||
'app_root_url' => [
|
||||
'app_root_url' => [
|
||||
'type' => 'string',
|
||||
'description' => 'Root URL used for navigating within the application, or from an email to the application (you can put $SERVER_NAME$ as a placeholder for the server\'s name)',
|
||||
'default' => '',
|
||||
@@ -209,7 +209,15 @@ class Config
|
||||
'source_of_value' => '',
|
||||
'show_in_conf_sample' => true,
|
||||
],
|
||||
'app_icon_url' => [
|
||||
'local_branding' => [
|
||||
'type' => 'string',
|
||||
'description' => 'type of branding. useful for put different logo depending environment',
|
||||
'default' => null,
|
||||
'value' => null,
|
||||
'source_of_value' => '',
|
||||
'show_in_conf_sample' => false,
|
||||
],
|
||||
'app_icon_url' => [
|
||||
'type' => 'string',
|
||||
'description' => 'Hyperlink to redirect the user when clicking on the application icon (in the main window, or login/logoff pages)',
|
||||
'default' => 'http://www.combodo.com/itop',
|
||||
@@ -217,50 +225,50 @@ class Config
|
||||
'source_of_value' => '',
|
||||
'show_in_conf_sample' => false,
|
||||
],
|
||||
'db_host' => [
|
||||
'db_host' => [
|
||||
'type' => 'string',
|
||||
'default' => null,
|
||||
'value' => '',
|
||||
'source_of_value' => '',
|
||||
'show_in_conf_sample' => true,
|
||||
],
|
||||
'db_user' => [
|
||||
'type' => 'string',
|
||||
'default' => null,
|
||||
'value' => '',
|
||||
'source_of_value' => '',
|
||||
'db_user' => [
|
||||
'type' => 'string',
|
||||
'default' => null,
|
||||
'value' => '',
|
||||
'source_of_value' => '',
|
||||
'show_in_conf_sample' => true,
|
||||
],
|
||||
'db_pwd' => [
|
||||
'type' => 'string',
|
||||
'default' => null,
|
||||
'value' => '',
|
||||
'source_of_value' => '',
|
||||
'db_pwd' => [
|
||||
'type' => 'string',
|
||||
'default' => null,
|
||||
'value' => '',
|
||||
'source_of_value' => '',
|
||||
'show_in_conf_sample' => true,
|
||||
],
|
||||
'db_name' => [
|
||||
'type' => 'string',
|
||||
'default' => null,
|
||||
'value' => '',
|
||||
'source_of_value' => '',
|
||||
'db_name' => [
|
||||
'type' => 'string',
|
||||
'default' => null,
|
||||
'value' => '',
|
||||
'source_of_value' => '',
|
||||
'show_in_conf_sample' => true,
|
||||
],
|
||||
'db_subname' => [
|
||||
'type' => 'string',
|
||||
'default' => null,
|
||||
'value' => '',
|
||||
'source_of_value' => '',
|
||||
'db_subname' => [
|
||||
'type' => 'string',
|
||||
'default' => null,
|
||||
'value' => '',
|
||||
'source_of_value' => '',
|
||||
'show_in_conf_sample' => true,
|
||||
],
|
||||
'db_tls.enabled' => [
|
||||
'type' => 'bool',
|
||||
'description' => 'If true then the connection to the DB will be encrypted',
|
||||
'default' => false,
|
||||
'value' => false,
|
||||
'source_of_value' => '',
|
||||
'db_tls.enabled' => [
|
||||
'type' => 'bool',
|
||||
'description' => 'If true then the connection to the DB will be encrypted',
|
||||
'default' => false,
|
||||
'value' => false,
|
||||
'source_of_value' => '',
|
||||
'show_in_conf_sample' => false,
|
||||
],
|
||||
'db_tls.ca' => [
|
||||
'db_tls.ca' => [
|
||||
'type' => 'string',
|
||||
'description' => 'Path to certificate authority file for SSL',
|
||||
'default' => null,
|
||||
@@ -268,7 +276,7 @@ class Config
|
||||
'source_of_value' => '',
|
||||
'show_in_conf_sample' => false,
|
||||
],
|
||||
'db_core_transactions_enabled' => [
|
||||
'db_core_transactions_enabled' => [
|
||||
'type' => 'bool',
|
||||
'description' => 'If true, CRUD transactions in iTop core will be enabled',
|
||||
'default' => true,
|
||||
@@ -1888,6 +1896,7 @@ class Config
|
||||
*/
|
||||
public function Get($sPropCode)
|
||||
{
|
||||
|
||||
return $this->m_aSettings[$sPropCode]['value'];
|
||||
}
|
||||
|
||||
|
||||
@@ -72,6 +72,7 @@ class Basic extends AbstractConfiguration
|
||||
*/
|
||||
private function GetInitialPortalConf()
|
||||
{
|
||||
|
||||
$aPortalConf = array(
|
||||
'properties' => array(
|
||||
'id' => $_ENV['PORTAL_ID'],
|
||||
@@ -81,15 +82,15 @@ class Basic extends AbstractConfiguration
|
||||
'favicon' => Branding::GetPortalFavIconAbsoluteUrl(),
|
||||
'themes' => array(
|
||||
'bootstrap' => 'itop-portal-base/portal/public/css/bootstrap-theme-combodo.scss',
|
||||
'portal' => 'itop-portal-base/portal/public/css/portal.scss',
|
||||
'others' => array(),
|
||||
'portal' => 'itop-portal-base/portal/public/css/portal.scss',
|
||||
'others' => array(),
|
||||
),
|
||||
'templates' => array(
|
||||
'templates' => array(
|
||||
'layout' => 'itop-portal-base/portal/templates/layout.html.twig',
|
||||
'home' => 'itop-portal-base/portal/templates/home/layout.html.twig',
|
||||
'home' => 'itop-portal-base/portal/templates/home/layout.html.twig',
|
||||
),
|
||||
'urlmaker_class' => null,
|
||||
'triggers_query' => null,
|
||||
'urlmaker_class' => null,
|
||||
'triggers_query' => null,
|
||||
'attachments' => array(
|
||||
'allow_delete' => true,
|
||||
),
|
||||
|
||||
@@ -25,7 +25,7 @@
|
||||
{% block pPageExtraMetas %}
|
||||
{% endblock %}
|
||||
<title>{% block pPageTitle %}{% if sPageTitle is defined and sPageTitle is not null %}{{ sPageTitle }} - {{ constant('ITOP_APPLICATION_SHORT') }}{% else %}{{ 'Page:DefaultTitle'|dict_format(constant('ITOP_APPLICATION_SHORT')) }}{% endif %}{% endblock %}</title>
|
||||
<link rel="shortcut icon" href="{{ app['combodo.portal.instance.conf'].properties.favicon|add_itop_version }}"/>
|
||||
<link rel="shortcut icon" href="{{ app['combodo.portal.instance.conf'].properties.favicon|add_itop_version }}"/>
|
||||
|
||||
{% block pPageStylesheets %}
|
||||
{# First bootstrap core, lib themes, then bootstrap theme, portal adjustements #}
|
||||
@@ -251,7 +251,7 @@
|
||||
</nav>
|
||||
{% endblock %}
|
||||
|
||||
{# Sidebar navigation menu for normal screens #}
|
||||
{# Sidebar navigation menu for normal screens #}
|
||||
{% block pNavigationSideMenuWrapper %}
|
||||
<nav class="navbar-default hidden-xs col-sm-3 col-md-2" id="sidebar" role="navigation">
|
||||
<div class="user_card bg-primary">
|
||||
|
||||
@@ -3330,27 +3330,27 @@ EOF;
|
||||
/**
|
||||
* @param \MFElement $oBrandingNode
|
||||
* @param string $sTempTargetDir
|
||||
* @param string $sFinalTargetDir
|
||||
* @param string $sLocalBrandingId
|
||||
* @param string $sNodeName
|
||||
* @param string $sTargetFile
|
||||
*
|
||||
* @throws \Exception
|
||||
*/
|
||||
protected function CompileLogo($oBrandingNode, $sTempTargetDir, $sFinalTargetDir, $sNodeName, $sTargetFile)
|
||||
protected function CompileLogo($oBrandingNode, $sTempTargetDir, $sLocalBrandingId, $sNodeName, $sTargetFile)
|
||||
{
|
||||
$sIcon = trim($oBrandingNode->GetChildText($sNodeName) ?? '');
|
||||
if (strlen($sIcon) > 0) {
|
||||
$sSourceFile = $sTempTargetDir.'/'.$sIcon;
|
||||
$aIconName=explode(".", $sIcon);
|
||||
$sIconExtension=$aIconName[count($aIconName)-1];
|
||||
$sTargetFile = '/branding/'.$sTargetFile.'.'.$sIconExtension;
|
||||
$aIconName = explode(".", $sIcon);
|
||||
$sIconExtension = $aIconName[count($aIconName) - 1];
|
||||
$sTargetFile = '/branding/'.$sLocalBrandingId.'/'.$sTargetFile.'.'.$sIconExtension;
|
||||
|
||||
if (!file_exists($sSourceFile))
|
||||
{
|
||||
if (!file_exists($sSourceFile)) {
|
||||
throw new Exception("Branding $sNodeName: could not find the file $sIcon ($sSourceFile)");
|
||||
}
|
||||
|
||||
copy($sSourceFile, $sTempTargetDir.$sTargetFile);
|
||||
|
||||
return $sTargetFile;
|
||||
}
|
||||
return null;
|
||||
@@ -3380,8 +3380,7 @@ EOF;
|
||||
// Build compiled themes folder
|
||||
$sThemesRelDirPath = 'branding/themes/';
|
||||
$sThemesAbsDirPath = $sTempTargetDir.$sThemesRelDirPath;
|
||||
if(!is_dir($sThemesAbsDirPath))
|
||||
{
|
||||
if (!is_dir($sThemesAbsDirPath)) {
|
||||
SetupUtils::builddir($sThemesAbsDirPath);
|
||||
}
|
||||
|
||||
@@ -3565,7 +3564,30 @@ EOF;
|
||||
}
|
||||
}
|
||||
$this->Log(sprintf('Themes compilation took: %.3f ms for %d themes.', (microtime(true) - $fStart)*1000.0, count($aThemes)));
|
||||
}
|
||||
|
||||
$aDataBranding = [];
|
||||
$oLocalBrandingsNode = $oBrandingNode->GetUniqueElement('local_brandings', false);
|
||||
if ($oLocalBrandingsNode != null ) {
|
||||
foreach ($oLocalBrandingsNode->GetNodes('local_branding') as $oLocalBrandingNode) {
|
||||
$sLocalBrandingId = $oLocalBrandingNode->getAttribute('id');
|
||||
$oLocalThemesNode = $oLocalBrandingNode->GetUniqueElement('allowed_themes', false);
|
||||
if ($oLocalThemesNode != null ) {
|
||||
foreach ($oLocalThemesNode->GetNodes('allowed_theme') as $oThemesNodes) {
|
||||
$sThemeId = $oThemesNodes->getAttribute('id');
|
||||
$aDataBranding[$sLocalBrandingId]['allowed_theme'][] = $sThemeId;
|
||||
}
|
||||
}
|
||||
$sDefaultTheme = $oLocalBrandingNode->GetUniqueElement('default_theme', false)->GetChildText('value');
|
||||
$aDataBranding[$sLocalBrandingId]['default_theme'] = $sDefaultTheme;
|
||||
}
|
||||
}
|
||||
if ($sTempTargetDir == null) {
|
||||
$sWorkingPath = APPROOT.'env-'.utils::GetCurrentEnvironment().'/';
|
||||
} else {
|
||||
$sWorkingPath = $sTempTargetDir;
|
||||
}
|
||||
file_put_contents($sWorkingPath.'/branding/themes.json', json_encode($aDataBranding));
|
||||
}
|
||||
|
||||
public static function SetThemeHandlerService(ThemeHandlerService $oThemeHandlerService): void {
|
||||
self::$oThemeHandlerService = $oThemeHandlerService;
|
||||
@@ -3650,27 +3672,50 @@ EOF;
|
||||
{
|
||||
// Enable relative paths
|
||||
SetupUtils::builddir($sTempTargetDir.'/branding');
|
||||
if ($oBrandingNode)
|
||||
{
|
||||
// Transform file refs into files in the images folder
|
||||
$this->CompileFiles($oBrandingNode, $sTempTargetDir.'/branding', $sFinalTargetDir.'/branding', 'branding');
|
||||
$aDataBranding = [];
|
||||
if ($oBrandingNode) {
|
||||
// Transform file refs into files in the images folder
|
||||
$this->CompileFiles($oBrandingNode, $sTempTargetDir.'/branding', $sFinalTargetDir.'/branding', 'branding');
|
||||
$aDataBranding = [];
|
||||
|
||||
$aLogosToCompile = [
|
||||
['sNodeName' => 'login_logo', 'sTargetFile' => 'login-logo', 'sType' => Branding::ENUM_LOGO_TYPE_LOGIN_LOGO],
|
||||
['sNodeName' => 'main_logo', 'sTargetFile' => 'main-logo-full', 'sType' => Branding::ENUM_LOGO_TYPE_MAIN_LOGO_FULL],
|
||||
['sNodeName' => 'main_logo_compact', 'sTargetFile' => 'main-logo-compact', 'sType' => Branding::ENUM_LOGO_TYPE_MAIN_LOGO_COMPACT],
|
||||
['sNodeName' => 'portal_logo', 'sTargetFile' => 'portal-logo', 'sType' => Branding::ENUM_LOGO_TYPE_PORTAL_LOGO],
|
||||
['sNodeName' => 'login_favicon', 'sTargetFile' => 'login_favicon', 'sType' => Branding::ENUM_LOGO_TYPE_LOGIN_FAVICON],
|
||||
['sNodeName' => 'main_favicon', 'sTargetFile' => 'main_favicon', 'sType' => Branding::ENUM_LOGO_TYPE_MAIN_FAVICON],
|
||||
['sNodeName' => 'portal_favicon', 'sTargetFile' => 'portal_favicon', 'sType' => Branding::ENUM_LOGO_TYPE_PORTAL_FAVICON],
|
||||
];
|
||||
foreach ($aLogosToCompile as $aLogo) {
|
||||
$sLogo = $this->CompileLogo($oBrandingNode, $sTempTargetDir, $sFinalTargetDir, $aLogo['sNodeName'], $aLogo['sTargetFile']);
|
||||
if ($sLogo != null) {
|
||||
$aDataBranding[$aLogo['sType']] = $sLogo;
|
||||
}
|
||||
}
|
||||
$aLogosToCompile = [
|
||||
['sNodeName' => 'login_logo', 'sTargetFile' => 'login-logo', 'sType' => Branding::ENUM_LOGO_TYPE_LOGIN_LOGO],
|
||||
['sNodeName' => 'main_logo', 'sTargetFile' => 'main-logo-full', 'sType' => Branding::ENUM_LOGO_TYPE_MAIN_LOGO_FULL],
|
||||
['sNodeName' => 'main_logo_compact', 'sTargetFile' => 'main-logo-compact', 'sType' => Branding::ENUM_LOGO_TYPE_MAIN_LOGO_COMPACT],
|
||||
['sNodeName' => 'portal_logo', 'sTargetFile' => 'portal-logo', 'sType' => Branding::ENUM_LOGO_TYPE_PORTAL_LOGO],
|
||||
['sNodeName' => 'login_favicon', 'sTargetFile' => 'login_favicon', 'sType' => Branding::ENUM_LOGO_TYPE_LOGIN_FAVICON],
|
||||
['sNodeName' => 'main_favicon', 'sTargetFile' => 'main_favicon', 'sType' => Branding::ENUM_LOGO_TYPE_MAIN_FAVICON],
|
||||
['sNodeName' => 'portal_favicon', 'sTargetFile' => 'portal_favicon', 'sType' => Branding::ENUM_LOGO_TYPE_PORTAL_FAVICON],
|
||||
];
|
||||
foreach ($aLogosToCompile as $aLogo) {
|
||||
$sLogo = $this->CompileLogo($oBrandingNode, $sTempTargetDir, null, $aLogo['sNodeName'], $aLogo['sTargetFile']);
|
||||
if ($sLogo != null) {
|
||||
$aDataBranding['default'][$aLogo['sType']] = $sLogo;
|
||||
}
|
||||
}
|
||||
$oLocalBrandingsNode = $oBrandingNode->GetUniqueElement('local_brandings', false);
|
||||
if ($oLocalBrandingsNode != null ) {
|
||||
foreach ($oLocalBrandingsNode->GetNodes('local_branding') as $oLocalBrandingNode) {
|
||||
// Transform file refs into files in the images folder
|
||||
$this->CompileFiles($oLocalBrandingNode, $sTempTargetDir.'/branding', $sFinalTargetDir.'/branding', 'branding');
|
||||
|
||||
$aLogosToCompile = [
|
||||
['sNodeName' => 'login_logo', 'sTargetFile' => 'login-logo', 'sType' => Branding::ENUM_LOGO_TYPE_LOGIN_LOGO],
|
||||
['sNodeName' => 'main_logo', 'sTargetFile' => 'main-logo-full', 'sType' => Branding::ENUM_LOGO_TYPE_MAIN_LOGO_FULL],
|
||||
['sNodeName' => 'main_logo_compact', 'sTargetFile' => 'main-logo-compact', 'sType' => Branding::ENUM_LOGO_TYPE_MAIN_LOGO_COMPACT],
|
||||
['sNodeName' => 'portal_logo', 'sTargetFile' => 'portal-logo', 'sType' => Branding::ENUM_LOGO_TYPE_PORTAL_LOGO],
|
||||
['sNodeName' => 'login_favicon', 'sTargetFile' => 'login_favicon', 'sType' => Branding::ENUM_LOGO_TYPE_LOGIN_FAVICON],
|
||||
['sNodeName' => 'main_favicon', 'sTargetFile' => 'main_favicon', 'sType' => Branding::ENUM_LOGO_TYPE_MAIN_FAVICON],
|
||||
['sNodeName' => 'portal_favicon', 'sTargetFile' => 'portal_favicon', 'sType' => Branding::ENUM_LOGO_TYPE_PORTAL_FAVICON],
|
||||
];
|
||||
$sLocalBrandingId = $oLocalBrandingNode->getAttribute('id');
|
||||
foreach ($aLogosToCompile as $aLogo) {
|
||||
$sLogo = $this->CompileLogo($oLocalBrandingNode, $sTempTargetDir, $sLocalBrandingId, $aLogo['sNodeName'], $aLogo['sTargetFile']);
|
||||
if ($sLogo != null) {
|
||||
$aDataBranding[$oLocalBrandingNode->getAttribute('id')][$aLogo['sType']] = $sLogo;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
if ($sTempTargetDir == null) {
|
||||
$sWorkingPath = APPROOT.'env-'.utils::GetCurrentEnvironment().'/';
|
||||
} else {
|
||||
@@ -3680,8 +3725,7 @@ EOF;
|
||||
file_put_contents($sWorkingPath.'/branding/logos.json', json_encode($aDataBranding));
|
||||
|
||||
// Cleanup the images directory (eventually made by CompileFiles)
|
||||
if (file_exists($sTempTargetDir.'/branding/images'))
|
||||
{
|
||||
if (file_exists($sTempTargetDir.'/branding/images')) {
|
||||
SetupUtils::rrmdir($sTempTargetDir.'/branding/images');
|
||||
}
|
||||
|
||||
|
||||
@@ -920,12 +920,12 @@ class iTopDesignFormat
|
||||
$oNode->setAttribute('id', 'ibo-page-banner--background-color');
|
||||
}
|
||||
|
||||
$oNodeList = $oXPath->query( '/itop_design/branding/themes/theme[@id="test-red"]/variables/variable[@id="backoffice-environment-banner-text-color"]');
|
||||
$oNodeList = $oXPath->query('/itop_design/branding/themes/theme[@id="test-red"]/variables/variable[@id="backoffice-environment-banner-text-color"]');
|
||||
foreach ($oNodeList as $oNode) {
|
||||
$oNode->setAttribute('id', 'ibo-page-banner--text-color');
|
||||
}
|
||||
|
||||
$oNodeList = $oXPath->query( '/itop_design/branding/themes/theme[@id="test-red"]/variables/variable[@id="backoffice-environment-banner-text-content"]');
|
||||
$oNodeList = $oXPath->query('/itop_design/branding/themes/theme[@id="test-red"]/variables/variable[@id="backoffice-environment-banner-text-content"]');
|
||||
foreach ($oNodeList as $oNode) {
|
||||
$oNode->setAttribute('id', 'ibo-page-banner--text-content');
|
||||
}
|
||||
@@ -1067,7 +1067,6 @@ class iTopDesignFormat
|
||||
*/
|
||||
protected function From30To31($oFactory)
|
||||
{
|
||||
|
||||
}
|
||||
/**
|
||||
* Downgrade the format from version 3.1 to 3.0
|
||||
@@ -1097,6 +1096,7 @@ class iTopDesignFormat
|
||||
$this->RemoveNodeFromXPath("/itop_design/classes//class/fields/field/sort_type");
|
||||
// - Remove rank in values
|
||||
$this->RemoveNodeFromXPath("/itop_design/classes//class/fields/field/values/value/rank");
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -1139,7 +1139,7 @@ class iTopDesignFormat
|
||||
*/
|
||||
protected function From33To32($oFactory)
|
||||
{
|
||||
// Nothing for now...
|
||||
$this->RemoveNodeFromXPath('/itop_design/branding/local_brandings');
|
||||
}
|
||||
|
||||
/**
|
||||
|
||||
@@ -93,15 +93,28 @@ class Branding
|
||||
*/
|
||||
protected static function GetLogoPath(string $sType, string $sAppPath, ?string $sModulePath = null): string
|
||||
{
|
||||
$sDefaultLogoPath = static::$aLogoPaths[$sType]['default'];
|
||||
$sWorkingPath = APPROOT.'env-'.utils::GetCurrentEnvironment().'/';
|
||||
$aThemeParameters = json_decode(@file_get_contents($sWorkingPath.'branding/logos.json'), true);
|
||||
if (isset($aThemeParameters[$sType])) {
|
||||
$sCustomLogoPath = $aThemeParameters[$sType];
|
||||
//environment type from config.php
|
||||
$sEnvType = MetaModel::GetConfig()->Get('local_branding');
|
||||
if (utils::IsNullOrEmptyString($sEnvType)) {
|
||||
$sEnvType = 'default';
|
||||
}
|
||||
if (isset($aThemeParameters[$sEnvType]) && isset($aThemeParameters[$sEnvType][$sType])) {
|
||||
$sCustomLogoPath = $aThemeParameters[$sEnvType][$sType];
|
||||
if (file_exists($sWorkingPath.$sCustomLogoPath)) {
|
||||
return ($sModulePath ?? $sAppPath).$sCustomLogoPath;
|
||||
}
|
||||
}
|
||||
//if not found => take the default logo
|
||||
$sEnvType = 'default';
|
||||
if (isset($aThemeParameters[$sEnvType]) && isset($aThemeParameters[$sEnvType][$sType])) {
|
||||
$sCustomLogoPath = $aThemeParameters[$sEnvType][$sType];
|
||||
if (file_exists($sWorkingPath.$sCustomLogoPath)) {
|
||||
return ($sModulePath ?? $sAppPath).$sCustomLogoPath;
|
||||
}
|
||||
}
|
||||
$sDefaultLogoPath = static::$aLogoPaths[$sType]['default'];
|
||||
|
||||
return $sAppPath.$sDefaultLogoPath;
|
||||
}
|
||||
@@ -201,7 +214,12 @@ class Branding
|
||||
*/
|
||||
public static function GetPortalFavIconAbsoluteUrl(): string
|
||||
{
|
||||
return static::GetLogoAbsoluteUrl(static::ENUM_LOGO_TYPE_PORTAL_FAVICON);
|
||||
$sIcon = static::GetLogoAbsoluteUrl(static::ENUM_LOGO_TYPE_PORTAL_FAVICON);
|
||||
if (utils::IsNullOrEmptyString($sIcon)) {
|
||||
return static::GetLogoAbsoluteUrl(static::ENUM_LOGO_TYPE_MAIN_FAVICON);
|
||||
}
|
||||
|
||||
return $sIcon;
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -213,6 +231,11 @@ class Branding
|
||||
*/
|
||||
public static function GetLoginFavIconAbsoluteUrl(): string
|
||||
{
|
||||
return static::GetLogoAbsoluteUrl(static::ENUM_LOGO_TYPE_LOGIN_FAVICON);
|
||||
$sIcon = static::GetLogoAbsoluteUrl(static::ENUM_LOGO_TYPE_LOGIN_FAVICON);
|
||||
if (utils::IsNullOrEmptyString($sIcon)) {
|
||||
return static::GetLogoAbsoluteUrl(static::ENUM_LOGO_TYPE_MAIN_FAVICON);
|
||||
}
|
||||
|
||||
return $sIcon;
|
||||
}
|
||||
}
|
||||
@@ -1,3 +1,33 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<itop_design xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" version="3.2">
|
||||
<branding>
|
||||
<main_favicon _delta="define">
|
||||
<fileref ref="logo_rvb"/>
|
||||
</main_favicon>
|
||||
<login_favicon _delta="define">
|
||||
<fileref ref="logo_log"/>
|
||||
</login_favicon>
|
||||
<portal_favicon _delta="define">
|
||||
<fileref ref="logo_log"/>
|
||||
</portal_favicon>
|
||||
<themes>
|
||||
<theme id="fullmoon" _delta="define">
|
||||
<variables>
|
||||
<variable id="ibo-page-banner--background-color">$ibo-color-red-600</variable>
|
||||
<variable id="ibo-page-banner--text-color">$ibo-color-red-100</variable>
|
||||
<variable id="ibo-page-banner--text-content">"THIS IS A TEST INSTANCE"</variable>
|
||||
</variables>
|
||||
<imports>
|
||||
<import id="ignored-because-lack-xsi-type">ignored-because-lack-xsi-type.scss</import>
|
||||
<import id="ok-because-xsi-type-variables" xsi:type="variables">ok-because-xsi-type-variables.scss</import>
|
||||
<import id="ok-because-xsi-type-utilities" xsi:type="utilities">ok-because-xsi-type-utilities.scss</import>
|
||||
</imports>
|
||||
<stylesheets>
|
||||
<stylesheet id="fullmoon">../css/backoffice/main.scss</stylesheet>
|
||||
<stylesheet id="environment-banner">../css/backoffice/themes/page-banner.scss</stylesheet>
|
||||
</stylesheets>
|
||||
<precompiled_stylesheet>itop-structure/precompiled-themes/test-red/main.css</precompiled_stylesheet>
|
||||
</theme>
|
||||
</themes>
|
||||
</branding>
|
||||
</itop_design>
|
||||
|
||||
@@ -1,3 +1,52 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<itop_design xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" version="3.2">
|
||||
<branding>
|
||||
<main_favicon _delta="define">
|
||||
<fileref ref="logo_rvb"/>
|
||||
</main_favicon>
|
||||
<login_favicon _delta="define">
|
||||
<fileref ref="logo_log"/>
|
||||
</login_favicon>
|
||||
<portal_favicon _delta="define">
|
||||
<fileref ref="logo_log"/>
|
||||
</portal_favicon>
|
||||
<themes>
|
||||
<theme id="fullmoon" _delta="define">
|
||||
<variables>
|
||||
<variable id="ibo-page-banner--background-color">$ibo-color-red-600</variable>
|
||||
<variable id="ibo-page-banner--text-color">$ibo-color-red-100</variable>
|
||||
<variable id="ibo-page-banner--text-content">"THIS IS A TEST INSTANCE"</variable>
|
||||
</variables>
|
||||
<imports>
|
||||
<import id="ignored-because-lack-xsi-type">ignored-because-lack-xsi-type.scss</import>
|
||||
<import id="ok-because-xsi-type-variables" xsi:type="variables">ok-because-xsi-type-variables.scss</import>
|
||||
<import id="ok-because-xsi-type-utilities" xsi:type="utilities">ok-because-xsi-type-utilities.scss</import>
|
||||
</imports>
|
||||
<stylesheets>
|
||||
<stylesheet id="fullmoon">../css/backoffice/main.scss</stylesheet>
|
||||
<stylesheet id="environment-banner">../css/backoffice/themes/page-banner.scss</stylesheet>
|
||||
</stylesheets>
|
||||
<precompiled_stylesheet>itop-structure/precompiled-themes/test-red/main.css</precompiled_stylesheet>
|
||||
</theme>
|
||||
</themes>
|
||||
<local_brandings>
|
||||
<local_branding id="test">
|
||||
<main_favicon _delta="define">
|
||||
<fileref ref="logo_rvb_test"/>
|
||||
</main_favicon>
|
||||
<login_favicon _delta="define">
|
||||
<fileref ref="logo_log_test"/>
|
||||
</login_favicon>
|
||||
<portal_favicon _delta="define">
|
||||
<fileref ref="logo_log_test"/>
|
||||
</portal_favicon>
|
||||
<default_theme>
|
||||
<value>fullmoon</value>
|
||||
</default_theme>
|
||||
<allowed_themes>
|
||||
<allowed_theme id="fullmoon">
|
||||
</allowed_themes>
|
||||
</local_branding>
|
||||
</local_brandings>
|
||||
</branding>
|
||||
</itop_design>
|
||||
|
||||
Reference in New Issue
Block a user