From: Brad Jorsch Date: Thu, 9 Oct 2014 17:21:31 +0000 (-0400) Subject: HTMLForm: Improve hidden field handling X-Git-Tag: 1.31.0-rc.0~13648^2 X-Git-Url: http://git.cyclocoop.org/%22.%24h.%22?a=commitdiff_plain;h=8a58e69b46a7add29dbe1a885306034bf3fd4d08;p=lhc%2Fweb%2Fwiklou.git HTMLForm: Improve hidden field handling HTMLHiddenField is unable to output a non-default value, which makes it unsuitable for actually persisting changes across multiple form submissions. To preserve compatibility with forms that aren't expecting persistence, fixing this requires a new parameter in the field definition. Also, due to the unusual way that hidden fields are added to the HTML output, they are not being correctly handled by HTMLFormFieldCloner. Special-case that. Change-Id: I1fde7372401299b4432d28ac61982d47d5f3bbea --- diff --git a/includes/htmlform/HTMLFormFieldCloner.php b/includes/htmlform/HTMLFormFieldCloner.php index 029911cdde..5dadaf8f7d 100644 --- a/includes/htmlform/HTMLFormFieldCloner.php +++ b/includes/htmlform/HTMLFormFieldCloner.php @@ -276,6 +276,7 @@ class HTMLFormFieldCloner extends HTMLFormField { } $html = ''; + $hidden = ''; $hasLabel = false; $fields = $this->createFieldsForKey( $key ); @@ -283,11 +284,18 @@ class HTMLFormFieldCloner extends HTMLFormField { $v = ( empty( $field->mParams['nodata'] ) && $values !== null ) ? $values[$fieldname] : $field->getDefault(); - $html .= $field->$getFieldHtmlMethod( $v ); - $labelValue = trim( $field->getLabel() ); - if ( $labelValue != ' ' && $labelValue !== '' ) { - $hasLabel = true; + if ( $field instanceof HTMLHiddenField ) { + // HTMLHiddenField doesn't generate its own HTML + list( $name, $value, $params ) = $field->getHiddenFieldData( $v ); + $hidden .= Html::hidden( $name, $value, $params ) . "\n"; + } else { + $html .= $field->$getFieldHtmlMethod( $v ); + + $labelValue = trim( $field->getLabel() ); + if ( $labelValue != ' ' && $labelValue !== '' ) { + $hasLabel = true; + } } } @@ -335,6 +343,8 @@ class HTMLFormFieldCloner extends HTMLFormField { } } + $html .= $hidden; + if ( !empty( $this->mParams['row-legend'] ) ) { $legend = $this->msg( $this->mParams['row-legend'] )->text(); $html = Xml::fieldset( $legend, $html ); diff --git a/includes/htmlform/HTMLHiddenField.php b/includes/htmlform/HTMLHiddenField.php index e32c0bb2ce..ffde9151f2 100644 --- a/includes/htmlform/HTMLHiddenField.php +++ b/includes/htmlform/HTMLHiddenField.php @@ -1,22 +1,36 @@ mParams['output-as-default'] ) ) { + $this->outputAsDefault = (bool)$this->mParams['output-as-default']; + } + # Per HTML5 spec, hidden fields cannot be 'required' # http://www.w3.org/TR/html5/forms.html#hidden-state-%28type=hidden%29 unset( $this->mParams['required'] ); } - public function getTableRow( $value ) { + public function getHiddenFieldData( $value ) { $params = array(); if ( $this->mID ) { $params['id'] = $this->mID; } - $this->mParent->addHiddenField( $this->mName, $this->mDefault, $params ); + if ( $this->outputAsDefault ) { + $value = $this->mDefault; + } + + return array( $this->mName, $value, $params ); + } + public function getTableRow( $value ) { + list( $name, $value, $params ) = $this->getHiddenFieldData( $value ); + $this->mParent->addHiddenField( $name, $value, $params ); return ''; }