HTMLFormField::getAttributes() is unfortunately reused both for generating HTML tag attributes and generating OOUI widget configuration. For boolean ones passing '' for true (empty string) works for HTML (where the attribute only has to be present), but not for OOUI (where the configuration option has to be truthy). It would be cleanest to pass true/false, which is the expected input for OOUI widgets and which the Html class handles intuitively, but it seems that these values often end up in the Xml class's methods instead (somebody remind me why do we even have that?). So let's play it safe and pass the name of the parameter instead, which is okay for both HTML/XML (both disabled="" and disabled="disabled" work the same) and OOUI widgets. (Note also that the whole thing relies on the default value of these boolean parameters/attributes being false.) This was not spotted before because we had hacks for this problem in all the important places. This commit reverts three such hacky patches that missed the underlying problem: *e25eb30ea8*70910cd13c*8a164ff9f9Change-Id: Ic6a1f3758cba62147f7fe8127cc0a83c695b0212
129 lines
2.8 KiB
PHP
129 lines
2.8 KiB
PHP
<?php
|
|
|
|
class HTMLTextField extends HTMLFormField {
|
|
function getSize() {
|
|
return isset( $this->mParams['size'] ) ? $this->mParams['size'] : 45;
|
|
}
|
|
|
|
function getSpellCheck() {
|
|
$val = isset( $this->mParams['spellcheck'] ) ? $this->mParams['spellcheck'] : null;
|
|
if ( is_bool( $val ) ) {
|
|
// "spellcheck" attribute literally requires "true" or "false" to work.
|
|
return $val === true ? 'true' : 'false';
|
|
}
|
|
return null;
|
|
}
|
|
|
|
function getInputHTML( $value ) {
|
|
$attribs = array(
|
|
'id' => $this->mID,
|
|
'name' => $this->mName,
|
|
'size' => $this->getSize(),
|
|
'value' => $value,
|
|
'dir' => $this->mDir,
|
|
'spellcheck' => $this->getSpellCheck(),
|
|
) + $this->getTooltipAndAccessKey();
|
|
|
|
if ( $this->mClass !== '' ) {
|
|
$attribs['class'] = $this->mClass;
|
|
}
|
|
|
|
# @todo Enforce pattern, step, required, readonly on the server side as
|
|
# well
|
|
$allowedParams = array(
|
|
'type',
|
|
'min',
|
|
'max',
|
|
'pattern',
|
|
'title',
|
|
'step',
|
|
'placeholder',
|
|
'list',
|
|
'maxlength',
|
|
'tabindex',
|
|
'disabled',
|
|
'required',
|
|
'autofocus',
|
|
'multiple',
|
|
'readonly'
|
|
);
|
|
|
|
$attribs += $this->getAttributes( $allowedParams );
|
|
|
|
# Extract 'type'
|
|
$type = $this->getType( $attribs );
|
|
return Html::input( $this->mName, $value, $type, $attribs );
|
|
}
|
|
|
|
protected function getType( &$attribs ) {
|
|
$type = isset( $attribs['type'] ) ? $attribs['type'] : 'text';
|
|
unset( $attribs['type'] );
|
|
|
|
# Implement tiny differences between some field variants
|
|
# here, rather than creating a new class for each one which
|
|
# is essentially just a clone of this one.
|
|
if ( isset( $this->mParams['type'] ) ) {
|
|
switch ( $this->mParams['type'] ) {
|
|
case 'int':
|
|
$type = 'number';
|
|
break;
|
|
case 'float':
|
|
$type = 'number';
|
|
$attribs['step'] = 'any';
|
|
break;
|
|
# Pass through
|
|
case 'email':
|
|
case 'password':
|
|
case 'file':
|
|
case 'url':
|
|
$type = $this->mParams['type'];
|
|
break;
|
|
}
|
|
}
|
|
|
|
return $type;
|
|
}
|
|
|
|
function getInputOOUI( $value ) {
|
|
$attribs = $this->getTooltipAndAccessKey();
|
|
|
|
if ( $this->mClass !== '' ) {
|
|
$attribs['classes'] = array( $this->mClass );
|
|
}
|
|
|
|
# @todo Enforce pattern, step, required, readonly on the server side as
|
|
# well
|
|
$allowedParams = array(
|
|
'autofocus',
|
|
'autosize',
|
|
'disabled',
|
|
'flags',
|
|
'indicator',
|
|
'maxlength',
|
|
'placeholder',
|
|
'readonly',
|
|
'required',
|
|
'tabindex',
|
|
'type',
|
|
);
|
|
|
|
$attribs += $this->getAttributes( $allowedParams, array(
|
|
'maxlength' => 'maxLength',
|
|
'readonly' => 'readOnly',
|
|
'tabindex' => 'tabIndex',
|
|
) );
|
|
|
|
$type = $this->getType( $attribs );
|
|
|
|
return $this->getInputWidget( array(
|
|
'id' => $this->mID,
|
|
'name' => $this->mName,
|
|
'value' => $value,
|
|
'type' => $type,
|
|
) + $attribs );
|
|
}
|
|
|
|
protected function getInputWidget( $params ) {
|
|
return new OOUI\TextInputWidget( $params );
|
|
}
|
|
}
|