Update HTMLForm for upcoming Special:Upload rewrite.

* Add support for edittools
* Add support for multipart/form-data
* Set id for wpEditToken
* Add support for tooltip and accesskey
* Allow setting a name for the submit button
* Give sections an id
This commit is contained in:
Bryan Tong Minh 2009-10-18 19:29:35 +00:00
parent b01db28d88
commit 918171cef4
2 changed files with 96 additions and 24 deletions

View file

@ -63,6 +63,7 @@ class HTMLForm {
'selectorother' => 'HTMLSelectOrOtherField',
'submit' => 'HTMLSubmitField',
'hidden' => 'HTMLHiddenField',
'edittools' => 'HTMLEditTools',
# HTMLTextField will output the correct type="" attribute automagically.
# There are about four zillion other HTML 5 input types, like url, but
@ -83,11 +84,15 @@ class HTMLForm {
protected $mPre = '';
protected $mHeader = '';
protected $mPost = '';
protected $mId;
protected $mSubmitID;
protected $mSubmitName;
protected $mSubmitText;
protected $mSubmitTooltip;
protected $mTitle;
protected $mUseMultipart = false;
protected $mHiddenFields = array();
protected $mButtons = array();
@ -112,6 +117,9 @@ class HTMLForm {
$info['name'] = $fieldname;
if ( isset( $info['type'] ) && $info['type'] == 'file' )
$this->mUseMultipart = true;
$field = self::loadInputFromParameters( $info );
$field->mParent = $this;
@ -287,8 +295,8 @@ class HTMLForm {
$this->mHiddenFields[ $name ] = $value;
}
public function addButton( $name, $value, $id=null ){
$this->mButtons[] = compact( 'name', 'value', 'id' );
public function addButton( $name, $value, $id=null, $attribs=null ){
$this->mButtons[] = compact( 'name', 'value', 'id', 'attribs' );
}
/**
@ -327,19 +335,24 @@ class HTMLForm {
function wrapForm( $html ) {
# Include a <fieldset> wrapper for style, if requested.
if( $this->mWrapperLegend !== false ){
if ( $this->mWrapperLegend !== false ){
$html = Xml::fieldset( $this->mWrapperLegend, $html );
}
return Html::rawElement(
'form',
array(
'action' => $this->getTitle()->getFullURL(),
'method' => 'post',
'class' => 'visualClear',
),
$html
# Use multipart/form-data
$encType = $this->mUseMultipart
? 'multipart/form-data'
: 'application/x-www-form-urlencoded';
# Attributes
$attribs = array(
'action' => $this->getTitle()->getFullURL(),
'method' => 'post',
'class' => 'visualClear',
'enctype' => $encType,
);
if ( !empty( $this->mId ) )
$attribs['id'] = $this->mId;
return Html::rawElement( 'form', $attribs, $html );
}
/**
@ -350,7 +363,7 @@ class HTMLForm {
global $wgUser;
$html = '';
$html .= Html::hidden( 'wpEditToken', $wgUser->editToken() ) . "\n";
$html .= Html::hidden( 'wpEditToken', $wgUser->editToken(), array( 'id' => 'wpEditToken' ) ) . "\n";
$html .= Html::hidden( 'title', $this->getTitle() ) . "\n";
foreach( $this->mHiddenFields as $name => $value ){
@ -371,6 +384,12 @@ class HTMLForm {
if ( isset( $this->mSubmitID ) )
$attribs['id'] = $this->mSubmitID;
if ( isset( $this->mSubmitName ) )
$attribs['name'] = $this->mSubmitName;
if ( isset( $this->mSubmitTooltip ) ) {
global $wgUser;
$attribs += $wgUser->getSkin()->tooltipAndAccessKeyAttribs( $this->mSubmitTooltip );
}
$attribs['class'] = 'mw-htmlform-submit';
@ -392,6 +411,8 @@ class HTMLForm {
'name' => $button['name'],
'value' => $button['value']
);
if ( $button['attribs'] )
$attrs += $button['attribs'];
if( isset( $button['id'] ) )
$attrs['id'] = $button['id'];
$html .= Html::element( 'input', $attrs );
@ -467,6 +488,15 @@ class HTMLForm {
? $this->mSubmitText
: wfMsg( 'htmlform-submit' );
}
public function setSubmitName( $name ) {
$this->mSubmitName = $name;
}
public function setSubmitTooltip( $name ) {
$this->mSubmitTooltip = $name;
}
/**
* Set the id for the submit button.
@ -476,6 +506,9 @@ class HTMLForm {
$this->mSubmitID = $t;
}
public function setId( $id ) {
$this->mId = $id;
}
/**
* Prompt the whole form to be wrapped in a <fieldset>, with
* this text as its <legend> element.
@ -514,7 +547,7 @@ class HTMLForm {
* TODO: Document
* @param $fields
*/
function displaySection( $fields ) {
function displaySection( $fields, $sectionName = '' ) {
$tableHtml = '';
$subsectionHtml = '';
$hasLeftColumn = false;
@ -529,7 +562,7 @@ class HTMLForm {
if( $value->getLabel() != '&nbsp;' )
$hasLeftColumn = true;
} elseif ( is_array( $value ) ) {
$section = $this->displaySection( $value );
$section = $this->displaySection( $value, $key );
$legend = wfMsg( "{$this->mMessagePrefix}-$key" );
$subsectionHtml .= Xml::fieldset( $legend, $section ) . "\n";
}
@ -538,9 +571,13 @@ class HTMLForm {
$classes = array();
if( !$hasLeftColumn ) // Avoid strange spacing when no labels exist
$classes[] = 'mw-htmlform-nolabel';
$classes = implode( ' ', $classes );
$attribs = array(
'classes' => implode( ' ', $classes ),
);
if ( $sectionName )
$attribs['id'] = Sanitizer::escapeId( "mw-htmlform-$sectionName" );
$tableHtml = Html::rawElement( 'table', array( 'class' => $classes ),
$tableHtml = Html::rawElement( 'table', $attribs,
Html::rawElement( 'tbody', array(), "\n$tableHtml\n" ) ) . "\n";
return $subsectionHtml . "\n" . $tableHtml;
@ -791,6 +828,19 @@ abstract class HTMLFormField {
return null;
}
}
/**
* Returns the attributes required for the tooltip and accesskey.
*
* @return array Attributes
*/
public function getTooltipAndAccessKey() {
if ( empty( $this->mParams['tooltip'] ) )
return array();
global $wgUser;
return $wgUser->getSkin()->tooltipAndAccessKeyAttribs();
}
/**
* flatten an array of options to a single array, for instance,
@ -812,6 +862,7 @@ abstract class HTMLFormField {
return $flatOpts;
}
}
class HTMLTextField extends HTMLFormField {
@ -829,7 +880,7 @@ class HTMLTextField extends HTMLFormField {
'name' => $this->mName,
'size' => $this->getSize(),
'value' => $value,
);
) + $this->getTooltipAndAccessKey();
if ( isset( $this->mParams['maxlength'] ) ) {
$attribs['maxlength'] = $this->mParams['maxlength'];
@ -908,7 +959,7 @@ class HTMLTextAreaField extends HTMLFormField {
'name' => $this->mName,
'cols' => $this->getCols(),
'rows' => $this->getRows(),
);
) + $this->getTooltipAndAccessKey();
if ( !empty( $this->mParams['disabled'] ) ) {
@ -996,7 +1047,8 @@ class HTMLCheckField extends HTMLFormField {
if ( !empty( $this->mParams['invert'] ) )
$value = !$value;
$attr = array( 'id' => $this->mID );
$attr = $this->getTooltipAndAccessKey();
$attr['id'] = $this->mID;
if( !empty( $this->mParams['disabled'] ) ) {
$attr['disabled'] = 'disabled';
}
@ -1329,9 +1381,22 @@ class HTMLSubmitField extends HTMLFormField {
$this->mParent->addButton(
$this->mParams['name'],
$this->mParams['default'],
isset($this->mParams['id']) ? $this->mParams['id'] : null
isset($this->mParams['id']) ? $this->mParams['id'] : null,
$this->getTooltipAndAccessKey()
);
}
public function getInputHTML( $value ){ return ''; }
}
class HTMLEditTools extends HTMLFormField {
public function getInputHTML( $value ) {
return '';
}
public function getTableRow( $value ) {
return "<tr><td></td><td class=\"mw-input\">"
. '<div class="mw-editTools">'
. wfMsgForContent( 'edittools' )
. "</div></td></tr>\n";
}
}

View file

@ -1938,9 +1938,9 @@ class Linker {
}
/**
* @deprecated Returns raw bits of HTML, use titleAttrib() and accesskey()
* Returns the attributes for the tooltip and access key
*/
public function tooltipAndAccesskey( $name ) {
public function tooltipAndAccesskeyAttribs( $name ) {
global $wgEnableTooltipsAndAccesskeys;
if ( !$wgEnableTooltipsAndAccesskeys )
return '';
@ -1957,8 +1957,15 @@ class Linker {
if ( $attribs['accesskey'] === false ) {
unset( $attribs['accesskey'] );
}
return Xml::expandAttributes( $attribs );
return $attribs;
}
/**
* @deprecated Returns raw bits of HTML, use titleAttrib() and accesskey()
*/
public function tooltipAndAccesskey( $name ) {
return Xml::expandAttributes( $this->tooltipAndAccesskeyAttribs( $name ) );
}
/** @deprecated Returns raw bits of HTML, use titleAttrib() */
public function tooltip( $name, $options = null ) {