wiki.techinc.nl/includes/htmlform/fields/HTMLSelectOrOtherField.php
Prateek Saxena 820a18762f SelectWithInput: Add 'disabled' property on main widget
…also HTMLSelectAndOtherField and HTMLSelectOrOtherField now
pass the 'disabled' field when creating the input widget.

The OOUI versions of these HTMLFormFields would get enabled
right after infusion even they were disabled in PHP. This
makes sure that they remain disabled.

Change-Id: Iddd8ad81731dba7bdcb599d6fe104cb259b11733
2018-07-25 12:02:50 +05:30

164 lines
3.9 KiB
PHP

<?php
/**
* Select dropdown field, with an additional "other" textbox.
*
* HTMLComboboxField implements the same functionality using a single form field
* and should be used instead.
*/
class HTMLSelectOrOtherField extends HTMLTextField {
public function __construct( $params ) {
parent::__construct( $params );
$this->getOptions();
if ( !in_array( 'other', $this->mOptions, true ) ) {
$msg =
$params['other'] ?? wfMessage( 'htmlform-selectorother-other' )->text();
// Have 'other' always as first element
$this->mOptions = [ $msg => 'other' ] + $this->mOptions;
}
}
public function getInputHTML( $value ) {
$valInSelect = false;
if ( $value !== false ) {
$value = strval( $value );
$valInSelect = in_array(
$value, HTMLFormField::flattenOptions( $this->getOptions() ), true
);
}
$selected = $valInSelect ? $value : 'other';
$select = new XmlSelect( $this->mName, $this->mID, $selected );
$select->addOptions( $this->getOptions() );
$select->setAttribute( 'class', 'mw-htmlform-select-or-other' );
$tbAttribs = [ 'id' => $this->mID . '-other', 'size' => $this->getSize() ];
if ( !empty( $this->mParams['disabled'] ) ) {
$select->setAttribute( 'disabled', 'disabled' );
$tbAttribs['disabled'] = 'disabled';
}
if ( isset( $this->mParams['tabindex'] ) ) {
$select->setAttribute( 'tabindex', $this->mParams['tabindex'] );
$tbAttribs['tabindex'] = $this->mParams['tabindex'];
}
$select = $select->getHTML();
if ( isset( $this->mParams['maxlength'] ) ) {
$tbAttribs['maxlength'] = $this->mParams['maxlength'];
}
if ( $this->mClass !== '' ) {
$tbAttribs['class'] = $this->mClass;
}
$textbox = Html::input( $this->mName . '-other', $valInSelect ? '' : $value, 'text', $tbAttribs );
return "$select<br />\n$textbox";
}
protected function shouldInfuseOOUI() {
return true;
}
protected function getOOUIModules() {
return [ 'mediawiki.widgets.SelectWithInputWidget' ];
}
public function getInputOOUI( $value ) {
$this->mParent->getOutput()->addModuleStyles( 'mediawiki.widgets.SelectWithInputWidget.styles' );
$valInSelect = false;
if ( $value !== false ) {
$value = strval( $value );
$valInSelect = in_array(
$value, HTMLFormField::flattenOptions( $this->getOptions() ), true
);
}
# DropdownInput
$dropdownAttribs = [
'name' => $this->mName,
'options' => $this->getOptionsOOUI(),
'value' => $valInSelect ? $value : 'other',
'class' => [ 'mw-htmlform-select-or-other' ],
];
$allowedParams = [
'disabled',
'tabindex',
];
$dropdownAttribs += OOUI\Element::configFromHtmlAttributes(
$this->getAttributes( $allowedParams )
);
# TextInput
$textAttribs = [
'name' => $this->mName . '-other',
'size' => $this->getSize(),
'value' => $valInSelect ? '' : $value,
];
$allowedParams = [
'required',
'autofocus',
'multiple',
'disabled',
'tabindex',
'maxlength',
];
$textAttribs += OOUI\Element::configFromHtmlAttributes(
$this->getAttributes( $allowedParams )
);
if ( $this->mClass !== '' ) {
$textAttribs['classes'] = [ $this->mClass ];
}
if ( $this->mPlaceholder !== '' ) {
$textAttribs['placeholder'] = $this->mPlaceholder;
}
$disabled = false;
if ( isset( $this->mParams[ 'disabled' ] ) && $this->mParams[ 'disabled' ] ) {
$disabled = true;
}
return $this->getInputWidget( [
'id' => $this->mID,
'disabled' => $disabled,
'textinput' => $textAttribs,
'dropdowninput' => $dropdownAttribs,
'or' => true,
] );
}
public function getInputWidget( $params ) {
return new MediaWiki\Widget\SelectWithInputWidget( $params );
}
/**
* @param WebRequest $request
*
* @return string
*/
public function loadDataFromRequest( $request ) {
if ( $request->getCheck( $this->mName ) ) {
$val = $request->getText( $this->mName );
if ( $val === 'other' ) {
$val = $request->getText( $this->mName . '-other' );
}
return $val;
} else {
return $this->getDefault();
}
}
}