From 1fc5401703ed66dee8d216eb8174b13c5f03b769 Mon Sep 17 00:00:00 2001 From: =?utf8?q?Bartosz=20Dziewo=C5=84ski?= Date: Sun, 14 Jun 2015 20:14:31 +0200 Subject: [PATCH] OOUIHTMLForm: Implement HTMLMultiSelectField Example usage in I30d401cc7c827b21eb2fb116558d0d9e764ec1f3. Following the template set by HTMLCheckMatrix, which for some reason was implemented first. Also removed unfulfillable @todo comment. Also corrected HTMLCheckMatrix code not to wrap OOUI widgets in MediaWiki UI wrappers even when 'UseMediaWikiUIEverywhere' is set to true, and to set the correct 'value' for checkboxes. Bug: T100955 Change-Id: Ib5d000ca9a08abc8086ee05b5122116b086242ad --- includes/htmlform/HTMLCheckMatrix.php | 27 +++++----- includes/htmlform/HTMLMultiSelectField.php | 60 ++++++++++++++-------- 2 files changed, 54 insertions(+), 33 deletions(-) diff --git a/includes/htmlform/HTMLCheckMatrix.php b/includes/htmlform/HTMLCheckMatrix.php index 7ccb60e04e..a0566a0396 100644 --- a/includes/htmlform/HTMLCheckMatrix.php +++ b/includes/htmlform/HTMLCheckMatrix.php @@ -119,9 +119,8 @@ class HTMLCheckMatrix extends HTMLFormField implements HTMLNestedFilterable { foreach ( $columns as $columnTag ) { $thisTag = "$columnTag-$rowTag"; // Construct the checkbox - $thisId = "{$this->mID}-$thisTag"; $thisAttribs = array( - 'id' => $thisId, + 'id' => "{$this->mID}-$thisTag", 'value' => $thisTag, ); $checked = in_array( $thisTag, (array)$value, true ); @@ -132,18 +131,13 @@ class HTMLCheckMatrix extends HTMLFormField implements HTMLNestedFilterable { $checked = true; $thisAttribs['disabled'] = 1; } - $chkBox = $this->getOneCheckbox( $checked, $attribs + $thisAttribs ); - if ( $this->mParent->getConfig()->get( 'UseMediaWikiUIEverywhere' ) ) { - $chkBox = Html::openElement( 'div', array( 'class' => 'mw-ui-checkbox' ) ) . - $chkBox . - Html::element( 'label', array( 'for' => $thisId ) ) . - Html::closeElement( 'div' ); - } + $checkbox = $this->getOneCheckbox( $checked, $attribs + $thisAttribs ); + $rowContents .= Html::rawElement( 'td', array(), - $chkBox + $checkbox ); } $tableContents .= Html::rawElement( 'tr', array(), "\n$rowContents\n" ); @@ -162,11 +156,18 @@ class HTMLCheckMatrix extends HTMLFormField implements HTMLNestedFilterable { return new OOUI\CheckboxInputWidget( array( 'name' => "{$this->mName}[]", 'selected' => $checked, - 'value' => '1', + 'value' => $attribs['value'], ) + $attribs ); + } else { + $checkbox = Xml::check( "{$this->mName}[]", $checked, $attribs ); + if ( $this->mParent->getConfig()->get( 'UseMediaWikiUIEverywhere' ) ) { + $checkbox = Html::openElement( 'div', array( 'class' => 'mw-ui-checkbox' ) ) . + $checkbox . + Html::element( 'label', array( 'for' => $attribs['id'] ) ) . + Html::closeElement( 'div' ); + } + return $checkbox; } - - return Xml::check( "{$this->mName}[]", $checked, $attribs ); } protected function isTagForcedOff( $tag ) { diff --git a/includes/htmlform/HTMLMultiSelectField.php b/includes/htmlform/HTMLMultiSelectField.php index 8d28b59ecb..523f04550c 100644 --- a/includes/htmlform/HTMLMultiSelectField.php +++ b/includes/htmlform/HTMLMultiSelectField.php @@ -38,34 +38,19 @@ class HTMLMultiSelectField extends HTMLFormField implements HTMLNestedFilterable $html = ''; $attribs = $this->getAttributes( array( 'disabled', 'tabindex' ) ); - $elementFunc = array( 'Html', $this->mOptionsLabelsNotFromMessage ? 'rawElement' : 'element' ); foreach ( $options as $label => $info ) { if ( is_array( $info ) ) { $html .= Html::rawElement( 'h1', array(), $label ) . "\n"; $html .= $this->formatOptions( $info, $value ); } else { - $thisAttribs = array( 'id' => "{$this->mID}-$info", 'value' => $info ); - - // @todo: Make this use checkLabel for consistency purposes - $checkbox = Xml::check( - $this->mName . '[]', - in_array( $info, $value, true ), - $attribs + $thisAttribs - ); - $checkbox .= ' ' . call_user_func( $elementFunc, - 'label', - array( 'for' => "{$this->mID}-$info" ), - $label + $thisAttribs = array( + 'id' => "{$this->mID}-$info", + 'value' => $info, ); + $checked = in_array( $info, $value, true ); - if ( $this->mParent->getConfig()->get( 'UseMediaWikiUIEverywhere' ) ) { - $checkbox = Html::rawElement( - 'div', - array( 'class' => 'mw-ui-checkbox' ), - $checkbox - ); - } + $checkbox = $this->getOneCheckbox( $checked, $attribs + $thisAttribs, $label ); $html .= ' ' . Html::rawElement( 'div', @@ -78,6 +63,41 @@ class HTMLMultiSelectField extends HTMLFormField implements HTMLNestedFilterable return $html; } + protected function getOneCheckbox( $checked, $attribs, $label ) { + if ( $this->mParent instanceof OOUIHTMLForm ) { + if ( $this->mOptionsLabelsNotFromMessage ) { + $label = new OOUI\HtmlSnippet( $label ); + } + return new OOUI\FieldLayout( + new OOUI\CheckboxInputWidget( array( + 'name' => "{$this->mName}[]", + 'selected' => $checked, + 'value' => $attribs['value'], + ) + $attribs ), + array( + 'label' => $label, + 'align' => 'inline', + ) + ); + } else { + $elementFunc = array( 'Html', $this->mOptionsLabelsNotFromMessage ? 'rawElement' : 'element' ); + $checkbox = + Xml::check( "{$this->mName}[]", $checked, $attribs ) . + ' ' . + call_user_func( $elementFunc, + 'label', + array( 'for' => $attribs['id'] ), + $label + ); + if ( $this->mParent->getConfig()->get( 'UseMediaWikiUIEverywhere' ) ) { + $checkbox = Html::openElement( 'div', array( 'class' => 'mw-ui-checkbox' ) ) . + $checkbox . + Html::closeElement( 'div' ); + } + return $checkbox; + } + } + /** * @param WebRequest $request * -- 2.20.1