Make UserNotLoggedIn redirect to login page
[lhc/web/wiklou.git] / includes / exception / UserNotLoggedIn.php
index 9d89009..03ba0b2 100644 (file)
  */
 
 /**
- * Shows a generic "user is not logged in" error page.
+ * Redirect a user to the login page
  *
  * This is essentially an ErrorPageError exception which by default uses the
  * 'exception-nologin' as a title and 'exception-nologin-text' for the message.
- * @see bug 37627
- * @since 1.20
+ *
+ * @note In order for this exception to redirect, the error message passed to the
+ * constructor has to be explicitly added to LoginForm::validErrorMessages. Otherwise,
+ * the user will just be shown the message rather than redirected.
  *
  * @par Example:
  * @code
  * }
  * @endcode
  *
+ * @see bug 37627
+ * @since 1.20
  * @ingroup Exception
  */
 class UserNotLoggedIn extends ErrorPageError {
 
        /**
+        * @note The value of the $reasonMsg parameter must be put into LoginForm::validErrorMessages
+        * if you want the user to be automatically redirected to the login form.
+        *
         * @param string $reasonMsg A message key containing the reason for the error.
         *        Optional, default: 'exception-nologin-text'
         * @param string $titleMsg A message key to set the page title.
@@ -62,4 +69,34 @@ class UserNotLoggedIn extends ErrorPageError {
        ) {
                parent::__construct( $titleMsg, $reasonMsg, $params );
        }
+
+       /**
+        * Redirect to Special:Userlogin if the specified message is compatible. Otherwise,
+        * show an error page as usual.
+        */
+       public function report() {
+               // If an unsupported message is used, don't try redirecting to Special:Userlogin,
+               // since the message may not be compatible.
+               if ( !in_array( $this->msg, LoginForm::$validErrorMessages ) ) {
+                       parent::report();
+               }
+
+               // Message is valid. Redirec to Special:Userlogin
+
+               $context = RequestContext::getMain();
+
+               $output = $context->getOutput();
+               $query = $context->getRequest()->getValues();
+               // Title will be overridden by returnto
+               unset( $query['title'] );
+               // Redirect to Special:Userlogin
+               $output->redirect( SpecialPage::getTitleFor( 'Userlogin' )->getFullURL( array(
+                       // Return to this page when the user logs in
+                       'returnto' => $context->getTitle()->getFullText(),
+                       'returntoquery' => wfArrayToCgi( $query ),
+                       'warning' => $this->msg,
+               ) ) );
+
+               $output->output();
+       }
 }