diff --git a/admin/templates/setting_configmultiselect_optgroup.mustache b/admin/templates/setting_configmultiselect_optgroup.mustache
new file mode 100644
index 00000000000..9fa61c54707
--- /dev/null
+++ b/admin/templates/setting_configmultiselect_optgroup.mustache
@@ -0,0 +1,71 @@
+{{!
+ This file is part of Moodle - http://moodle.org/
+
+ Moodle is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation, either version 3 of the License, or
+ (at your option) any later version.
+
+ Moodle is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with Moodle. If not, see .
+}}
+{{!
+ @template core_admin/setting_configmultiselect_optgroup
+
+ Admin multiselect setting template with optgroup support.
+
+ Context variables required for this template:
+ * name - form element name
+ * id - element id
+ * size - element size
+ * options - list of options not grouped
+ * optgroups - list of options grouped containing the group label and for each option: name, value, selected
+
+ Example context (json):
+ {
+ "name": "test",
+ "id": "test0",
+ "size": "3",
+ "options": [
+ { "name": "Option 1", "value": "V", "selected": false },
+ { "name": "Option 2", "value": "V", "selected": true }
+ ],
+ "optgroups": [
+ {
+ "label": "Group 1",
+ "options": [
+ { "name": "Option 3", "value": "V", "selected": false },
+ { "name": "Option 4", "value": "V", "selected": true }
+ ]
+ },
+ {
+ "label": "Group 2",
+ "options": [
+ { "name": "Option 5", "value": "V", "selected": false },
+ { "name": "Option 6", "value": "V", "selected": true }
+ ]
+ }
+ ]
+ }
+}}
+
+
+
+
+
diff --git a/admin/upgrade.txt b/admin/upgrade.txt
index 898e1d95e71..6d83d20bd7a 100644
--- a/admin/upgrade.txt
+++ b/admin/upgrade.txt
@@ -2,8 +2,9 @@ This files describes API changes in /admin/*.
=== 3.3 ===
-* The admin setting admin_setting_configselect now support the optgroup tag. Grouping of options can be created with this new tag.
- For using this new option, the option parameters needs the Group names as indexes:
+* The admin settings admin_setting_configselect and admin_setting_configmultiselect now support the optgroup tag.
+ Grouping of options can be created with this new tag.
+ For using it, the option parameters needs the Group names as indexes:
[
"Spain" => ["madrid" => "Madrid", "barcelona" => "Barcelona"],
"France" => ["paris" => "Paris", "marseille" => "Marseille"],
diff --git a/lib/adminlib.php b/lib/adminlib.php
index 3cd2933d3d2..1915fa0db87 100644
--- a/lib/adminlib.php
+++ b/lib/adminlib.php
@@ -3255,6 +3255,29 @@ class admin_setting_configmultiselect extends admin_setting_configselect {
$defaults = [];
$options = [];
+ $template = 'core_admin/setting_configmultiselect';
+
+ if (!empty($this->optgroups)) {
+ $optgroups = [];
+ foreach ($this->optgroups as $label => $choices) {
+ $optgroup = array('label' => $label, 'options' => []);
+ foreach ($choices as $value => $name) {
+ if (in_array($value, $default)) {
+ $defaults[] = $name;
+ }
+ $optgroup['options'][] = [
+ 'value' => $value,
+ 'name' => $name,
+ 'selected' => in_array($value, $data)
+ ];
+ unset($this->choices[$value]);
+ }
+ $optgroups[] = $optgroup;
+ }
+ $context->optgroups = $optgroups;
+ $template = 'core_admin/setting_configmultiselect_optgroup';
+ }
+
foreach ($this->choices as $value => $name) {
if (in_array($value, $default)) {
$defaults[] = $name;
@@ -3275,7 +3298,7 @@ class admin_setting_configmultiselect extends admin_setting_configselect {
$defaultinfo = get_string('none');
}
- $element = $OUTPUT->render_from_template('core_admin/setting_configmultiselect', $context);
+ $element = $OUTPUT->render_from_template($template, $context);
return format_admin_setting($this, $this->visiblename, $element, $this->description, true, '', $defaultinfo, $query);
}
diff --git a/theme/boost/templates/core_admin/setting_configmultiselect_optgroup.mustache b/theme/boost/templates/core_admin/setting_configmultiselect_optgroup.mustache
new file mode 100644
index 00000000000..6398e7550c1
--- /dev/null
+++ b/theme/boost/templates/core_admin/setting_configmultiselect_optgroup.mustache
@@ -0,0 +1,35 @@
+{{!
+ This file is part of Moodle - http://moodle.org/
+
+ Moodle is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation, either version 3 of the License, or
+ (at your option) any later version.
+
+ Moodle is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with Moodle. If not, see .
+}}
+{{!
+ Setting configmultiselect with optgroup support.
+}}
+