Skip to content

Commit

Permalink
MDL-49423 admin: Support optgroup in admin_setting_configmultiselect
Browse files Browse the repository at this point in the history
  • Loading branch information
jleyva committed Jan 20, 2017
1 parent 25905de commit 1295885
Show file tree
Hide file tree
Showing 4 changed files with 133 additions and 3 deletions.
71 changes: 71 additions & 0 deletions admin/templates/setting_configmultiselect_optgroup.mustache
Original file line number Diff line number Diff line change
@@ -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 <http://www.gnu.org/licenses/>.
}}
{{!
@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 }
]
}
]
}
}}
<div class="form-select">
<input type="hidden" name="{{name}}[xxxxx]" value="1">
<select id="{{id}}" name="{{name}}[]" size="{{size}}" multiple>
{{#options}}
<option value="{{value}}" {{#selected}}selected{{/selected}}>{{name}}</option>
{{/options}}
{{#optgroups}}
<optgroup label="{{label}}">
{{#options}}
<option value="{{value}}" {{#selected}}selected{{/selected}}>{{name}}</option>
{{/options}}
</optgroup>
{{/optgroups}}
</select>
</div>

5 changes: 3 additions & 2 deletions admin/upgrade.txt
Original file line number Diff line number Diff line change
Expand Up @@ -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"],
Expand Down
25 changes: 24 additions & 1 deletion lib/adminlib.php
Original file line number Diff line number Diff line change
Expand Up @@ -3255,6 +3255,29 @@ public function output_html($data, $query='') {

$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;
Expand All @@ -3275,7 +3298,7 @@ public function output_html($data, $query='') {
$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);
}
Expand Down
Original file line number Diff line number Diff line change
@@ -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 <http://www.gnu.org/licenses/>.
}}
{{!
Setting configmultiselect with optgroup support.
}}
<div class="form-select">
<input type="hidden" name="{{name}}[xxxxx]" value="1">
<select id="{{id}}" name="{{name}}[]" size="{{size}}" class="form-control" multiple>
{{#options}}
<option value="{{value}}" {{#selected}}selected{{/selected}}>{{name}}</option>
{{/options}}
{{#optgroups}}
<optgroup label="{{label}}">
{{#options}}
<option value="{{value}}" {{#selected}}selected{{/selected}}>{{name}}</option>
{{/options}}
</optgroup>
{{/optgroups}}
</select>
</div>

0 comments on commit 1295885

Please sign in to comment.