From: Florian Date: Fri, 22 Jul 2016 15:41:17 +0000 (+0200) Subject: Convert Special:EmailUser to use OOUIHTMLForm X-Git-Tag: 1.34.0-rc.0~3719^2 X-Git-Url: http://git.cyclocoop.org/data/%24self?a=commitdiff_plain;h=2abce6a65de98b62e1adda0bd0fd770ec9a1fe24;p=lhc%2Fweb%2Fwiklou.git Convert Special:EmailUser to use OOUIHTMLForm It already used HTMLForm for the main form, but the form, which asked for the username didn't. Converted the "Enter username" form to use HTMLForm and show it, if no user- name was passed to the form, show the main "Send e-mail" form, instead. Extra points: - Let HTMLForm::setSubmit*() function return it's own HTMLForm instance This basically is a squashed version of these changes: I6231577047c93781496e0f8af6809e2ef49e662a I3e0c02155428ae400bc3a6d3ed2e66e69ee441fa Bug: T117791 Change-Id: If8bf42b2bd092706f2e580083b2400121d35c41c --- diff --git a/includes/specials/SpecialEmailuser.php b/includes/specials/SpecialEmailuser.php index 7de44d8ae2..342f6db754 100644 --- a/includes/specials/SpecialEmailuser.php +++ b/includes/specials/SpecialEmailuser.php @@ -92,7 +92,6 @@ class SpecialEmailUser extends UnlistedSpecialPage { 'Text' => [ 'type' => 'textarea', 'rows' => 20, - 'cols' => 80, 'label-message' => 'emailmessage', 'required' => true, ], @@ -106,12 +105,16 @@ class SpecialEmailUser extends UnlistedSpecialPage { public function execute( $par ) { $out = $this->getOutput(); + $request = $this->getRequest(); $out->addModuleStyles( 'mediawiki.special' ); $this->mTarget = is_null( $par ) - ? $this->getRequest()->getVal( 'wpTarget', $this->getRequest()->getVal( 'target', '' ) ) + ? $request->getVal( 'wpTarget', $request->getVal( 'target', '' ) ) : $par; + // Make sure, that HTMLForm uses the correct target. + $request->setVal( 'wpTarget', $this->mTarget ); + // This needs to be below assignment of $this->mTarget because // getDescription() needs it to determine the correct page title. $this->setHeaders(); @@ -142,45 +145,22 @@ class SpecialEmailUser extends UnlistedSpecialPage { list( $title, $msg, $params ) = $error; throw new ErrorPageError( $title, $msg, $params ); } - // Got a valid target user name? Else ask for one. - $ret = self::getTarget( $this->mTarget, $this->getUser() ); - if ( !$ret instanceof User ) { - if ( $this->mTarget != '' ) { - // Messages used here: notargettext, noemailtext, nowikiemailtext - $ret = ( $ret == 'notarget' ) ? 'emailnotarget' : ( $ret . 'text' ); - $out->wrapWikiMsg( "

$1

", $ret ); - } - $out->addHTML( $this->userForm( $this->mTarget ) ); - - return; - } - - $this->mTargetObj = $ret; - - // Set the 'relevant user' in the skin, so it displays links like Contributions, - // User logs, UserRights, etc. - $this->getSkin()->setRelevantUser( $this->mTargetObj ); + // Make sure, that a submitted form isn't submitted to a subpage (which could be + // a non-existing username) $context = new DerivativeContext( $this->getContext() ); $context->setTitle( $this->getPageTitle() ); // Remove subpage - $form = new HTMLForm( $this->getFormFields(), $context ); - // By now we are supposed to be sure that $this->mTarget is a user name - $form->addPreText( $this->msg( 'emailpagetext', $this->mTarget )->parse() ); - $form->setSubmitTextMsg( 'emailsend' ); - $form->setSubmitCallback( [ __CLASS__, 'uiSubmit' ] ); - $form->setWrapperLegendMsg( 'email-legend' ); - $form->loadData(); - - if ( !Hooks::run( 'EmailUserForm', [ &$form ] ) ) { - return; - } - - $result = $form->show(); - - if ( $result === true || ( $result instanceof Status && $result->isGood() ) ) { - $out->setPageTitle( $this->msg( 'emailsent' ) ); - $out->addWikiMsg( 'emailsenttext', $this->mTarget ); - $out->returnToMain( false, $this->mTargetObj->getUserPage() ); + $this->setContext( $context ); + + // A little hack: HTMLForm will check $this->mTarget only, if the form was posted, not + // if the user opens Special:EmailUser/Florian (e.g.). So check, if the user did that + // and show the "Send email to user" form directly, if so. Show the "enter username" + // form, otherwise. + $this->mTargetObj = self::getTarget( $this->mTarget ); + if ( !$this->mTargetObj instanceof User ) { + $this->userForm( $this->mTarget ); + } else { + $this->sendEmailForm(); } } @@ -323,47 +303,63 @@ class SpecialEmailUser extends UnlistedSpecialPage { * @return string Form asking for user name. */ protected function userForm( $name ) { - $this->getOutput()->addModules( 'mediawiki.userSuggest' ); - $string = Html::openElement( - 'form', - [ 'method' => 'get', 'action' => wfScript(), 'id' => 'askusername' ] - ) . - Html::hidden( 'title', $this->getPageTitle()->getPrefixedText() ) . - Html::openElement( 'fieldset' ) . - Html::rawElement( 'legend', null, $this->msg( 'emailtarget' )->parse() ) . - Html::label( - $this->msg( 'emailusername' )->text(), - 'emailusertarget' - ) . "\u{00A0}" . - Html::input( - 'target', - $name, - 'text', - [ - 'id' => 'emailusertarget', - 'class' => 'mw-autocomplete-user', // used by mediawiki.userSuggest - 'autofocus' => true, - 'size' => 30, - ] - ) . - ' ' . - Html::submitButton( $this->msg( 'emailusernamesubmit' )->text(), [] ) . - Html::closeElement( 'fieldset' ) . - Html::closeElement( 'form' ) . "\n"; - - return $string; + $htmlForm = HTMLForm::factory( 'ooui', [ + 'Target' => [ + 'type' => 'user', + 'exists' => true, + 'label' => $this->msg( 'emailusername' )->text(), + 'id' => 'emailusertarget', + 'autofocus' => true, + 'value' => $name, + ] + ], $this->getContext() ); + + $htmlForm + ->setMethod( 'post' ) + ->setSubmitCallback( [ $this, 'sendEmailForm' ] ) + ->setFormIdentifier( 'userForm' ) + ->setSubmitProgressive() + ->setId( 'askusername' ) + ->setWrapperLegendMsg( 'emailtarget' ) + ->setSubmitTextMsg( 'emailusernamesubmit' ) + ->show(); } - /** - * Submit callback for an HTMLForm object, will simply call submit(). - * - * @since 1.20 - * @param array $data - * @param HTMLForm $form - * @return Status|bool - */ - public static function uiSubmit( array $data, HTMLForm $form ) { - return self::submit( $data, $form->getContext() ); + public function sendEmailForm() { + $out = $this->getOutput(); + + $ret = $this->mTargetObj; + if ( !$ret instanceof User ) { + if ( $this->mTarget != '' ) { + // Messages used here: notargettext, noemailtext, nowikiemailtext + $ret = ( $ret == 'notarget' ) ? 'emailnotarget' : ( $ret . 'text' ); + return Status::newFatal( $ret ); + } + return false; + } + + $htmlForm = HTMLForm::factory( 'ooui', $this->getFormFields(), $this->getContext() ); + // By now we are supposed to be sure that $this->mTarget is a user name + $htmlForm + ->addPreText( $this->msg( 'emailpagetext', $this->mTarget )->parse() ) + ->setSubmitTextMsg( 'emailsend' ) + ->setSubmitCallback( [ __CLASS__, 'submit' ] ) + ->setFormIdentifier( 'sendEmailForm' ) + ->setWrapperLegendMsg( 'email-legend' ) + ->loadData(); + + if ( !Hooks::run( 'EmailUserForm', [ &$htmlForm ] ) ) { + return false; + } + + $result = $htmlForm->show(); + + if ( $result === true || ( $result instanceof Status && $result->isGood() ) ) { + $out->setPageTitle( $this->msg( 'emailsent' ) ); + $out->addWikiMsg( 'emailsenttext', $this->mTarget ); + $out->returnToMain( false, $ret->getUserPage() ); + } + return true; } /**