summaryrefslogtreecommitdiff
path: root/www/wiki/includes/htmlform/fields/HTMLTextField.php
diff options
context:
space:
mode:
Diffstat (limited to 'www/wiki/includes/htmlform/fields/HTMLTextField.php')
-rw-r--r--www/wiki/includes/htmlform/fields/HTMLTextField.php206
1 files changed, 206 insertions, 0 deletions
diff --git a/www/wiki/includes/htmlform/fields/HTMLTextField.php b/www/wiki/includes/htmlform/fields/HTMLTextField.php
new file mode 100644
index 00000000..b2e4f2a5
--- /dev/null
+++ b/www/wiki/includes/htmlform/fields/HTMLTextField.php
@@ -0,0 +1,206 @@
+<?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 isset( $this->mParams['size'] ) ? $this->mParams['size'] : 45;
+ }
+
+ public 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;
+ }
+
+ 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',
+ 'pattern',
+ 'title',
+ 'step',
+ 'list',
+ 'maxlength',
+ 'tabindex',
+ 'disabled',
+ 'required',
+ 'autofocus',
+ 'multiple',
+ 'readonly',
+ 'autocomplete',
+ ];
+
+ $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;
+ }
+
+ 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 = [
+ 'autofocus',
+ 'autosize',
+ 'disabled',
+ 'flags',
+ 'indicator',
+ 'maxlength',
+ 'readonly',
+ 'required',
+ 'tabindex',
+ 'type',
+ 'autocomplete',
+ ];
+
+ $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 );
+
+ 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 [];
+ }
+}