Unify HTMLForm message handling
Improves Ida647973a which unified message handling for form fields but did not make the functionality available to HTMLForm itself. Change-Id: I2e6195ba13afbd8b993acb47409fab1be91c547e
This commit is contained in:
parent
bc4e07b6f6
commit
dab874cc22
5 changed files with 65 additions and 32 deletions
|
|
@ -382,6 +382,31 @@ class Message implements MessageSpecifier, Serializable {
|
|||
return new self( $key, $params );
|
||||
}
|
||||
|
||||
/**
|
||||
* Transform a MessageSpecifier or a primitive value used interchangeably with
|
||||
* specifiers (a message key string, or a key + params array) into a proper Message
|
||||
* @param string|array|MessageSpecifier $value
|
||||
* @return Message
|
||||
* @throws InvalidArgumentException
|
||||
*/
|
||||
public static function newFromSpecifier( $value ) {
|
||||
if ( $value instanceof RawMessage ) {
|
||||
$message = new RawMessage( $value->getKey(), $value->getParams() );
|
||||
} elseif ( $value instanceof MessageSpecifier ) {
|
||||
$message = new Message( $value );
|
||||
} elseif ( is_array( $value ) ) {
|
||||
$key = array_shift( $value );
|
||||
$message = new Message( $key, $value );
|
||||
} elseif ( is_string( $value ) ) {
|
||||
$message = new Message( $value );
|
||||
} else {
|
||||
throw new InvalidArgumentException( __METHOD__ . ': invalid argument type '
|
||||
. gettype( $value ) );
|
||||
}
|
||||
|
||||
return $message;
|
||||
}
|
||||
|
||||
/**
|
||||
* Factory function accepting multiple message keys and returning a message instance
|
||||
* for the first message which is non-empty. If all messages are empty then an
|
||||
|
|
|
|||
|
|
@ -1119,7 +1119,7 @@ class HTMLForm extends ContextSource {
|
|||
];
|
||||
|
||||
if ( isset( $button['label-message'] ) ) {
|
||||
$label = $this->msg( $button['label-message'] )->parse();
|
||||
$label = $this->getMessage( $button['label-message'] )->parse();
|
||||
} elseif ( isset( $button['label'] ) ) {
|
||||
$label = htmlspecialchars( $button['label'] );
|
||||
} elseif ( isset( $button['label-raw'] ) ) {
|
||||
|
|
@ -1198,17 +1198,10 @@ class HTMLForm extends ContextSource {
|
|||
$errorstr = '';
|
||||
|
||||
foreach ( $errors as $error ) {
|
||||
if ( is_array( $error ) ) {
|
||||
$msg = array_shift( $error );
|
||||
} else {
|
||||
$msg = $error;
|
||||
$error = [];
|
||||
}
|
||||
|
||||
$errorstr .= Html::rawElement(
|
||||
'li',
|
||||
[],
|
||||
$this->msg( $msg, $error )->parse()
|
||||
$this->getMessage( $error )->parse()
|
||||
);
|
||||
}
|
||||
|
||||
|
|
@ -1717,4 +1710,14 @@ class HTMLForm extends ContextSource {
|
|||
|
||||
return $this;
|
||||
}
|
||||
|
||||
/**
|
||||
* Turns a *-message parameter (which could be a MessageSpecifier, or a message name, or a
|
||||
* name + parameters array) into a Message.
|
||||
* @param mixed $value
|
||||
* @return Message
|
||||
*/
|
||||
protected function getMessage( $value ) {
|
||||
return Message::newFromSpecifier( $value )->setContext( $this );
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -1095,15 +1095,6 @@ abstract class HTMLFormField {
|
|||
* @return Message
|
||||
*/
|
||||
protected function getMessage( $value ) {
|
||||
if ( $value instanceof Message ) {
|
||||
return $value;
|
||||
} elseif ( $value instanceof MessageSpecifier ) {
|
||||
return Message::newFromKey( $value );
|
||||
} elseif ( is_array( $value ) ) {
|
||||
$msg = array_shift( $value );
|
||||
return $this->msg( $msg, $value );
|
||||
} else {
|
||||
return $this->msg( $value, [] );
|
||||
}
|
||||
return Message::newFromSpecifier( $value )->setContext( $this->mParent );
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -100,7 +100,7 @@ class OOUIHTMLForm extends HTMLForm {
|
|||
if ( $isBadIE ) {
|
||||
$label = $button['value'];
|
||||
} elseif ( isset( $button['label-message'] ) ) {
|
||||
$label = new OOUI\HtmlSnippet( $this->msg( $button['label-message'] )->parse() );
|
||||
$label = new OOUI\HtmlSnippet( $this->getMessage( $button['label-message'] )->parse() );
|
||||
} elseif ( isset( $button['label'] ) ) {
|
||||
$label = $button['label'];
|
||||
} elseif ( isset( $button['label-raw'] ) ) {
|
||||
|
|
@ -196,18 +196,7 @@ class OOUIHTMLForm extends HTMLForm {
|
|||
}
|
||||
|
||||
foreach ( $errors as &$error ) {
|
||||
if ( is_array( $error ) ) {
|
||||
$msg = array_shift( $error );
|
||||
} else {
|
||||
$msg = $error;
|
||||
$error = [];
|
||||
}
|
||||
// if the error is already a message object, don't use it as a message key
|
||||
if ( !$msg instanceof Message ) {
|
||||
$error = $this->msg( $msg, $error )->parse();
|
||||
} else {
|
||||
$error = $msg->parse();
|
||||
}
|
||||
$error = $this->getMessage( $error )->parse();
|
||||
$error = new OOUI\HtmlSnippet( $error );
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -581,4 +581,29 @@ class MessageTest extends MediaWikiLangTestCase {
|
|||
$msg = unserialize( serialize( $msg ) );
|
||||
$this->assertEquals( 'Hauptseite', $msg->plain() );
|
||||
}
|
||||
|
||||
/**
|
||||
* @covers Message::newFromSpecifier
|
||||
* @dataProvider provideNewFromSpecifier
|
||||
*/
|
||||
public function testNewFromSpecifier( $value, $expectedText ) {
|
||||
$message = Message::newFromSpecifier( $value );
|
||||
$this->assertInstanceOf( Message::class, $message );
|
||||
$this->assertSame( $expectedText, $message->text() );
|
||||
}
|
||||
|
||||
public function provideNewFromSpecifier() {
|
||||
$messageSpecifier = $this->getMockForAbstractClass( MessageSpecifier::class );
|
||||
$messageSpecifier->expects( $this->any() )->method( 'getKey' )->willReturn( 'mainpage' );
|
||||
$messageSpecifier->expects( $this->any() )->method( 'getParams' )->willReturn( [] );
|
||||
|
||||
return [
|
||||
'string' => [ 'mainpage', 'Main Page' ],
|
||||
'array' => [ [ 'youhavenewmessages', 'foo', 'bar' ], 'You have foo (bar).' ],
|
||||
'Message' => [ new Message( 'youhavenewmessages', [ 'foo', 'bar' ] ), 'You have foo (bar).' ],
|
||||
'RawMessage' => [ new RawMessage( 'foo ($1)', [ 'bar' ] ), 'foo (bar)' ],
|
||||
'MessageSpecifier' => [ $messageSpecifier, 'Main Page' ],
|
||||
];
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
|||
Loading…
Reference in a new issue