N°2311 - Preferences extensibility

This commit is contained in:
Eric
2019-09-02 17:55:55 +02:00
parent a905a8a3c1
commit 3e9223a0bc
4 changed files with 143 additions and 91 deletions

View File

@@ -186,6 +186,24 @@ interface iLoginDataExtension extends iLoginExtension
public function GetLoginData();
}
interface iPreferencesExtension
{
/**
* @param \WebPage $oPage
*
*/
public function DisplayPreferences(WebPage $oPage);
/**
* @param \WebPage $oPage
* @param string $sOperation
*
* @return bool true if the operation has been used
*/
public function ApplyPreferences(WebPage $oPage, $sOperation);
}
/**
* Implement this interface to change the behavior of the GUI for some objects.
*

View File

@@ -68,7 +68,14 @@ class LoginForm extends AbstractLoginFSMExtension implements iLoginDataExtension
{
if ($_SESSION['login_mode'] == 'form')
{
$sAuthUser = utils::ReadPostedParam('auth_user', '', 'raw_data');
if (isset($_SESSION['auth_user']))
{
$sAuthUser = $_SESSION['auth_user'];
}
else
{
$sAuthUser = utils::ReadPostedParam('auth_user', '', 'raw_data');
}
LoginWebPage::OnLoginSuccess($sAuthUser, 'internal', $_SESSION['login_mode']);
}
return LoginWebPage::LOGIN_FSM_RETURN_CONTINUE;

View File

@@ -2781,7 +2781,7 @@ abstract class MetaModel
// Build the list of available extensions
//
$aInterfaces = array('iApplicationUIExtension', 'iApplicationObjectExtension', 'iLoginFSMExtension', 'iLoginDataExtension', 'iLogoutExtension', 'iQueryModifier', 'iOnClassInitialization', 'iPopupMenuExtension', 'iPageUIExtension', 'iPortalUIExtension', 'ModuleHandlerApiInterface', 'iNewsroomProvider');
$aInterfaces = array('iApplicationUIExtension', 'iPreferencesExtension', 'iApplicationObjectExtension', 'iLoginFSMExtension', 'iLoginDataExtension', 'iLogoutExtension', 'iQueryModifier', 'iOnClassInitialization', 'iPopupMenuExtension', 'iPageUIExtension', 'iPortalUIExtension', 'ModuleHandlerApiInterface', 'iNewsroomProvider');
foreach($aInterfaces as $sInterface)
{
self::$m_aExtensionClasses[$sInterface] = array();

View File

@@ -363,7 +363,13 @@ EOF
$oP->add('</form>');
$oP->add('</fieldset>');
}
/** @var iPreferencesExtension $oLoginExtensionInstance */
foreach (MetaModel::EnumPlugins('iPreferencesExtension') as $oPreferencesExtensionInstance)
{
$oPreferencesExtensionInstance->DisplayPreferences($oP);
}
//////////////////////////////////////////////////////////////////////////
//
// Footer
@@ -389,101 +395,122 @@ $sOperation = utils::ReadParam('operation', '');
try
{
switch($sOperation)
/** @var iPreferencesExtension $oLoginExtensionInstance */
$bOperationUsed = false;
foreach(MetaModel::EnumPlugins('iPreferencesExtension') as $oPreferencesExtensionInstance)
{
case 'apply':
$oFilter = DBObjectSearch::FromOQL('SELECT Organization');
$sSelectionMode = utils::ReadParam('selectionMode', '');
$aExceptions = utils::ReadParam('storedSelection', array());
if (($sSelectionMode == 'negative') && (count($aExceptions) == 0))
if ($oPreferencesExtensionInstance->ApplyPreferences($oPage, $sOperation))
{
// All Orgs selected
appUserPreferences::SetPref('favorite_orgs', null);
$bOperationUsed = true;
break;
}
else
}
if (!$bOperationUsed)
{
switch ($sOperation)
{
// Some organizations selected... store them
$aSelectOrgs = utils::ReadMultipleSelection($oFilter);
appUserPreferences::SetPref('favorite_orgs', $aSelectOrgs);
}
DisplayPreferences($oPage);
break;
case 'apply_language':
$sLangCode = utils::ReadParam('language', 'EN US');
$oUser = UserRights::GetUserObject();
$oUser->Set('language', $sLangCode);
utils::PushArchiveMode(false);
$oUser->AllowWrite(true);
$oUser->DBUpdate();
utils::PopArchiveMode();
// Redirect to force a reload/display of the page with the new language
$oAppContext = new ApplicationContext();
$sURL = utils::GetAbsoluteUrlAppRoot().'pages/preferences.php?'.$oAppContext->GetForLink();
$oPage->add_header('Location: '.$sURL);
break;
case 'apply_others':
$iDefaultPageSize = (int)utils::ReadParam('default_page_size', -1);
if ($iDefaultPageSize > 0)
{
appUserPreferences::SetPref('default_page_size', $iDefaultPageSize);
}
$bShowObsoleteData = (bool)utils::ReadParam('show_obsolete_data', 0);
appUserPreferences::SetPref('show_obsolete_data', $bShowObsoleteData);
DisplayPreferences($oPage);
break;
case 'apply_newsroom_preferences':
$iCountProviders = 0;
$oUser = UserRights::GetUserObject();
$aProviders = MetaModel::EnumPlugins('iNewsroomProvider');
foreach($aProviders as $oProvider)
{
if ($oProvider->IsApplicable($oUser))
{
$iCountProviders++;
}
}
$bNewsroomEnabled = (MetaModel::GetConfig()->Get('newsroom_enabled') !== false);
if ($bNewsroomEnabled && ($iCountProviders > 0))
{
$iNewsroomDisplaySize = (int)utils::ReadParam('newsroom_display_size', 7);
if ($iNewsroomDisplaySize < 1) $iNewsroomDisplaySize = 1;
if ($iNewsroomDisplaySize > 20) $iNewsroomDisplaySize = 20;
$iCurrentDisplaySize = (int)appUserPreferences::GetPref('newsroom_display_size', $iNewsroomDisplaySize);
if ($iCurrentDisplaySize != $iNewsroomDisplaySize)
{
// Save the preference only if it differs from the current (or default) value
appUserPreferences::SetPref('newsroom_display_size', $iNewsroomDisplaySize);
}
}
$bProvidersModified = false;
foreach($aProviders as $oProvider)
{
if ($oProvider->IsApplicable($oUser))
{
$sProviderClass = get_class($oProvider);
$bProviderEnabled = (utils::ReadParam('newsroom_provider_'.$sProviderClass, 'off') == 'on');
$bCurrentValue = appUserPreferences::GetPref('newsroom_provider_'.$sProviderClass, true);
if ($bCurrentValue != $bProviderEnabled)
case 'apply':
$oFilter = DBObjectSearch::FromOQL('SELECT Organization');
$sSelectionMode = utils::ReadParam('selectionMode', '');
$aExceptions = utils::ReadParam('storedSelection', array());
if (($sSelectionMode == 'negative') && (count($aExceptions) == 0))
{
// Save the preference only if it differs from the current value
$bProvidersModified = true;
appUserPreferences::SetPref('newsroom_provider_'.$sProviderClass, $bProviderEnabled);
// All Orgs selected
appUserPreferences::SetPref('favorite_orgs', null);
}
}
else
{
// Some organizations selected... store them
$aSelectOrgs = utils::ReadMultipleSelection($oFilter);
appUserPreferences::SetPref('favorite_orgs', $aSelectOrgs);
}
DisplayPreferences($oPage);
break;
case 'apply_language':
$sLangCode = utils::ReadParam('language', 'EN US');
$oUser = UserRights::GetUserObject();
$oUser->Set('language', $sLangCode);
utils::PushArchiveMode(false);
$oUser->AllowWrite(true);
$oUser->DBUpdate();
utils::PopArchiveMode();
// Redirect to force a reload/display of the page with the new language
$oAppContext = new ApplicationContext();
$sURL = utils::GetAbsoluteUrlAppRoot().'pages/preferences.php?'.$oAppContext->GetForLink();
$oPage->add_header('Location: '.$sURL);
break;
case 'apply_others':
$iDefaultPageSize = (int)utils::ReadParam('default_page_size', -1);
if ($iDefaultPageSize > 0)
{
appUserPreferences::SetPref('default_page_size', $iDefaultPageSize);
}
$bShowObsoleteData = (bool)utils::ReadParam('show_obsolete_data', 0);
appUserPreferences::SetPref('show_obsolete_data', $bShowObsoleteData);
DisplayPreferences($oPage);
break;
case 'apply_newsroom_preferences':
$iCountProviders = 0;
$oUser = UserRights::GetUserObject();
$aProviders = MetaModel::EnumPlugins('iNewsroomProvider');
foreach ($aProviders as $oProvider)
{
if ($oProvider->IsApplicable($oUser))
{
$iCountProviders++;
}
}
$bNewsroomEnabled = (MetaModel::GetConfig()->Get('newsroom_enabled') !== false);
if ($bNewsroomEnabled && ($iCountProviders > 0))
{
$iNewsroomDisplaySize = (int)utils::ReadParam('newsroom_display_size', 7);
if ($iNewsroomDisplaySize < 1)
{
$iNewsroomDisplaySize = 1;
}
if ($iNewsroomDisplaySize > 20)
{
$iNewsroomDisplaySize = 20;
}
$iCurrentDisplaySize = (int)appUserPreferences::GetPref('newsroom_display_size', $iNewsroomDisplaySize);
if ($iCurrentDisplaySize != $iNewsroomDisplaySize)
{
// Save the preference only if it differs from the current (or default) value
appUserPreferences::SetPref('newsroom_display_size', $iNewsroomDisplaySize);
}
}
$bProvidersModified = false;
foreach ($aProviders as $oProvider)
{
if ($oProvider->IsApplicable($oUser))
{
$sProviderClass = get_class($oProvider);
$bProviderEnabled = (utils::ReadParam('newsroom_provider_'.$sProviderClass, 'off') == 'on');
$bCurrentValue = appUserPreferences::GetPref('newsroom_provider_'.$sProviderClass, true);
if ($bCurrentValue != $bProviderEnabled)
{
// Save the preference only if it differs from the current value
$bProvidersModified = true;
appUserPreferences::SetPref('newsroom_provider_'.$sProviderClass, $bProviderEnabled);
}
}
}
if ($bProvidersModified)
{
$oPage->add_ready_script('$(".itop-newsroom_menu").newsroom_menu("clearCache");');
}
DisplayPreferences($oPage);
break;
case 'display':
default:
$oPage->SetBreadCrumbEntry('ui-tool-preferences', Dict::S('UI:Preferences'), Dict::S('UI:Preferences'), '',
utils::GetAbsoluteUrlAppRoot().'images/wrench.png');
DisplayPreferences($oPage);
}
if ($bProvidersModified)
{
$oPage->add_ready_script('$(".itop-newsroom_menu").newsroom_menu("clearCache");');
}
DisplayPreferences($oPage);
break;
case 'display':
default:
$oPage->SetBreadCrumbEntry('ui-tool-preferences', Dict::S('UI:Preferences'), Dict::S('UI:Preferences'), '', utils::GetAbsoluteUrlAppRoot().'images/wrench.png');
DisplayPreferences($oPage);
}
$oPage->output();
}