From: Bartosz Dziewoński Date: Tue, 28 Jul 2015 21:53:49 +0000 (+0200) Subject: OOUIHTMLForm: Display errors in a nicer way, part 1 X-Git-Tag: 1.31.0-rc.0~10321 X-Git-Url: https://git.cyclocoop.org/%242?a=commitdiff_plain;h=4ea3974e0c1a59c59d344026ee236bf104364f6c;p=lhc%2Fweb%2Fwiklou.git OOUIHTMLForm: Display errors in a nicer way, part 1 Depends on Ie14a35fac70d62ff7d102caaa56654ebde11d7dd in OOUI. Part 2 follows after some cleanup in intermediary commits in Ifbf38878d41906184f97169b22002f788711a311. As a bonus, HTMLFormField::getOOUI() now always produces a OOUI\FieldLayout in OOUI mode. This will let us clean up some code where we had to take errors HTML from HTMLForm (I91af6efa8762e9676efea532381292e221255862). Bug: T98894 Change-Id: I860a96858c4fcac62d63b46e35a9153f22c0a9c9 --- diff --git a/includes/htmlform/HTMLFormField.php b/includes/htmlform/HTMLFormField.php index 1d8137ef87..0fab033dce 100644 --- a/includes/htmlform/HTMLFormField.php +++ b/includes/htmlform/HTMLFormField.php @@ -558,23 +558,25 @@ abstract class HTMLFormField { * * @param string $value The value to set the input to. * - * @return string + * @return OOUI\\FieldLayout|OOUI\\ActionFieldLayout */ public function getOOUI( $value ) { - list( $errors, $errorClass ) = $this->getErrorsAndErrorClass( $value ); - $inputField = $this->getInputOOUI( $value ); if ( !$inputField ) { - // This field doesn't have an OOUI implementation yet at all. - // OK, use this trick: - return $this->getDiv( $value ); + // This field doesn't have an OOUI implementation yet at all. Fall back to getDiv() to + // generate the whole field, label and errors and all, then wrap it in a Widget. + // It might look weird, but it'll work OK. + return $this->getFieldLayoutOOUI( + new OOUI\Widget( array( 'content' => new OOUI\HtmlSnippet( $this->getDiv( $value ) ) ) ), + array( 'infusable' => false ) + ); } $infusable = true; if ( is_string( $inputField ) ) { - // Mmm… We have an OOUI implementation, but it's not complete, and we got a load of HTML. - // Cheat a little and wrap it in a widget! It won't be infusable, though, since client-side + // We have an OOUI implementation, but it's not proper, and we got a load of HTML. + // Cheat a little and wrap it in a widget. It won't be infusable, though, since client-side // JavaScript doesn't know how to rebuilt the contents. $inputField = new OOUI\Widget( array( 'content' => new OOUI\HtmlSnippet( $inputField ) ) ); $infusable = false; @@ -582,16 +584,21 @@ abstract class HTMLFormField { $fieldType = get_class( $this ); $helpText = $this->getHelpText(); + $errors = $this->getErrorsRaw( $value ); + foreach ( $errors as &$error ) { + $error = new OOUI\HtmlSnippet( $error ); + } + $config = array( - 'classes' => array( "mw-htmlform-field-$fieldType", $this->mClass, $errorClass ), + 'classes' => array( "mw-htmlform-field-$fieldType", $this->mClass ), 'align' => $this->getLabelAlignOOUI(), 'label' => $this->getLabel(), 'help' => $helpText !== null ? new OOUI\HtmlSnippet( $helpText ) : null, + 'errors' => $errors, 'infusable' => $infusable, ); - $field = $this->getFieldLayoutOOUI( $inputField, $config ); - return $field . $errors; + return $this->getFieldLayoutOOUI( $inputField, $config ); } /** @@ -778,7 +785,7 @@ abstract class HTMLFormField { * @since 1.20 * * @param string $value The value of the input - * @return array + * @return array array( $errors, $errorClass ) */ public function getErrorsAndErrorClass( $value ) { $errors = $this->validate( $value, $this->mParent->mFieldData ); @@ -794,6 +801,32 @@ abstract class HTMLFormField { return array( $errors, $errorClass ); } + /** + * Determine form errors to display, returning them in an array. + * + * @since 1.26 + * @param string $value The value of the input + * @return string[] Array of error HTML strings + */ + public function getErrorsRaw( $value ) { + $errors = $this->validate( $value, $this->mParent->mFieldData ); + + if ( is_bool( $errors ) || !$this->mParent->wasSubmitted() ) { + $errors = array(); + } + + if ( !is_array( $errors ) ) { + $errors = array( $errors ); + } + foreach ( $errors as &$error ) { + if ( $error instanceof Message ) { + $error = $error->parse(); + } + } + + return $errors; + } + /** * @return string */ diff --git a/includes/htmlform/OOUIHTMLForm.php b/includes/htmlform/OOUIHTMLForm.php index eec13eeb9b..b5547f64ca 100644 --- a/includes/htmlform/OOUIHTMLForm.php +++ b/includes/htmlform/OOUIHTMLForm.php @@ -104,6 +104,15 @@ class OOUIHTMLForm extends HTMLForm { return $html; } + /** + * @param string|array|Status $errors + * @return string + */ + function getErrors( $errors ) { + // TODO Write me! + return ''; + } + function getBody() { $fieldset = parent::getBody(); // FIXME This only works for forms with no subsections