Convert Special:EmailUser to use OOUIHTMLForm
authorFlorian <florian.schmidt.stargatewissen@gmail.com>
Fri, 22 Jul 2016 15:41:17 +0000 (17:41 +0200)
committerVolker E <volker.e@wikimedia.org>
Tue, 16 Oct 2018 15:46:35 +0000 (08:46 -0700)
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

includes/specials/SpecialEmailuser.php

index 7de44d8..342f6db 100644 (file)
@@ -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( "<p class='error'>$1</p>", $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;
        }
 
        /**