Rework theme override in Profile::load and App

- Separate desktop theme from mobile theme in App
This commit is contained in:
Hypolite Petovan 2019-10-06 12:07:06 -04:00
parent e5fbaf6a00
commit ead0defb48
2 changed files with 81 additions and 31 deletions

View file

@ -92,10 +92,10 @@ class App
*/ */
private $baseURL; private $baseURL;
/** /** @var string The name of the current theme */
* @var string The name of the current theme
*/
private $currentTheme; private $currentTheme;
/** @var string The name of the current mobile theme */
private $currentMobileTheme;
/** /**
* @var Configuration The config * @var Configuration The config
@ -450,10 +450,10 @@ class App
} }
/** /**
* Returns the current theme name. * Returns the current theme name. May be overriden by the mobile theme name.
* *
* @return string the name of the current theme * @return string
* @throws HTTPException\InternalServerErrorException * @throws Exception
*/ */
public function getCurrentTheme() public function getCurrentTheme()
{ {
@ -461,6 +461,16 @@ class App
return ''; return '';
} }
// Specific mobile theme override
if (($this->mode->isMobile() || $this->mode->isTablet()) && Core\Session::get('show-mobile', true)) {
$user_mobile_theme = $this->getCurrentMobileTheme();
// --- means same mobile theme as desktop
if (!empty($user_mobile_theme) && $user_mobile_theme !== '---') {
return $user_mobile_theme;
}
}
if (!$this->currentTheme) { if (!$this->currentTheme) {
$this->computeCurrentTheme(); $this->computeCurrentTheme();
} }
@ -468,13 +478,37 @@ class App
return $this->currentTheme; return $this->currentTheme;
} }
/**
* Returns the current mobile theme name.
*
* @return string
* @throws Exception
*/
public function getCurrentMobileTheme()
{
if ($this->mode->isInstall()) {
return '';
}
if (is_null($this->currentMobileTheme)) {
$this->computeCurrentMobileTheme();
}
return $this->currentMobileTheme;
}
public function setCurrentTheme($theme) public function setCurrentTheme($theme)
{ {
$this->currentTheme = $theme; $this->currentTheme = $theme;
} }
public function setCurrentMobileTheme($theme)
{
$this->currentMobileTheme = $theme;
}
/** /**
* Computes the current theme name based on the node settings, the user settings and the device type * Computes the current theme name based on the node settings, the page owner settings and the user settings
* *
* @throws Exception * @throws Exception
*/ */
@ -486,7 +520,7 @@ class App
} }
// Sane default // Sane default
$this->currentTheme = $system_theme; $this->setCurrentTheme($system_theme);
$page_theme = null; $page_theme = null;
// Find the theme that belongs to the user whose stuff we are looking at // Find the theme that belongs to the user whose stuff we are looking at
@ -499,24 +533,7 @@ class App
} }
} }
$user_theme = Core\Session::get('theme', $system_theme); $theme_name = $page_theme ?: Core\Session::get('theme', $system_theme);
// Specific mobile theme override
if (($this->is_mobile || $this->is_tablet) && Core\Session::get('show-mobile', true)) {
$system_mobile_theme = $this->config->get('system', 'mobile-theme');
$user_mobile_theme = Core\Session::get('mobile-theme', $system_mobile_theme);
// --- means same mobile theme as desktop
if (!empty($user_mobile_theme) && $user_mobile_theme !== '---') {
$user_theme = $user_mobile_theme;
}
}
if ($page_theme) {
$theme_name = $page_theme;
} else {
$theme_name = $user_theme;
}
$theme_name = Strings::sanitizeFilePathItem($theme_name); $theme_name = Strings::sanitizeFilePathItem($theme_name);
if ($theme_name if ($theme_name
@ -524,7 +541,40 @@ class App
&& (file_exists('view/theme/' . $theme_name . '/style.css') && (file_exists('view/theme/' . $theme_name . '/style.css')
|| file_exists('view/theme/' . $theme_name . '/style.php')) || file_exists('view/theme/' . $theme_name . '/style.php'))
) { ) {
$this->currentTheme = $theme_name; $this->setCurrentTheme($theme_name);
}
}
/**
* Computes the current mobile theme name based on the node settings, the page owner settings and the user settings
*/
private function computeCurrentMobileTheme()
{
$system_mobile_theme = $this->config->get('system', 'mobile-theme', '');
// Sane default
$this->setCurrentMobileTheme($system_mobile_theme);
$page_mobile_theme = null;
// Find the theme that belongs to the user whose stuff we are looking at
if ($this->profile_uid && ($this->profile_uid != local_user())) {
// Allow folks to override user themes and always use their own on their own site.
// This works only if the user is on the same server
if (!Core\PConfig::get(local_user(), 'system', 'always_my_theme')) {
$page_mobile_theme = Core\PConfig::get($this->profile_uid, 'system', 'mobile-theme');
}
}
$mobile_theme_name = $page_mobile_theme ?: Core\Session::get('mobile-theme', $system_mobile_theme);
$mobile_theme_name = Strings::sanitizeFilePathItem($mobile_theme_name);
if ($mobile_theme_name == '---'
||
in_array($mobile_theme_name, Theme::getAllowedList())
&& (file_exists('view/theme/' . $mobile_theme_name . '/style.css')
|| file_exists('view/theme/' . $mobile_theme_name . '/style.php'))
) {
$this->setCurrentMobileTheme($mobile_theme_name);
} }
} }
@ -534,7 +584,7 @@ class App
* Provide a sane default if nothing is chosen or the specified theme does not exist. * Provide a sane default if nothing is chosen or the specified theme does not exist.
* *
* @return string * @return string
* @throws HTTPException\InternalServerErrorException * @throws Exception
*/ */
public function getCurrentThemeStylesheetPath() public function getCurrentThemeStylesheetPath()
{ {

View file

@ -20,6 +20,7 @@ use Friendica\Core\Protocol;
use Friendica\Core\Renderer; use Friendica\Core\Renderer;
use Friendica\Core\Session; use Friendica\Core\Session;
use Friendica\Core\System; use Friendica\Core\System;
use Friendica\Core\Theme;
use Friendica\Core\Worker; use Friendica\Core\Worker;
use Friendica\Database\DBA; use Friendica\Database\DBA;
use Friendica\Protocol\Diaspora; use Friendica\Protocol\Diaspora;
@ -189,11 +190,10 @@ class Profile
$a->page['title'] = $a->profile['name'] . ' @ ' . Config::get('config', 'sitename'); $a->page['title'] = $a->profile['name'] . ' @ ' . Config::get('config', 'sitename');
if (!$profiledata && !PConfig::get(local_user(), 'system', 'always_my_theme')) { if (!$profiledata && !PConfig::get(local_user(), 'system', 'always_my_theme')) {
$_SESSION['theme'] = $a->profile['theme']; $a->setCurrentTheme($a->profile['theme']);
$a->setCurrentMobileTheme($a->profile['mobile-theme']);
} }
$_SESSION['mobile-theme'] = $a->profile['mobile-theme'];
/* /*
* load/reload current theme info * load/reload current theme info
*/ */