Merge "HTMLForm: Allow returning Message objects from HTMLFormField::validate()"
authorjenkins-bot <jenkins-bot@gerrit.wikimedia.org>
Fri, 25 Nov 2016 09:11:07 +0000 (09:11 +0000)
committerGerrit Code Review <gerrit@wikimedia.org>
Fri, 25 Nov 2016 09:11:07 +0000 (09:11 +0000)
1  2 
includes/htmlform/fields/HTMLAutoCompleteSelectField.php

   *   options-messages - As for HTMLSelectField
   *   options - As for HTMLSelectField
   *   options-message - As for HTMLSelectField
 - *   autocomplete - Associative array mapping display text to values.
 - *   autocomplete-messages - Like autocomplete, but keys are message names.
 + *   autocomplete-data - Associative array mapping display text to values.
 + *   autocomplete-data-messages - Like autocomplete, but keys are message names.
   *   require-match - Boolean, if true the value must be in the options or the
   *     autocomplete.
   *   other-message - Message to use instead of htmlform-selectorother-other for
   *      the 'other' message.
   *   other - Raw text to use for the 'other' message
 + *
 + * The old name of autocomplete-data[-messages] was autocomplete[-messages] which is still
 + * recognized but deprecated since MediaWiki 1.29 since it conflicts with how autocomplete is
 + * used in HTMLTextField.
   */
  class HTMLAutoCompleteSelectField extends HTMLTextField {
 -      protected $autocomplete = [];
 +      protected $autocompleteData = [];
  
        public function __construct( $params ) {
                $params += [
                        'require-match' => false,
                ];
  
 +              // FIXME B/C, remove in 1.30
 +              if (
 +                      array_key_exists( 'autocomplete', $params )
 +                      && !array_key_exists( 'autocomplete-data', $params )
 +              ) {
 +                      $params['autocomplete-data'] = $params['autocomplete'];
 +                      unset( $params['autocomplete'] );
 +              }
 +              if (
 +                      array_key_exists( 'autocomplete-messages', $params )
 +                      && !array_key_exists( 'autocomplete-data-messages', $params )
 +              ) {
 +                      $params['autocomplete-data-messages'] = $params['autocomplete-messages'];
 +                      unset( $params['autocomplete-messages'] );
 +              }
 +
                parent::__construct( $params );
  
 -              if ( array_key_exists( 'autocomplete-messages', $this->mParams ) ) {
 -                      foreach ( $this->mParams['autocomplete-messages'] as $key => $value ) {
 +              if ( array_key_exists( 'autocomplete-data-messages', $this->mParams ) ) {
 +                      foreach ( $this->mParams['autocomplete-data-messages'] as $key => $value ) {
                                $key = $this->msg( $key )->plain();
 -                              $this->autocomplete[$key] = strval( $value );
 +                              $this->autocompleteData[$key] = strval( $value );
                        }
 -              } elseif ( array_key_exists( 'autocomplete', $this->mParams ) ) {
 -                      foreach ( $this->mParams['autocomplete'] as $key => $value ) {
 -                              $this->autocomplete[$key] = strval( $value );
 +              } elseif ( array_key_exists( 'autocomplete-data', $this->mParams ) ) {
 +                      foreach ( $this->mParams['autocomplete-data'] as $key => $value ) {
 +                              $this->autocompleteData[$key] = strval( $value );
                        }
                }
 -              if ( !is_array( $this->autocomplete ) || !$this->autocomplete ) {
 +              if ( !is_array( $this->autocompleteData ) || !$this->autocompleteData ) {
                        throw new MWException( 'HTMLAutoCompleteSelectField called without any autocompletions' );
                }
  
@@@ -89,8 -69,8 +89,8 @@@
  
                        if ( $val === 'other' ) {
                                $val = $request->getText( $this->mName );
 -                              if ( isset( $this->autocomplete[$val] ) ) {
 -                                      $val = $this->autocomplete[$val];
 +                              if ( isset( $this->autocompleteData[$val] ) ) {
 +                                      $val = $this->autocompleteData[$val];
                                }
                        }
  
                        return $p;
                }
  
 -              $validOptions = HTMLFormField::flattenOptions( $this->getOptions() );
 +              $validOptions = HTMLFormField::flattenOptions( $this->getOptions() ?: [] );
  
                if ( in_array( strval( $value ), $validOptions, true ) ) {
                        return true;
 -              } elseif ( in_array( strval( $value ), $this->autocomplete, true ) ) {
 +              } elseif ( in_array( strval( $value ), $this->autocompleteData, true ) ) {
                        return true;
                } elseif ( $this->mParams['require-match'] ) {
-                       return $this->msg( 'htmlform-select-badoption' )->parse();
+                       return $this->msg( 'htmlform-select-badoption' );
                }
  
                return true;
        public function getAttributes( array $list ) {
                $attribs = [
                        'type' => 'text',
 -                      'data-autocomplete' => FormatJson::encode( array_keys( $this->autocomplete ) ),
 +                      'data-autocomplete' => FormatJson::encode( array_keys( $this->autocompleteData ) ),
                ] + parent::getAttributes( $list );
  
                if ( $this->getOptions() ) {
                if ( $valInSelect ) {
                        $value = '';
                } else {
 -                      $key = array_search( strval( $value ), $this->autocomplete, true );
 +                      $key = array_search( strval( $value ), $this->autocompleteData, true );
                        if ( $key !== false ) {
                                $value = $key;
                        }