123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220 |
- <?php
- /**
- * <input> field.
- *
- * Besides the parameters recognized by HTMLFormField, the following are
- * recognized:
- * autocomplete - HTML autocomplete value (a boolean for on/off or a string according to
- * https://html.spec.whatwg.org/multipage/forms.html#autofill )
- */
- class HTMLTextField extends HTMLFormField {
- protected $mPlaceholder = '';
- /** @var bool HTML autocomplete attribute */
- protected $autocomplete;
- /**
- * @param array $params
- * - type: HTML textfield type
- * - size: field size in characters (defaults to 45)
- * - placeholder/placeholder-message: set HTML placeholder attribute
- * - spellcheck: set HTML spellcheck attribute
- * - persistent: upon unsuccessful requests, retain the value (defaults to true, except
- * for password fields)
- */
- public function __construct( $params ) {
- if ( isset( $params['autocomplete'] ) && is_bool( $params['autocomplete'] ) ) {
- $params['autocomplete'] = $params['autocomplete'] ? 'on' : 'off';
- }
- parent::__construct( $params );
- if ( isset( $params['placeholder-message'] ) ) {
- $this->mPlaceholder = $this->getMessage( $params['placeholder-message'] )->text();
- } elseif ( isset( $params['placeholder'] ) ) {
- $this->mPlaceholder = $params['placeholder'];
- }
- }
- public function getSize() {
- return $this->mParams['size'] ?? 45;
- }
- public function getSpellCheck() {
- $val = $this->mParams['spellcheck'] ?? null;
- if ( is_bool( $val ) ) {
- // "spellcheck" attribute literally requires "true" or "false" to work.
- return $val === true ? 'true' : 'false';
- }
- return null;
- }
- public function isPersistent() {
- if ( isset( $this->mParams['persistent'] ) ) {
- return $this->mParams['persistent'];
- }
- // don't put passwords into the HTML body, they could get cached or otherwise leaked
- return !( isset( $this->mParams['type'] ) && $this->mParams['type'] === 'password' );
- }
- public function getInputHTML( $value ) {
- if ( !$this->isPersistent() ) {
- $value = '';
- }
- $attribs = [
- 'id' => $this->mID,
- 'name' => $this->mName,
- 'size' => $this->getSize(),
- 'value' => $value,
- 'dir' => $this->mDir,
- 'spellcheck' => $this->getSpellCheck(),
- ] + $this->getTooltipAndAccessKey() + $this->getDataAttribs();
- if ( $this->mClass !== '' ) {
- $attribs['class'] = $this->mClass;
- }
- if ( $this->mPlaceholder !== '' ) {
- $attribs['placeholder'] = $this->mPlaceholder;
- }
- # @todo Enforce pattern, step, required, readonly on the server side as
- # well
- $allowedParams = [
- 'type',
- 'min',
- 'max',
- 'step',
- 'title',
- 'maxlength',
- 'tabindex',
- 'disabled',
- 'required',
- 'autofocus',
- 'readonly',
- 'autocomplete',
- // Only used in HTML mode:
- 'pattern',
- 'list',
- 'multiple',
- ];
- $attribs += $this->getAttributes( $allowedParams );
- # Extract 'type'
- $type = $this->getType( $attribs );
- return Html::input( $this->mName, $value, $type, $attribs );
- }
- protected function getType( &$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';
- $attribs['step'] = 1;
- break;
- case 'float':
- $type = 'number';
- $attribs['step'] = 'any';
- break;
- # Pass through
- case 'email':
- case 'password':
- case 'file':
- case 'url':
- $type = $this->mParams['type'];
- break;
- case 'textwithbutton':
- $type = $this->mParams['inputtype'] ?? 'text';
- break;
- }
- }
- return $type;
- }
- public function getInputOOUI( $value ) {
- if ( !$this->isPersistent() ) {
- $value = '';
- }
- $attribs = $this->getTooltipAndAccessKeyOOUI();
- if ( $this->mClass !== '' ) {
- $attribs['classes'] = [ $this->mClass ];
- }
- if ( $this->mPlaceholder !== '' ) {
- $attribs['placeholder'] = $this->mPlaceholder;
- }
- # @todo Enforce pattern, step, required, readonly on the server side as
- # well
- $allowedParams = [
- 'type',
- 'min',
- 'max',
- 'step',
- 'title',
- 'maxlength',
- 'tabindex',
- 'disabled',
- 'required',
- 'autofocus',
- 'readonly',
- 'autocomplete',
- // Only used in OOUI mode:
- 'autosize',
- 'flags',
- 'indicator',
- ];
- $attribs += OOUI\Element::configFromHtmlAttributes(
- $this->getAttributes( $allowedParams )
- );
- // FIXME T150983 downgrade autocomplete
- if ( isset( $attribs['autocomplete'] ) ) {
- if ( $attribs['autocomplete'] === 'on' ) {
- $attribs['autocomplete'] = true;
- } elseif ( $attribs['autocomplete'] === 'off' ) {
- $attribs['autocomplete'] = false;
- } else {
- unset( $attribs['autocomplete'] );
- }
- }
- $type = $this->getType( $attribs );
- if ( isset( $attribs['step'] ) && $attribs['step'] === 'any' ) {
- $attribs['step'] = null;
- }
- return $this->getInputWidget( [
- 'id' => $this->mID,
- 'name' => $this->mName,
- 'value' => $value,
- 'type' => $type,
- 'dir' => $this->mDir,
- ] + $attribs );
- }
- protected function getInputWidget( $params ) {
- return new OOUI\TextInputWidget( $params );
- }
- /**
- * Returns an array of data-* attributes to add to the field.
- *
- * @return array
- */
- protected function getDataAttribs() {
- return [];
- }
- }
|