X-Git-Url: https://git.heureux-cyclage.org/?p=lhc%2Fweb%2Fwiklou.git;a=blobdiff_plain;f=includes%2Fhtmlform%2Ffields%2FHTMLMultiSelectField.php;h=515166c5f1a429d60e4a342933d7a48d4d6ad74a;hp=2b6e0665d55dd270e3df2937b74f5ed7eb3623ba;hb=a8379682a46a428320c88702c800a6107c015137;hpb=47d2b3d82af55538167174bbb6f1f98371953298 diff --git a/includes/htmlform/fields/HTMLMultiSelectField.php b/includes/htmlform/fields/HTMLMultiSelectField.php index 2b6e0665d5..515166c5f1 100644 --- a/includes/htmlform/fields/HTMLMultiSelectField.php +++ b/includes/htmlform/fields/HTMLMultiSelectField.php @@ -125,11 +125,8 @@ class HTMLMultiSelectField extends HTMLFormField implements HTMLNestedFilterable * @return array Options for inclusion in a select or whatever. */ public function getOptionsOOUI() { - $options = parent::getOptionsOOUI(); - foreach ( $options as &$option ) { - $option['disabled'] = in_array( $option['data'], $this->mParams['disabled-options'], true ); - } - return $options; + // Sections make this difficult. See getInputOOUI(). + throw new MWException( 'HTMLMultiSelectField#getOptionsOOUI() is not supported' ); } /** @@ -142,28 +139,62 @@ class HTMLMultiSelectField extends HTMLFormField implements HTMLNestedFilterable public function getInputOOUI( $value ) { $this->mParent->getOutput()->addModules( 'oojs-ui-widgets' ); - $attr = $this->getTooltipAndAccessKey(); - $attr['id'] = $this->mID; - $attr['name'] = "{$this->mName}[]"; + $optionsOouiSections = []; + $options = $this->getOptions(); + // If the options are supposed to be split into sections, each section becomes a separate + // CheckboxMultiselectInputWidget. + foreach ( $options as $label => $section ) { + if ( is_array( $section ) ) { + $optionsOouiSections[ $label ] = Xml::listDropDownOptionsOoui( $section ); + unset( $options[$label] ); + } + } + // If anything remains in the array, they are sectionless options. Put them in a separate widget + // at the beginning. + if ( $options ) { + $optionsOouiSections = array_merge( + [ '' => Xml::listDropDownOptionsOoui( $options ) ], + $optionsOouiSections + ); + } + + $out = ''; + foreach ( $optionsOouiSections as $sectionLabel => $optionsOoui ) { + $attr = []; + $attr['name'] = "{$this->mName}[]"; - $attr['value'] = $value; - $attr['options'] = $this->getOptionsOOUI(); + $attr['value'] = $value; + $attr['options'] = $optionsOoui; - if ( $this->mOptionsLabelsNotFromMessage ) { foreach ( $attr['options'] as &$option ) { - $option['label'] = new OOUI\HtmlSnippet( $option['label'] ); + $option['disabled'] = in_array( $option['data'], $this->mParams['disabled-options'], true ); } - } + if ( $this->mOptionsLabelsNotFromMessage ) { + foreach ( $attr['options'] as &$option ) { + $option['label'] = new OOUI\HtmlSnippet( $option['label'] ); + } + } + + $attr += OOUI\Element::configFromHtmlAttributes( + $this->getAttributes( [ 'disabled', 'tabindex' ] ) + ); - $attr += OOUI\Element::configFromHtmlAttributes( - $this->getAttributes( [ 'disabled', 'tabindex' ] ) - ); + if ( $this->mClass !== '' ) { + $attr['classes'] = [ $this->mClass ]; + } - if ( $this->mClass !== '' ) { - $attr['classes'] = [ $this->mClass ]; + $widget = new OOUI\CheckboxMultiselectInputWidget( $attr ); + if ( $sectionLabel ) { + $out .= new OOUI\FieldsetLayout( [ + 'items' => [ $widget ], + 'label' => $sectionLabel, + ] ); + } else { + $out .= $widget; + } } - return new OOUI\CheckboxMultiselectInputWidget( $attr ); + return $out; } /**