* click handling code in JavaScript. Use a HTMLSubmitField if you merely
* wish to add a submit button to a form.
*
+ * Additional recognized configuration parameters include:
+ * - flags: OOUI flags for the button, see OOUI\\FlaggedElement
+ * - buttonlabel-message: Message to use for the button display text, instead
+ * of the value from 'default'. Overrides 'buttonlabel' and 'buttonlabel-raw'.
+ * - buttonlabel: Text to display for the button display text, instead
+ * of the value from 'default'. Overrides 'buttonlabel-raw'.
+ * - buttonlabel-raw: HTMLto display for the button display text, instead
+ * of the value from 'default'.
+ *
+ * Note that the buttonlabel parameters are not supported on IE6 and IE7 due to
+ * bugs in those browsers. If detected, they will be served buttons using the
+ * value of 'default' as the button label.
+ *
* @since 1.22
*/
class HTMLButtonField extends HTMLFormField {
protected $buttonType = 'button';
+ protected $buttonLabel = null;
/** @var array $mFlags Flags to add to OOUI Button widget */
protected $mFlags = array();
if ( isset( $info['flags'] ) ) {
$this->mFlags = $info['flags'];
}
+
+ # Generate the label from a message, if possible
+ if ( isset( $info['buttonlabel-message'] ) ) {
+ $msgInfo = $info['buttonlabel-message'];
+
+ if ( is_array( $msgInfo ) ) {
+ $msg = array_shift( $msgInfo );
+ } else {
+ $msg = $msgInfo;
+ $msgInfo = array();
+ }
+
+ $this->buttonLabel = $this->msg( $msg, $msgInfo )->parse();
+ } elseif ( isset( $info['buttonlabel'] ) ) {
+ if ( $info['buttonlabel'] === ' ' ) {
+ // Apparently some things set   directly and in an odd format
+ $this->buttonLabel = ' ';
+ } else {
+ $this->buttonLabel = htmlspecialchars( $info['buttonlabel'] );
+ }
+ } elseif ( isset( $info['buttonlabel-raw'] ) ) {
+ $this->buttonLabel = $info['buttonlabel-raw'];
+ }
+
parent::__construct( $info );
}
$attr = array(
'class' => 'mw-htmlform-submit ' . $this->mClass . $flags,
'id' => $this->mID,
+ 'type' => $this->buttonType,
+ 'name' => $this->mName,
+ 'value' => $value,
) + $this->getAttributes( array( 'disabled', 'tabindex' ) );
- return Html::input( $this->mName, $value, $this->buttonType, $attr );
+ if ( $this->isBadIE() ) {
+ return Html::element( 'input', $attr );
+ } else {
+ return Html::rawElement( 'button', $attr, $this->buttonLabel ?: htmlspecialchars( $value ) );
+ }
}
/**
return new OOUI\ButtonInputWidget( array(
'name' => $this->mName,
'value' => $value,
- 'label' => $value,
+ 'label' => !$this->isBadIE() && $this->buttonLabel
+ ? new OOUI\HtmlSnippet( $this->buttonLabel )
+ : $value,
'type' => $this->buttonType,
'classes' => array( 'mw-htmlform-submit', $this->mClass ),
'id' => $this->mID,
'flags' => $this->mFlags,
+ 'useInputTag' => $this->isBadIE(),
) + $this->getAttributes( array( 'disabled', 'tabindex' ), array( 'tabindex' => 'tabIndex' ) ) );
}
public function validate( $value, $alldata ) {
return true;
}
+
+ /**
+ * IE<8 has bugs with <button>, so we'll need to avoid them.
+ * @return bool Whether the request is from a bad version of IE
+ */
+ private function isBadIE() {
+ $request = $this->mParent
+ ? $this->mParent->getRequest()
+ : RequestContext::getMain()->getRequest();
+ return preg_match( '/MSIE [1-7]\./i', $request->getHeader( 'User-Agent' ) );
+ }
}
/**
* Add a button to the form
*
- * @param string $name Field name.
- * @param string $value Field value
- * @param string $id DOM id for the button (default: null)
- * @param array $attribs
- *
+ * @since 1.27 takes an array as shown. Earlier versions accepted
+ * 'name', 'value', 'id', and 'attribs' as separate parameters in that
+ * order.
+ * @note Custom labels ('label', 'label-message', 'label-raw') are not
+ * supported for IE6 and IE7 due to bugs in those browsers. If detected,
+ * they will be served buttons using 'value' as the button label.
+ * @param array $data Data to define the button:
+ * - name: (string) Button name.
+ * - value: (string) Button value.
+ * - label-message: (string, optional) Button label message key to use
+ * instead of 'value'. Overrides 'label' and 'label-raw'.
+ * - label: (string, optional) Button label text to use instead of
+ * 'value'. Overrides 'label-raw'.
+ * - label-raw: (string, optional) Button label HTML to use instead of
+ * 'value'.
+ * - id: (string, optional) DOM id for the button.
+ * - attribs: (array, optional) Additional HTML attributes.
+ * - flags: (string|string[], optional) OOUI flags.
* @return HTMLForm $this for chaining calls (since 1.20)
*/
- public function addButton( $name, $value, $id = null, $attribs = null ) {
- $this->mButtons[] = compact( 'name', 'value', 'id', 'attribs' );
+ public function addButton( $data ) {
+ if ( !is_array( $data ) ) {
+ $args = func_get_args();
+ if ( count( $args ) < 2 || count( $args ) > 4 ) {
+ throw new InvalidArgumentException(
+ 'Incorrect number of arguments for deprecated calling style'
+ );
+ }
+ $data = array(
+ 'name' => $args[0],
+ 'value' => $args[1],
+ 'id' => isset( $args[2] ) ? $args[2] : null,
+ 'attribs' => isset( $args[3] ) ? $args[3] : null,
+ );
+ } else {
+ if ( !isset( $data['name'] ) ) {
+ throw new InvalidArgumentException( 'A name is required' );
+ }
+ if ( !isset( $data['value'] ) ) {
+ throw new InvalidArgumentException( 'A value is required' );
+ }
+ }
+ $this->mButtons[] = $data + array(
+ 'id' => null,
+ 'attribs' => null,
+ 'flags' => null,
+ );
return $this;
}
) . "\n";
}
+ // IE<8 has bugs with <button>, so we'll need to avoid them.
+ $isBadIE = preg_match( '/MSIE [1-7]\./i', $this->getRequest()->getHeader( 'User-Agent' ) );
+
foreach ( $this->mButtons as $button ) {
$attrs = array(
'type' => 'submit',
'value' => $button['value']
);
+ if ( isset( $button['label-message'] ) ) {
+ $label = $this->msg( $button['label-message'] )->parse();
+ } elseif ( isset( $button['label'] ) ) {
+ $label = htmlspecialchars( $button['label'] );
+ } elseif ( isset( $button['label-raw'] ) ) {
+ $label = $button['label-raw'];
+ } else {
+ $label = htmlspecialchars( $button['value'] );
+ }
+
if ( $button['attribs'] ) {
$attrs += $button['attribs'];
}
$attrs['class'][] = 'mw-ui-button';
}
- $buttons .= Html::element( 'input', $attrs ) . "\n";
+ if ( $isBadIE ) {
+ $buttons .= Html::element( 'input', $attrs ) . "\n";
+ } else {
+ $buttons .= Html::rawElement( 'button', $attrs, $label ) . "\n";
+ }
}
$html = Html::rawElement( 'span',
function getButtons() {
$buttons = '';
+ // IE<8 has bugs with <button>, so we'll need to avoid them.
+ $isBadIE = preg_match( '/MSIE [1-7]\./i', $this->getRequest()->getHeader( 'User-Agent' ) );
+
if ( $this->mShowSubmit ) {
$attribs = array( 'infusable' => true );
$attribs['label'] = $this->getSubmitText();
$attribs['value'] = $this->getSubmitText();
$attribs['flags'] = $this->mSubmitFlags;
+ $attribs['useInputTag'] = $isBadIE;
$buttons .= new OOUI\ButtonInputWidget( $attribs );
}
$buttons .= new OOUI\ButtonInputWidget( array(
'type' => 'reset',
'label' => $this->msg( 'htmlform-reset' )->text(),
+ 'useInputTag' => $isBadIE,
) );
}
$attrs['id'] = $button['id'];
}
+ if ( $isBadIE ) {
+ $label = $button['value'];
+ } elseif ( isset( $button['label-message'] ) ) {
+ $label = new OOUI\HtmlSnippet( $this->msg( $button['label-message'] )->parse() );
+ } elseif ( isset( $button['label'] ) ) {
+ $label = $button['label'];
+ } elseif ( isset( $button['label-raw'] ) ) {
+ $label = new OOUI\HtmlSnippet( $button['label-raw'] );
+ } else {
+ $label = $button['value'];
+ }
+
$attrs['classes'] = isset( $attrs['class'] ) ? (array)$attrs['class'] : array();
$buttons .= new OOUI\ButtonInputWidget( array(
'type' => 'submit',
'name' => $button['name'],
'value' => $button['value'],
- 'label' => $button['value'],
+ 'label' => $label,
+ 'flags' => $button['flags'],
+ 'useInputTag' => $isBadIE,
) + $attrs );
}
? 'resetpass-submit-loggedin'
: 'resetpass_submit'
);
- $form->addButton( 'wpCancel', $this->msg( 'resetpass-submit-cancel' )->text() );
+ $form->addButton( array(
+ 'name' => 'wpCancel',
+ 'value' => $this->msg( 'resetpass-submit-cancel' )->text()
+ ) );
$form->setHeaderText( $this->msg( 'resetpass_text' )->parseAsBlock() );
if ( $this->mPreTextMessage instanceof Message ) {
$form->addPreText( $this->mPreTextMessage->parseAsBlock() );
$form = $this->getUploadForm( $warningHtml, $sessionKey, /* $hideIgnoreWarning */ true );
$form->setSubmitText( $this->msg( 'upload-tryagain' )->text() );
- $form->addButton( 'wpUploadIgnoreWarning', $this->msg( 'ignorewarning' )->text() );
- $form->addButton( 'wpCancelUpload', $this->msg( 'reuploaddesc' )->text() );
+ $form->addButton( array(
+ 'name' => 'wpUploadIgnoreWarning',
+ 'value' => $this->msg( 'ignorewarning' )->text()
+ ) );
+ $form->addButton( array(
+ 'name' => 'wpCancelUpload',
+ 'value' => $this->msg( 'reuploaddesc' )->text()
+ ) );
$this->showUploadForm( $form );