diff --git a/admin/message.php b/admin/message.php index c10034ae6ddb5..9a43f61256d10 100644 --- a/admin/message.php +++ b/admin/message.php @@ -25,47 +25,101 @@ require_once($CFG->dirroot . '/message/lib.php'); require_once($CFG->libdir.'/adminlib.php'); -// This is an admin page +// This is an admin page. admin_externalpage_setup('managemessageoutputs'); -// Get the submitted params -$disable = optional_param('disable', 0, PARAM_INT); -$enable = optional_param('enable', 0, PARAM_INT); +// Fetch processors. +$allprocessors = get_message_processors(); +$processors = 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(); -$headingtitle = get_string('managemessageoutputs', 'message'); +if (($form = data_submitted()) && confirm_sesskey()) { + $preferences = array(); + // 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; + } -if (!empty($disable) && confirm_sesskey()) { - if (!$processor = $DB->get_record('message_processors', array('id'=>$disable))) { - print_error('outputdoesnotexist', 'message'); + foreach (array('permitted', 'loggedin', 'loggedoff') as $setting) { + $value = null; + $componentprovidersetting = $componentproviderbase.'_'.$setting; + if ($setting == 'permitted') { + // If we deal with permitted select element, we need to create individual + // setting for each possible processor. Note that this block will + // always be processed first after entring parental foreach iteration + // so we can change form values on this stage. + foreach ($allprocessors as $processor) { + $value = ''; + if (isset($form->{$componentprovidersetting}[$processor->name])) { + $value = $form->{$componentprovidersetting}[$processor->name]; + } + // Ensure that loggedin loggedoff options are set correctly for this permission. + 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; + } + } else 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. + $value = join(',', array_keys(array_filter($form->{$componentprovidersetting}))); + if (empty($value)) { + $value = null; + } + } + if ($setting != 'permitted') { + // We have already recoded site preferences for 'permitted' type. + $preferences['message_provider_'.$componentprovidersetting] = $value; + } + } + } + + // Update database. + $transaction = $DB->start_delegated_transaction(); + + // Save processors enabled/disabled status. + foreach ($allprocessors as $processor) { + $enabled = isset($form->{$processor->name}); + \core_message\api::update_processor_status($processor, $enabled); } - \core_message\api::update_processor_status($processor, 0); // Disable output. - core_plugin_manager::reset_caches(); -} -if (!empty($enable) && confirm_sesskey()) { - if (!$processor = $DB->get_record('message_processors', array('id'=>$enable))) { - print_error('outputdoesnotexist', 'message'); + foreach ($preferences as $name => $value) { + set_config($name, $value, 'message'); } - \core_message\api::update_processor_status($processor, 1); // Enable output. + $transaction->allow_commit(); + core_plugin_manager::reset_caches(); -} -if ($disable || $enable) { $url = new moodle_url('message.php'); redirect($url); } + // Page settings $PAGE->set_context(context_system::instance()); +$PAGE->requires->js_init_call('M.core_message.init_defaultoutputs'); -// Grab the renderer $renderer = $PAGE->get_renderer('core', 'message'); -// Display the manage message outputs interface -$processors = get_message_processors(); -$messageoutputs = $renderer->manage_messageoutputs($processors); - -// Display the page +// Display the page. echo $OUTPUT->header(); -echo $OUTPUT->heading($headingtitle); -echo $messageoutputs; +echo $renderer->manage_messageoutput_settings($allprocessors, $processors, $providers, $preferences); echo $OUTPUT->footer(); diff --git a/admin/settings/messaging.php b/admin/settings/messaging.php new file mode 100644 index 0000000000000..2221e72a5ae31 --- /dev/null +++ b/admin/settings/messaging.php @@ -0,0 +1,78 @@ +. + +/** + * Adds messaging related settings links for Messaging category to admin tree. + * + * @copyright 2019 Amaia Anabitarte + * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later + */ + +defined('MOODLE_INTERNAL') || die(); + +if ($hassiteconfig) { + $temp = new admin_settingpage('messages', new lang_string('messagingssettings', 'admin')); + $temp->add(new admin_setting_configcheckbox('messaging', + new lang_string('messaging', 'admin'), + new lang_string('configmessaging', 'admin'), + 1)); + $temp->add(new admin_setting_configcheckbox('messagingallusers', + new lang_string('messagingallusers', 'admin'), + new lang_string('configmessagingallusers', 'admin'), + 0) + ); + $temp->add(new admin_setting_configcheckbox('messagingdefaultpressenter', + new lang_string('messagingdefaultpressenter', 'admin'), + new lang_string('configmessagingdefaultpressenter', 'admin'), + 1) + ); + $options = array( + DAYSECS => new lang_string('secondstotime86400'), + WEEKSECS => new lang_string('secondstotime604800'), + 2620800 => new lang_string('nummonths', 'moodle', 1), + 7862400 => new lang_string('nummonths', 'moodle', 3), + 15724800 => new lang_string('nummonths', 'moodle', 6), + 0 => new lang_string('never') + ); + $temp->add(new admin_setting_configselect( + 'messagingdeletereadnotificationsdelay', + new lang_string('messagingdeletereadnotificationsdelay', 'admin'), + new lang_string('configmessagingdeletereadnotificationsdelay', 'admin'), + 604800, + $options) + ); + $temp->add(new admin_setting_configselect( + 'messagingdeleteallnotificationsdelay', + new lang_string('messagingdeleteallnotificationsdelay', 'admin'), + new lang_string('configmessagingdeleteallnotificationsdelay', 'admin'), + 2620800, + $options) + ); + $temp->add(new admin_setting_configcheckbox('messagingallowemailoverride', + new lang_string('messagingallowemailoverride', 'admin'), + new lang_string('configmessagingallowemailoverride', 'admin'), + 0)); + $ADMIN->add('messaging', $temp); + $ADMIN->add('messaging', new admin_page_managemessageoutputs()); + + // Notification outputs plugins. + $plugins = core_plugin_manager::instance()->get_plugins_of_type('message'); + core_collator::asort_objects_by_property($plugins, 'displayname'); + foreach ($plugins as $plugin) { + /** @var \core\plugininfo\message $plugin */ + $plugin->load_settings($ADMIN, 'messaging', $hassiteconfig); + } +} diff --git a/admin/settings/plugins.php b/admin/settings/plugins.php index 485eb012dfb61..925829c56056a 100644 --- a/admin/settings/plugins.php +++ b/admin/settings/plugins.php @@ -81,17 +81,6 @@ $plugin->load_settings($ADMIN, 'blocksettings', $hassiteconfig); } - // message outputs - $ADMIN->add('modules', new admin_category('messageoutputs', new lang_string('messageoutputs', 'message'))); - $ADMIN->add('messageoutputs', new admin_page_managemessageoutputs()); - $ADMIN->add('messageoutputs', new admin_page_defaultmessageoutputs()); - $plugins = core_plugin_manager::instance()->get_plugins_of_type('message'); - core_collator::asort_objects_by_property($plugins, 'displayname'); - foreach ($plugins as $plugin) { - /** @var \core\plugininfo\message $plugin */ - $plugin->load_settings($ADMIN, 'messageoutputs', $hassiteconfig); - } - // authentication plugins $ADMIN->add('modules', new admin_category('authsettings', new lang_string('authentication', 'admin'))); diff --git a/admin/settings/subsystems.php b/admin/settings/subsystems.php index b559de31e3be7..de5f75be9939a 100644 --- a/admin/settings/subsystems.php +++ b/admin/settings/subsystems.php @@ -13,45 +13,6 @@ $optionalsubsystems->add(new admin_setting_configcheckbox('enablewebservices', new lang_string('enablewebservices', 'admin'), new lang_string('configenablewebservices', 'admin'), 0)); - $optionalsubsystems->add(new admin_setting_configcheckbox('messaging', new lang_string('messaging', 'admin'), new lang_string('configmessaging','admin'), 1)); - - $optionalsubsystems->add(new admin_setting_configcheckbox('messagingallusers', - new lang_string('messagingallusers', 'admin'), - new lang_string('configmessagingallusers', 'admin'), - 0) - ); - - $optionalsubsystems->add(new admin_setting_configcheckbox('messagingdefaultpressenter', - new lang_string('messagingdefaultpressenter', 'admin'), - new lang_string('configmessagingdefaultpressenter', 'admin'), - 1) - ); - - $options = array( - DAYSECS => new lang_string('secondstotime86400'), - WEEKSECS => new lang_string('secondstotime604800'), - 2620800 => new lang_string('nummonths', 'moodle', 1), - 7862400 => new lang_string('nummonths', 'moodle', 3), - 15724800 => new lang_string('nummonths', 'moodle', 6), - 0 => new lang_string('never') - ); - $optionalsubsystems->add(new admin_setting_configselect( - 'messagingdeletereadnotificationsdelay', - new lang_string('messagingdeletereadnotificationsdelay', 'admin'), - new lang_string('configmessagingdeletereadnotificationsdelay', 'admin'), - 604800, - $options) - ); - $optionalsubsystems->add(new admin_setting_configselect( - 'messagingdeleteallnotificationsdelay', - new lang_string('messagingdeleteallnotificationsdelay', 'admin'), - new lang_string('configmessagingdeleteallnotificationsdelay', 'admin'), - 2620800, - $options) - ); - - $optionalsubsystems->add(new admin_setting_configcheckbox('messagingallowemailoverride', new lang_string('messagingallowemailoverride', 'admin'), new lang_string('configmessagingallowemailoverride','admin'), 0)); - $optionalsubsystems->add(new admin_setting_configcheckbox('enablestats', new lang_string('enablestats', 'admin'), new lang_string('configenablestats', 'admin'), 0)); $optionalsubsystems->add(new admin_setting_configcheckbox('enablerssfeeds', new lang_string('enablerssfeeds', 'admin'), new lang_string('configenablerssfeeds', 'admin'), 0)); diff --git a/admin/settings/top.php b/admin/settings/top.php index 102b75817d11e..32d91c604d846 100644 --- a/admin/settings/top.php +++ b/admin/settings/top.php @@ -33,6 +33,7 @@ $ADMIN->add('root', new admin_category('badges', new lang_string('badges'), empty($CFG->enablebadges))); $ADMIN->add('root', new admin_category('location', new lang_string('location','admin'))); $ADMIN->add('root', new admin_category('language', new lang_string('language'))); +$ADMIN->add('root', new admin_category('messaging', new lang_string('messagingcategory', 'admin'))); $ADMIN->add('root', new admin_category('modules', new lang_string('plugins', 'admin'))); $ADMIN->add('root', new admin_category('security', new lang_string('security','admin'))); $ADMIN->add('root', new admin_category('appearance', new lang_string('appearance','admin'))); diff --git a/lang/en/admin.php b/lang/en/admin.php index 36c0c7ea9fccf..1a0f99780bebd 100644 --- a/lang/en/admin.php +++ b/lang/en/admin.php @@ -773,9 +773,11 @@ $string['messaging'] = 'Enable messaging system'; $string['messagingallowemailoverride'] = 'Notification email override'; $string['messagingallusers'] = 'Allow site-wide messaging'; +$string['messagingcategory'] = 'Messaging'; $string['messagingdefaultpressenter'] = 'Use enter to send enabled by default'; $string['messagingdeletereadnotificationsdelay'] = 'Delete read notifications'; $string['messagingdeleteallnotificationsdelay'] = 'Delete all notifications'; +$string['messagingssettings'] = 'Messaging settings'; $string['minpassworddigits'] = 'Digits'; $string['minpasswordlength'] = 'Password length'; $string['minpasswordlower'] = 'Lowercase letters'; diff --git a/lang/en/message.php b/lang/en/message.php index f9a045a19076a..e1a75830ea3b4 100644 --- a/lang/en/message.php +++ b/lang/en/message.php @@ -47,7 +47,7 @@ $string['contactrequestsent'] = 'Contact request sent'; $string['contacts'] = 'Contacts'; $string['decline'] = 'Decline'; -$string['defaultmessageoutputs'] = 'Default message outputs'; +$string['defaultmessageoutputs'] = 'Notification settings'; $string['defaults'] = 'Defaults'; $string['deleteallconfirm'] = "Are you sure you would like to delete this entire conversation? This will not delete it for other conversation participants."; $string['deleteallmessages'] = "Delete all messages"; @@ -90,8 +90,8 @@ $string['loggedoff'] = 'Offline'; $string['loggedoff_help'] = 'Configure how you would like to receive notifications when you are not logged into Moodle'; $string['loggedoffdescription'] = 'When you are not logged into Moodle'; -$string['managemessageoutputs'] = 'Manage message outputs'; -$string['messageoutputs'] = 'Message outputs'; +$string['managemessageoutputs'] = 'Default notification preferences'; +$string['messageoutputs'] = 'Notification plugins'; $string['messagepreferences'] = 'Message preferences'; $string['message'] = 'Message'; $string['messagecontactrequestsnotification'] = '{$a} wants to be added as a contact'; diff --git a/lang/en/plugin.php b/lang/en/plugin.php index 2f3322b846ee6..c0d4da1fa3b59 100644 --- a/lang/en/plugin.php +++ b/lang/en/plugin.php @@ -152,8 +152,8 @@ $string['type_local_plural'] = 'Local plugins'; $string['type_media'] = 'Media player'; $string['type_media_plural'] = 'Media players'; -$string['type_message'] = 'Messaging output'; -$string['type_message_plural'] = 'Messaging outputs'; +$string['type_message'] = 'Notification plugin'; +$string['type_message_plural'] = 'Notification plugins'; $string['type_mnetservice'] = 'MNet service'; $string['type_mnetservice_plural'] = 'MNet services'; $string['type_mod'] = 'Activity module'; diff --git a/lib/adminlib.php b/lib/adminlib.php index edf599878dfce..f7a21b2f16ea0 100644 --- a/lib/adminlib.php +++ b/lib/adminlib.php @@ -6339,7 +6339,10 @@ class admin_page_managemessageoutputs extends admin_externalpage { */ public function __construct() { global $CFG; - parent::__construct('managemessageoutputs', get_string('managemessageoutputs', 'message'), new moodle_url('/admin/message.php')); + parent::__construct('managemessageoutputs', + get_string('defaultmessageoutputs', 'message'), + new moodle_url('/admin/message.php') + ); } /** diff --git a/message/renderer.php b/message/renderer.php index 17af06dc068d6..9af97a28013c6 100644 --- a/message/renderer.php +++ b/message/renderer.php @@ -36,6 +36,37 @@ */ class core_message_renderer extends plugin_renderer_base { + /** + * Display the interface to manage both message outputs and default message outputs + * + * @param array $allprocessors array of objects containing all message processors + * @param array $processors array of objects containing active message processors + * @param array $providers array of objects containing message providers + * @param array $preferences array of objects containing current preferences + * @return string The text to render + */ + public function manage_messageoutput_settings($allprocessors, $processors, $providers, $preferences) { + $output = html_writer::start_tag('form', array('id' => 'defaultmessageoutputs', 'method' => 'post')); + $output .= html_writer::empty_tag('input', array('type' => 'hidden', 'name' => 'sesskey', 'value' => sesskey())); + + // Add message output processors enabled/disabled and settings. + $output .= $this->heading(get_string('messageoutputs', 'message')); + $output .= $this->manage_messageoutputs($allprocessors); + + // Add active message output processors settings. + $output .= $this->heading(get_string('managemessageoutputs', 'message')); + $output .= $this->manage_defaultmessageoutputs($processors, $providers, $preferences); + + $output .= html_writer::start_tag('div', array('class' => 'form-buttons')); + $output .= html_writer::empty_tag('input', + array('type' => 'submit', 'value' => get_string('savechanges', 'admin'), 'class' => 'form-submit btn btn-primary') + ); + $output .= html_writer::end_tag('div'); + $output .= html_writer::end_tag('form'); + + return $output; + } + /** * Display the interface to manage message outputs * @@ -43,7 +74,6 @@ class core_message_renderer extends plugin_renderer_base { * @return string The text to render */ public function manage_messageoutputs($processors) { - global $CFG; // Display the current workflows $table = new html_table(); $table->attributes['class'] = 'admintable generaltable'; @@ -61,28 +91,21 @@ public function manage_messageoutputs($processors) { $row = new html_table_row(); $row->attributes['class'] = 'messageoutputs'; - // Name $name = new html_table_cell(get_string('pluginname', 'message_'.$processor->name)); - - // Enable $enable = new html_table_cell(); - $enable->attributes['class'] = 'mdl-align'; if (!$processor->available) { - $enable->text = html_writer::nonempty_tag('span', get_string('outputnotavailable', 'message'), array('class' => 'error')); - } else if (!$processor->configured) { - $enable->text = html_writer::nonempty_tag('span', get_string('outputnotconfigured', 'message'), array('class' => 'error')); - } else if ($processor->enabled) { - $url = new moodle_url('/admin/message.php', array('disable' => $processor->id, 'sesskey' => sesskey())); - $enable->text = html_writer::link($url, $this->output->pix_icon('t/hide', get_string('outputenabled', 'message'))); + $enable->text = html_writer::nonempty_tag('span', get_string('outputnotavailable', 'message'), + array('class' => 'error') + ); } else { - $row->attributes['class'] = 'dimmed_text'; - $url = new moodle_url('/admin/message.php', array('enable' => $processor->id, 'sesskey' => sesskey())); - $enable->text = html_writer::link($url, $this->output->pix_icon('t/show', get_string('outputdisabled', 'message'))); + $enable->text = html_writer::checkbox($processor->name, $processor->id, $processor->enabled, '', + array('id' => $processor->name) + ); } // Settings $settings = new html_table_cell(); if ($processor->available && $processor->hassettings) { - $settingsurl = new moodle_url('settings.php', array('section' => 'messagesetting'.$processor->name)); + $settingsurl = new moodle_url('/admin/settings.php', array('section' => 'messagesetting'.$processor->name)); $settings->text = html_writer::link($settingsurl, get_string('settings', 'message')); } @@ -101,17 +124,12 @@ public function manage_messageoutputs($processors) { * @return string The text to render */ public function manage_defaultmessageoutputs($processors, $providers, $preferences) { - global $CFG; - // Prepare list of options for dropdown menu $options = array(); foreach (array('disallowed', 'permitted', 'forced') as $setting) { $options[$setting] = get_string($setting, 'message'); } - $output = html_writer::start_tag('form', array('id'=>'defaultmessageoutputs', 'method'=>'post')); - $output .= html_writer::empty_tag('input', array('type'=>'hidden', 'name'=>'sesskey', 'value'=>sesskey())); - // Display users outputs table $table = new html_table(); $table->attributes['class'] = 'generaltable'; @@ -195,11 +213,7 @@ public function manage_defaultmessageoutputs($processors, $providers, $preferenc $table->data[] = $row; } - $output .= html_writer::table($table); - $output .= html_writer::start_tag('div', array('class' => 'form-buttons')); - $output .= html_writer::empty_tag('input', array('type' => 'submit', 'value' => get_string('savechanges','admin'), 'class' => 'form-submit')); - $output .= html_writer::end_tag('div'); - $output .= html_writer::end_tag('form'); + $output = html_writer::table($table); return $output; }