+ # TODO: Enforce pattern, step, required, readonly on the server side as
+ # well
+ foreach ( array( 'min', 'max', 'pattern', 'title', 'step',
+ 'placeholder' ) as $param ) {
+ if ( isset( $this->mParams[$param] ) ) {
+ $attribs[$param] = $this->mParams[$param];
+ }
+ }
+
+ foreach ( array( 'required', 'autofocus', 'multiple', 'readonly' ) as $param ) {
+ if ( isset( $this->mParams[$param] ) ) {
+ $attribs[$param] = '';
+ }
+ }
+
+ # 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 'email':
+ $attribs['type'] = 'email';
+ break;
+ case 'int':
+ $attribs['type'] = 'number';
+ break;
+ case 'float':
+ $attribs['type'] = 'number';
+ $attribs['step'] = 'any';
+ break;
+ # Pass through
+ case 'password':
+ case 'file':
+ $attribs['type'] = $this->mParams['type'];
+ break;
+ }
+ }
+
+ return Html::element( 'input', $attribs );
+ }
+
+ public function validate( $value, $alldata ) {
+ $p = parent::validate( $value, $alldata );
+
+ if ( $p !== true ) {
+ return $p;
+ }
+
+ if ( isset( $this->mParams['required'] ) && $value === '' ) {
+ return wfMsgExt( 'htmlform-required', 'parseinline' );
+ }
+
+ return true;
+ }
+}
+class HTMLTextAreaField extends HTMLFormField {
+ function getCols() {
+ return isset( $this->mParams['cols'] )
+ ? $this->mParams['cols']
+ : 80;
+ }
+
+ function getRows() {
+ return isset( $this->mParams['rows'] )
+ ? $this->mParams['rows']
+ : 25;
+ }
+
+ function getInputHTML( $value ) {
+ $attribs = array(
+ 'id' => $this->mID,
+ 'name' => $this->mName,
+ 'cols' => $this->getCols(),
+ 'rows' => $this->getRows(),
+ ) + $this->getTooltipAndAccessKey();
+
+
+ if ( !empty( $this->mParams['disabled'] ) ) {
+ $attribs['disabled'] = 'disabled';
+ }
+
+ if ( !empty( $this->mParams['readonly'] ) ) {
+ $attribs['readonly'] = 'readonly';
+ }
+
+ foreach ( array( 'required', 'autofocus' ) as $param ) {
+ if ( isset( $this->mParams[$param] ) ) {
+ $attribs[$param] = '';
+ }
+ }
+
+ return Html::element( 'textarea', $attribs, $value );