6 * Besides the parameters recognized by HTMLFormField, the following are
8 * autocomplete - HTML autocomplete value (a boolean for on/off or a string according to
9 * https://html.spec.whatwg.org/multipage/forms.html#autofill )
11 class HTMLTextField
extends HTMLFormField
{
12 protected $mPlaceholder = '';
14 /** @var bool HTML autocomplete attribute */
15 protected $autocomplete;
18 * @param array $params
19 * - type: HTML textfield type
20 * - size: field size in characters (defaults to 45)
21 * - placeholder/placeholder-message: set HTML placeholder attribute
22 * - spellcheck: set HTML spellcheck attribute
23 * - persistent: upon unsuccessful requests, retain the value (defaults to true, except
24 * for password fields)
26 public function __construct( $params ) {
27 if ( isset( $params['autocomplete'] ) && is_bool( $params['autocomplete'] ) ) {
28 $params['autocomplete'] = $params['autocomplete'] ?
'on' : 'off';
31 parent
::__construct( $params );
33 if ( isset( $params['placeholder-message'] ) ) {
34 $this->mPlaceholder
= $this->getMessage( $params['placeholder-message'] )->text();
35 } elseif ( isset( $params['placeholder'] ) ) {
36 $this->mPlaceholder
= $params['placeholder'];
40 public function getSize() {
41 return $this->mParams
['size'] ??
45;
44 public function getSpellCheck() {
45 $val = $this->mParams
['spellcheck'] ??
null;
46 if ( is_bool( $val ) ) {
47 // "spellcheck" attribute literally requires "true" or "false" to work.
48 return $val === true ?
'true' : 'false';
53 public function isPersistent() {
54 if ( isset( $this->mParams
['persistent'] ) ) {
55 return $this->mParams
['persistent'];
57 // don't put passwords into the HTML body, they could get cached or otherwise leaked
58 return !( isset( $this->mParams
['type'] ) && $this->mParams
['type'] === 'password' );
61 public function getInputHTML( $value ) {
62 if ( !$this->isPersistent() ) {
68 'name' => $this->mName
,
69 'size' => $this->getSize(),
72 'spellcheck' => $this->getSpellCheck(),
73 ] +
$this->getTooltipAndAccessKey() +
$this->getDataAttribs();
75 if ( $this->mClass
!== '' ) {
76 $attribs['class'] = $this->mClass
;
78 if ( $this->mPlaceholder
!== '' ) {
79 $attribs['placeholder'] = $this->mPlaceholder
;
82 # @todo Enforce pattern, step, required, readonly on the server side as
97 // Only used in HTML mode:
103 $attribs +
= $this->getAttributes( $allowedParams );
106 $type = $this->getType( $attribs );
107 return Html
::input( $this->mName
, $value, $type, $attribs );
110 protected function getType( &$attribs ) {
111 $type = $attribs['type'] ??
'text';
112 unset( $attribs['type'] );
114 # Implement tiny differences between some field variants
115 # here, rather than creating a new class for each one which
116 # is essentially just a clone of this one.
117 if ( isset( $this->mParams
['type'] ) ) {
118 switch ( $this->mParams
['type'] ) {
121 $attribs['step'] = 1;
125 $attribs['step'] = 'any';
132 $type = $this->mParams
['type'];
140 public function getInputOOUI( $value ) {
141 if ( !$this->isPersistent() ) {
145 $attribs = $this->getTooltipAndAccessKeyOOUI();
147 if ( $this->mClass
!== '' ) {
148 $attribs['classes'] = [ $this->mClass
];
150 if ( $this->mPlaceholder
!== '' ) {
151 $attribs['placeholder'] = $this->mPlaceholder
;
154 # @todo Enforce pattern, step, required, readonly on the server side as
169 // Only used in OOUI mode:
175 $attribs +
= OOUI\Element
::configFromHtmlAttributes(
176 $this->getAttributes( $allowedParams )
179 // FIXME T150983 downgrade autocomplete
180 if ( isset( $attribs['autocomplete'] ) ) {
181 if ( $attribs['autocomplete'] === 'on' ) {
182 $attribs['autocomplete'] = true;
183 } elseif ( $attribs['autocomplete'] === 'off' ) {
184 $attribs['autocomplete'] = false;
186 unset( $attribs['autocomplete'] );
190 $type = $this->getType( $attribs );
191 if ( isset( $attribs['step'] ) && $attribs['step'] === 'any' ) {
192 $attribs['step'] = null;
195 return $this->getInputWidget( [
197 'name' => $this->mName
,
200 'dir' => $this->mDir
,
204 protected function getInputWidget( $params ) {
205 return new OOUI\
TextInputWidget( $params );
209 * Returns an array of data-* attributes to add to the field.
213 protected function getDataAttribs() {