From 8c77d1631715ee54a70a694f6b1b073333c13a9d Mon Sep 17 00:00:00 2001 From: Aaron Schulz Date: Thu, 3 Jul 2008 20:37:44 +0000 Subject: [PATCH] Make redirects work properly with flagging (bug 14714) --- docs/hooks.txt | 6 ++++++ includes/Article.php | 13 ++++++++++--- includes/Wiki.php | 24 +++++++++++++----------- 3 files changed, 29 insertions(+), 14 deletions(-) diff --git a/docs/hooks.txt b/docs/hooks.txt index de06b14ce5..ab7ccdc899 100644 --- a/docs/hooks.txt +++ b/docs/hooks.txt @@ -698,6 +698,12 @@ $page: ImagePage object &$file: File object &$displayFile: displayed File object +'InitializeArticleMaybeRedirect': MediaWiki check to see if title is a redirect +$title: Title object ($wgTitle) +$request: WebRequest +$ignoreRedirect: boolean to skip redirect check +$target: Title/string of redirect target + 'InitPreferencesForm': called at the end of PreferencesForm's constructor $form: the PreferencesForm $request: the web request to initialized from diff --git a/includes/Article.php b/includes/Article.php index fecc434f40..aa200d9f87 100644 --- a/includes/Article.php +++ b/includes/Article.php @@ -111,10 +111,18 @@ class Article { * * @return mixed false, Title of in-wiki target, or string with URL */ - function followRedirect() { + public function followRedirect() { $text = $this->getContent(); + return self::followRedirectText( $text ); + } + + /** + * Get the Title object this text redirects to + * + * @return mixed false, Title of in-wiki target, or string with URL + */ + public static function followRedirectText( $text ) { $rt = Title::newFromRedirect( $text ); - # process if title object is valid and not special:userlogout if( $rt ) { if( $rt->getInterwiki() != '' ) { @@ -144,7 +152,6 @@ class Article { return $rt; } } - // No or invalid redirect return false; } diff --git a/includes/Wiki.php b/includes/Wiki.php index a1bb307127..fa49290abb 100644 --- a/includes/Wiki.php +++ b/includes/Wiki.php @@ -43,7 +43,7 @@ class MediaWiki { * Initialization of ... everything * Performs the request too * - * @param $title Title + * @param $title Title ($wgTitle) * @param $article Article * @param $output OutputPage * @param $user User @@ -264,7 +264,7 @@ class MediaWiki { * Initialize the object to be known as $wgArticle for "standard" actions * Create an Article object for the page, following redirects if needed. * - * @param $title Title + * @param $title Title ($wgTitle) * @param $request WebRequest * @return mixed an Article, or a string to redirect to another URL */ @@ -280,18 +280,22 @@ class MediaWiki { // Check for redirects ... $file = $title->getNamespace() == NS_IMAGE ? $article->getFile() : null; if( ( $action == 'view' || $action == 'render' ) // ... for actions that show content - && !$request->getVal( 'oldid' ) && // ... and are not old revisions + && !$request->getVal( 'oldid' ) && // ... and are not old revisions $request->getVal( 'redirect' ) != 'no' && // ... unless explicitly told not to - // ... and the article is not an image page with associated file - !( is_object( $file ) && $file->exists() && - !$file->getRedirected() ) ) { // ... unless it is really an image redirect + // ... and the article is not a non-redirect image page with associated file + !( is_object( $file ) && $file->exists() && !$file->getRedirected() ) ) { + + # Give extensions a change to ignore/handle redirects as needed + $ignoreRedirect = $target = false; + wfRunHooks( 'InitializeArticleMaybeRedirect', array( &$title, &$request, &$ignoreRedirect, &$target ) ); $dbr = wfGetDB( DB_SLAVE ); $article->loadPageData( $article->pageDataFromTitle( $dbr, $title ) ); // Follow redirects only for... redirects - if( $article->isRedirect() ) { - $target = $article->followRedirect(); + if( !$ignoreRedirect && $article->isRedirect() ) { + # Is the target already set by an extension? + $target = $target ? $target : $article->followRedirect(); if( is_string( $target ) ) { if( !$this->getVal( 'DisableHardRedirects' ) ) { // we'll need to redirect @@ -303,9 +307,7 @@ class MediaWiki { // Rewrite environment to redirected article $rarticle = self::articleFromTitle( $target ); $rarticle->loadPageData( $rarticle->pageDataFromTitle( $dbr, $target ) ); - if ( $rarticle->getTitle()->exists() || - ( is_object( $file ) && - !$file->isLocal() ) ) { + if ( $rarticle->exists() || ( is_object( $file ) && !$file->isLocal() ) ) { $rarticle->setRedirectedFrom( $title ); $article = $rarticle; $title = $target; -- 2.20.1