diff --git a/admin/message.php b/admin/message.php index 52ef04e4d01..d004e9eebef 100644 --- a/admin/message.php +++ b/admin/message.php @@ -33,13 +33,17 @@ $allprocessors = get_message_processors(); $processors = array_filter($allprocessors, function($processor) { return $processor->enabled; }); +$disabledprocessors = array_filter($allprocessors, function($processor) { + return !$processor->enabled; +}); + // Fetch message providers. $providers = get_message_providers(); // Fetch the manage message outputs interface. $preferences = get_message_output_default_preferences(); if (($form = data_submitted()) && confirm_sesskey()) { - $preferences = array(); + $newpreferences = array(); // Prepare default message outputs settings. foreach ($providers as $provider) { $componentproviderbase = $provider->component.'_'.$provider->name; @@ -47,9 +51,9 @@ if (($form = data_submitted()) && confirm_sesskey()) { $providerdisabled = false; if (!isset($form->$disableprovidersetting)) { $providerdisabled = true; - $preferences[$disableprovidersetting] = 1; + $newpreferences[$disableprovidersetting] = 1; } else { - $preferences[$disableprovidersetting] = 0; + $newpreferences[$disableprovidersetting] = 0; } foreach (array('permitted', 'loggedin', 'loggedoff') as $setting) { @@ -75,20 +79,36 @@ if (($form = data_submitted()) && confirm_sesskey()) { $form->{$componentproviderbase.'_loggedoff'}[$processor->name] = 1; } // Record the site preference. - $preferences[$processor->name.'_provider_'.$componentprovidersetting] = $value; + $newpreferences[$processor->name.'_provider_'.$componentprovidersetting] = $value; } - } else if (property_exists($form, $componentprovidersetting)) { - // We must be processing loggedin or loggedoff checkboxes. Store - // defained comma-separated processors as setting value. - // Using array_filter eliminates elements set to 0 above. - $value = join(',', array_keys(array_filter($form->{$componentprovidersetting}))); + } else { + $newsettings = array(); + if (array_key_exists($componentprovidersetting, $form)) { + // We must be processing loggedin or loggedoff checkboxes. + // Store defained comma-separated processors as setting value. + // Using array_filter eliminates elements set to 0 above. + $newsettings = array_keys(array_filter($form->{$componentprovidersetting})); + } + + // Let's join existing setting values for disabled processors. + $property = 'message_provider_'.$componentprovidersetting; + if (property_exists($preferences, $property)) { + $existingsetting = $preferences->$property; + foreach ($disabledprocessors as $disable) { + if (strpos($existingsetting, $disable->name) > -1) { + $newsettings[] = $disable->name; + } + } + } + + $value = join(',', $newsettings); if (empty($value)) { $value = null; } } if ($setting != 'permitted') { // We have already recoded site preferences for 'permitted' type. - $preferences['message_provider_'.$componentprovidersetting] = $value; + $newpreferences['message_provider_'.$componentprovidersetting] = $value; } } } @@ -102,7 +122,7 @@ if (($form = data_submitted()) && confirm_sesskey()) { \core_message\api::update_processor_status($processor, $enabled); } - foreach ($preferences as $name => $value) { + foreach ($newpreferences as $name => $value) { set_config($name, $value, 'message'); } $transaction->allow_commit();