MediaWiki REL1_34
HTMLTextField.php
Go to the documentation of this file.
1<?php
2
12 protected $mPlaceholder = '';
13
15 protected $autocomplete;
16
26 public function __construct( $params ) {
27 if ( isset( $params['autocomplete'] ) && is_bool( $params['autocomplete'] ) ) {
28 $params['autocomplete'] = $params['autocomplete'] ? 'on' : 'off';
29 }
30
31 parent::__construct( $params );
32
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'];
37 }
38 }
39
40 public function getSize() {
41 return $this->mParams['size'] ?? 45;
42 }
43
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';
49 }
50 return null;
51 }
52
53 public function isPersistent() {
54 if ( isset( $this->mParams['persistent'] ) ) {
55 return $this->mParams['persistent'];
56 }
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' );
59 }
60
61 public function getInputHTML( $value ) {
62 if ( !$this->isPersistent() ) {
63 $value = '';
64 }
65
66 $attribs = [
67 'id' => $this->mID,
68 'name' => $this->mName,
69 'size' => $this->getSize(),
70 'value' => $value,
71 'dir' => $this->mDir,
72 'spellcheck' => $this->getSpellCheck(),
73 ] + $this->getTooltipAndAccessKey() + $this->getDataAttribs();
74
75 if ( $this->mClass !== '' ) {
76 $attribs['class'] = $this->mClass;
77 }
78 if ( $this->mPlaceholder !== '' ) {
79 $attribs['placeholder'] = $this->mPlaceholder;
80 }
81
82 # @todo Enforce pattern, step, required, readonly on the server side as
83 # well
84 $allowedParams = [
85 'type',
86 'min',
87 'max',
88 'step',
89 'title',
90 'maxlength',
91 'tabindex',
92 'disabled',
93 'required',
94 'autofocus',
95 'readonly',
96 'autocomplete',
97 // Only used in HTML mode:
98 'pattern',
99 'list',
100 'multiple',
101 ];
102
103 $attribs += $this->getAttributes( $allowedParams );
104
105 # Extract 'type'
106 $type = $this->getType( $attribs );
107 return Html::input( $this->mName, $value, $type, $attribs );
108 }
109
110 protected function getType( &$attribs ) {
111 $type = $attribs['type'] ?? 'text';
112 unset( $attribs['type'] );
113
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'] ) {
119 case 'int':
120 $type = 'number';
121 $attribs['step'] = 1;
122 break;
123 case 'float':
124 $type = 'number';
125 $attribs['step'] = 'any';
126 break;
127 # Pass through
128 case 'email':
129 case 'password':
130 case 'file':
131 case 'url':
132 $type = $this->mParams['type'];
133 break;
134 case 'textwithbutton':
135 $type = $this->mParams['inputtype'] ?? 'text';
136 break;
137 }
138 }
139
140 return $type;
141 }
142
143 public function getInputOOUI( $value ) {
144 if ( !$this->isPersistent() ) {
145 $value = '';
146 }
147
148 $attribs = $this->getTooltipAndAccessKeyOOUI();
149
150 if ( $this->mClass !== '' ) {
151 $attribs['classes'] = [ $this->mClass ];
152 }
153 if ( $this->mPlaceholder !== '' ) {
154 $attribs['placeholder'] = $this->mPlaceholder;
155 }
156
157 # @todo Enforce pattern, step, required, readonly on the server side as
158 # well
159 $allowedParams = [
160 'type',
161 'min',
162 'max',
163 'step',
164 'title',
165 'maxlength',
166 'tabindex',
167 'disabled',
168 'required',
169 'autofocus',
170 'readonly',
171 'autocomplete',
172 // Only used in OOUI mode:
173 'autosize',
174 'flags',
175 'indicator',
176 ];
177
178 $attribs += OOUI\Element::configFromHtmlAttributes(
179 $this->getAttributes( $allowedParams )
180 );
181
182 // FIXME T150983 downgrade autocomplete
183 if ( isset( $attribs['autocomplete'] ) ) {
184 if ( $attribs['autocomplete'] === 'on' ) {
185 $attribs['autocomplete'] = true;
186 } elseif ( $attribs['autocomplete'] === 'off' ) {
187 $attribs['autocomplete'] = false;
188 } else {
189 unset( $attribs['autocomplete'] );
190 }
191 }
192
193 $type = $this->getType( $attribs );
194 if ( isset( $attribs['step'] ) && $attribs['step'] === 'any' ) {
195 $attribs['step'] = null;
196 }
197
198 return $this->getInputWidget( [
199 'id' => $this->mID,
200 'name' => $this->mName,
201 'value' => $value,
202 'type' => $type,
203 'dir' => $this->mDir,
204 ] + $attribs );
205 }
206
207 protected function getInputWidget( $params ) {
208 return new OOUI\TextInputWidget( $params );
209 }
210
216 protected function getDataAttribs() {
217 return [];
218 }
219}
The parent class to generate form fields.
getMessage( $value)
Turns a *-message parameter (which could be a MessageSpecifier, or a message name,...
getTooltipAndAccessKeyOOUI()
Returns the attributes required for the tooltip and accesskey, for OOUI widgets' config.
getAttributes(array $list)
Returns the given attributes from the parameters.
getTooltipAndAccessKey()
Returns the attributes required for the tooltip and accesskey, for Html::element() etc.
<input> field.
getInputHTML( $value)
This function must be implemented to return the HTML to generate the input object itself.
getInputWidget( $params)
getInputOOUI( $value)
Same as getInputHTML, but returns an OOUI object.
getType(&$attribs)
__construct( $params)
getDataAttribs()
Returns an array of data-* attributes to add to the field.
bool $autocomplete
HTML autocomplete attribute.