From db9ff28e3ebe87ed965561d4458841b7aad095c9 Mon Sep 17 00:00:00 2001 From: Thalia Date: Thu, 13 Jun 2019 20:04:49 +0100 Subject: [PATCH] Fix some issues with HTMLSelectAndOtherField default and validation Bring HTMLSelectAndOtherField in line with other HTMLFormFields by ensuring that the default value is of the correct type and passes validation checks. Also make sure HTMLSelectAndOtherField::validate checks for the final value, if the field has required set to true. Bug: T222170 Bug: T225860 Change-Id: I949ee3df2b1f597982cf522b149c54b8e79d59bc --- .../fields/HTMLSelectAndOtherField.php | 48 ++++++++++++------- 1 file changed, 32 insertions(+), 16 deletions(-) diff --git a/includes/htmlform/fields/HTMLSelectAndOtherField.php b/includes/htmlform/fields/HTMLSelectAndOtherField.php index f137bf1085..85cbbb1055 100644 --- a/includes/htmlform/fields/HTMLSelectAndOtherField.php +++ b/includes/htmlform/fields/HTMLSelectAndOtherField.php @@ -141,6 +141,35 @@ class HTMLSelectAndOtherField extends HTMLSelectField { return new MediaWiki\Widget\SelectWithInputWidget( $params ); } + /** + * @inheritDoc + */ + public function getDefault() { + $default = parent::getDefault(); + + // Default values of empty form + $final = ''; + $list = 'other'; + $text = ''; + + if ( $default !== null ) { + $final = $default; + // Assume the default is a text value, with the 'other' option selected. + // Then check if that assumption is correct, and update $list and $text if not. + $text = $final; + foreach ( $this->mFlatOptions as $option ) { + $match = $option . $this->msg( 'colon-separator' )->inContentLanguage()->text(); + if ( strpos( $final, $match ) === 0 ) { + $list = $option; + $text = substr( $final, strlen( $match ) ); + break; + } + } + } + + return [ $final, $list, $text ]; + } + /** * @param WebRequest $request * @@ -163,22 +192,9 @@ class HTMLSelectAndOtherField extends HTMLSelectField { } else { $final = $list . $this->msg( 'colon-separator' )->inContentLanguage()->text() . $text; } - } else { - $final = $this->getDefault(); - - $list = 'other'; - $text = $final; - foreach ( $this->mFlatOptions as $option ) { - $match = $option . $this->msg( 'colon-separator' )->inContentLanguage()->text(); - if ( strpos( $text, $match ) === 0 ) { - $list = $option; - $text = substr( $text, strlen( $match ) ); - break; - } - } + return [ $final, $list, $text ]; } - - return [ $final, $list, $text ]; + return $this->getDefault(); } public function getSize() { @@ -197,7 +213,7 @@ class HTMLSelectAndOtherField extends HTMLSelectField { if ( isset( $this->mParams['required'] ) && $this->mParams['required'] !== false - && $value[1] === '' + && $value[0] === '' ) { return $this->msg( 'htmlform-required' ); } -- 2.20.1