diff --git a/lang/en/message.php b/lang/en/message.php index a8167539248..368953137d5 100644 --- a/lang/en/message.php +++ b/lang/en/message.php @@ -51,6 +51,7 @@ $string['discussion'] = 'Discussion'; $string['emailmessages'] = 'Email messages when I am offline'; $string['emailtagline'] = 'This is a copy of a message sent to you at "{$a->sitename}". Go to {$a->url} to reply.'; $string['emptysearchstring'] = 'You must search for something'; +$string['enabled'] = 'Enabled'; $string['errorcallingprocessor'] = 'Error calling defined output'; $string['errortranslatingdefault'] = 'Error translating default setting provided by plugin, using system defaults instead.'; $string['forced'] = 'Forced'; diff --git a/lib/messagelib.php b/lib/messagelib.php index 426c5930707..51c71c4f321 100644 --- a/lib/messagelib.php +++ b/lib/messagelib.php @@ -57,6 +57,14 @@ function message_send($eventdata) { //new message ID to return $messageid = false; + // Fetch default (site) preferences + $defaultpreferences = get_message_output_default_preferences(); + $preferencebase = $eventdata->component.'_'.$eventdata->name; + // If message provider is disabled then don't do any processing. + if (!empty($defaultpreferences->{$preferencebase.'_disable'})) { + return $messageid; + } + //TODO: we need to solve problems with database transactions here somehow, for now we just prevent transactions - sorry $DB->transactions_forbidden(); @@ -150,12 +158,9 @@ function message_send($eventdata) { // Fetch enabled processors $processors = get_message_processors(true); - // Fetch default (site) preferences - $defaultpreferences = get_message_output_default_preferences(); // Preset variables $processorlist = array(); - $preferencebase = $eventdata->component.'_'.$eventdata->name; // Fill in the array of processors to be used based on default and user preferences foreach ($processors as $processor) { // Skip adding processors for internal user, if processor doesn't support sending message to internal user. diff --git a/lib/tests/messagelib_test.php b/lib/tests/messagelib_test.php index 4f95515dd44..46c710bf23a 100644 --- a/lib/tests/messagelib_test.php +++ b/lib/tests/messagelib_test.php @@ -27,6 +27,47 @@ defined('MOODLE_INTERNAL') || die(); class core_messagelib_testcase extends advanced_testcase { + public function test_message_provider_disabled() { + $this->resetAfterTest(); + $this->preventResetByRollback(); + unset_config('noemailever'); + + // Disable instantmessage provider. + $disableprovidersetting = 'moodle_instantmessage_disable'; + set_config($disableprovidersetting, 1, 'message'); + $preferences = get_message_output_default_preferences(); + $this->assertTrue($preferences->$disableprovidersetting == 1); + + $message = new stdClass(); + $message->component = 'moodle'; + $message->name = 'instantmessage'; + $message->userfrom = get_admin(); + $message->userto = $this->getDataGenerator()->create_user();; + $message->subject = 'message subject 1'; + $message->fullmessage = 'message body'; + $message->fullmessageformat = FORMAT_MARKDOWN; + $message->fullmessagehtml = '

message body

'; + $message->smallmessage = 'small message'; + + // Check message is not sent. + $sink = $this->redirectEmails(); + $this->assertTrue(phpunit_util::is_redirecting_phpmailer()); + message_send($message); + $emails = $sink->get_messages(); + $this->assertEmpty($emails); + + // Check message is sent. + set_config($disableprovidersetting, 0, 'message'); + $preferences = get_message_output_default_preferences(); + $this->assertTrue($preferences->$disableprovidersetting == 0); + + $sink = $this->redirectEmails(); + $this->assertTrue(phpunit_util::is_redirecting_phpmailer()); + message_send($message); + $emails = $sink->get_messages(); + $email = reset($emails); + $this->assertEquals($email->subject, 'message subject 1'); + } public function test_message_get_providers_for_user() { global $CFG, $DB; diff --git a/message/defaultoutputs.php b/message/defaultoutputs.php index 58513ead29b..3e95a30c458 100644 --- a/message/defaultoutputs.php +++ b/message/defaultoutputs.php @@ -41,6 +41,15 @@ if (($form = data_submitted()) && confirm_sesskey()) { // Prepare default message outputs settings foreach ( $providers as $provider) { $componentproviderbase = $provider->component.'_'.$provider->name; + $disableprovidersetting = $componentproviderbase.'_disable'; + $providerdisabled = false; + if (!isset($form->$disableprovidersetting)) { + $providerdisabled = true; + $preferences[$disableprovidersetting] = 1; + } else { + $preferences[$disableprovidersetting] = 0; + } + foreach (array('permitted', 'loggedin', 'loggedoff') as $setting){ $value = null; $componentprovidersetting = $componentproviderbase.'_'.$setting; @@ -56,13 +65,13 @@ if (($form = data_submitted()) && confirm_sesskey()) { } // Ensure that loggedin loggedoff options are set correctly // for this permission - if ($value == 'forced') { - $form->{$componentproviderbase.'_loggedin'}[$processor->name] = 1; - $form->{$componentproviderbase.'_loggedoff'}[$processor->name] = 1; - } else if ($value == 'disallowed') { + if (($value == 'disallowed') || $providerdisabled) { // It might be better to unset them, but I can't figure out why that cause error $form->{$componentproviderbase.'_loggedin'}[$processor->name] = 0; $form->{$componentproviderbase.'_loggedoff'}[$processor->name] = 0; + } else if ($value == 'forced') { + $form->{$componentproviderbase.'_loggedin'}[$processor->name] = 1; + $form->{$componentproviderbase.'_loggedoff'}[$processor->name] = 1; } // record the site preference $preferences[$processor->name.'_provider_'.$componentprovidersetting] = $value; diff --git a/message/module.js b/message/module.js index dc4ee7a7324..6fd3bf48b81 100644 --- a/message/module.js +++ b/message/module.js @@ -54,6 +54,12 @@ M.core_message.init_defaultoutputs = function(Y) { // set initial layout node.simulate("change"); }, this); + + Y.all('#defaultmessageoutputs input.messagedisable').each(function(node) { + // Attach event listener + node.on('change', defaultoutputs.changeProviderState); + node.simulate("change"); + }, this); }, changeState : function(e) { @@ -83,6 +89,26 @@ M.core_message.init_defaultoutputs = function(Y) { node.setAttribute('checked', 1) } }, this); + }, + + changeProviderState : function(e) { + var isenabled = e.target.get('checked') || undefined; + var parentnode = e.target.ancestor('tr'); + if (!isenabled) { + parentnode.all('select').each(function(node) { + node.set('value', 'disallowed'); + node.setAttribute('disabled', 1); + defaultoutputs.updateCheckboxes(node.ancestor('td'), 1, 0); + }, this); + parentnode.addClass('dimmed_text'); + } else { + parentnode.all('select').each(function(node) { + node.removeAttribute('disabled'); + node.set('value', 'permitted'); + defaultoutputs.updateCheckboxes(node.ancestor('td'), 0, 0); + }, this); + parentnode.removeClass('dimmed_text'); + } } } diff --git a/message/renderer.php b/message/renderer.php index 82e8e68f0a9..846a795f16e 100644 --- a/message/renderer.php +++ b/message/renderer.php @@ -134,6 +134,9 @@ class core_message_renderer extends plugin_renderer_base { foreach ($processors as $processor) { $table->head[] = get_string('pluginname', 'message_'.$processor->name); } + // Add enable/disable to head + $table->head[] = get_string('enabled', 'core_message'); + // Generate the matrix of settings for each provider and processor foreach ($providers as $provider) { $row = new html_table_row(); @@ -143,14 +146,16 @@ class core_message_renderer extends plugin_renderer_base { // Provider Name $providername = get_string('messageprovider:'.$provider->name, $provider->component); $row->cells[] = new html_table_cell($providername); - + $providersettingprefix = $provider->component.'_'.$provider->name.'_'; + $disableprovidersetting = $providersettingprefix.'disable'; + $providerdisabled = !empty($preferences->$disableprovidersetting); // Settings for each processor foreach ($processors as $processor) { $cellcontent = ''; foreach (array('permitted', 'loggedin', 'loggedoff') as $setting) { // pepare element and preference names - $elementname = $provider->component.'_'.$provider->name.'_'.$setting.'['.$processor->name.']'; - $preferencebase = $provider->component.'_'.$provider->name.'_'.$setting; + $elementname = $providersettingprefix.$setting.'['.$processor->name.']'; + $preferencebase = $providersettingprefix.$setting; // prepare language bits $processorname = get_string('pluginname', 'message_'.$processor->name); $statename = get_string($setting, 'message'); @@ -164,7 +169,9 @@ class core_message_renderer extends plugin_renderer_base { // determine the current setting or use default $select = MESSAGE_DEFAULT_PERMITTED; $preference = $processor->name.'_provider_'.$preferencebase; - if (array_key_exists($preference, $preferences)) { + if ($providerdisabled) { + $select = MESSAGE_DISALLOWED; + } else if (array_key_exists($preference, $preferences)) { $select = $preferences->{$preference}; } // dropdown menu @@ -193,6 +200,10 @@ class core_message_renderer extends plugin_renderer_base { } $row->cells[] = new html_table_cell($cellcontent); } + $disableprovider = html_writer::checkbox($disableprovidersetting, 1, !$providerdisabled, '', + array('id' => $disableprovidersetting, 'class' => 'messagedisable')); + $disableprovider = html_writer::tag('div', $disableprovider); + $row->cells[] = new html_table_cell($disableprovider); $table->data[] = $row; } @@ -240,6 +251,7 @@ class core_message_renderer extends plugin_renderer_base { $numprocs = count($processors); // Display the messaging options table(s) foreach ($components as $component) { + $provideradded = false; $table = new html_table(); $table->attributes['class'] = 'generaltable'; $table->data = array(); @@ -249,18 +261,18 @@ class core_message_renderer extends plugin_renderer_base { $componentname = get_string('coresystem'); } $table->head = array($componentname); - foreach ($readyprocessors as $processor) { $table->head[] = get_string('pluginname', 'message_'.$processor->name); } - // Populate the table with rows - foreach ( $providers as $provider) { - if( $provider->component != $component) { + foreach ($providers as $provider) { + $preferencebase = $provider->component.'_'.$provider->name; + // If provider component is not same or provider disabled then don't show. + if (($provider->component != $component) || + (!empty($defaultpreferences->{$preferencebase.'_disable'}))) { continue; } - $preferencebase = $provider->component.'_'.$provider->name; - + $provideradded = true; $headerrow = new html_table_row(); $providername = get_string('messageprovider:'.$provider->name, $provider->component); $providercell = new html_table_cell($providername); @@ -331,9 +343,12 @@ class core_message_renderer extends plugin_renderer_base { $table->data[] = $optionrow; } } - $output .= html_writer::start_tag('div', array('class' => 'messagesettingcomponent')); - $output .= html_writer::table($table); - $output .= html_writer::end_tag('div'); + // Add settings only if provider added for component. + if ($provideradded) { + $output .= html_writer::start_tag('div', array('class' => 'messagesettingcomponent')); + $output .= html_writer::table($table); + $output .= html_writer::end_tag('div'); + } } $output .= html_writer::end_tag('fieldset');