From d0f249e16808feda4d6658fad1ea75114481778c Mon Sep 17 00:00:00 2001 From: Tobias Date: Mon, 21 Sep 2009 19:21:12 +0000 Subject: [PATCH] New configuration variable $wgShowPageOnRedlink that can be set to show the page instead of an edit interface when visiting a red link. The value can be specified for specific usergroups and namespaces. --- RELEASE-NOTES | 3 +++ includes/DefaultSettings.php | 13 ++++++++++ includes/EditPage.php | 50 +++++++++++++++++++++++++++++++----- 3 files changed, 60 insertions(+), 6 deletions(-) diff --git a/RELEASE-NOTES b/RELEASE-NOTES index 03954642ad..c96dd68e9b 100644 --- a/RELEASE-NOTES +++ b/RELEASE-NOTES @@ -239,6 +239,9 @@ it from source control: http://www.mediawiki.org/wiki/Download_from_SVN the root permission effectively grants all other permissions on a wiki. Useful for debugging and administration. * (bug 16979) Tracking categories for __INDEX__ and __NOINDEX__ +* New configuration variable $wgShowPageOnRedlink that can be set to show the page + instead of an edit interface when visiting a red link. The value can be specified + for specific usergroups and namespaces. === Bug fixes in 1.16 === diff --git a/includes/DefaultSettings.php b/includes/DefaultSettings.php index fa30f3e036..843cafc5c7 100644 --- a/includes/DefaultSettings.php +++ b/includes/DefaultSettings.php @@ -4269,3 +4269,16 @@ $wgUploadMaintenance = false; * Use old names for change_tags indices. */ $wgOldChangeTagsIndex = false; + +/** + * View page instead of edit interface when visiting a red link + * There are three ways to define this variable: + * 1. Set $wgShowPageOnRedlink to true (false is default) + * 2. Set $wgShowPageOnRedlink['usergroup'] to false. If a user is member of at least one usergroup for which the variable + * has been set to false, the edit interface will be shown. Otherwise the page is shown. + * 3. Set $wgShowPageOnRedlink['usergroup'][NS_XY] to false. Same as 2., but you can specify the namespace. The namespace + * is a numerical value (namespace index), you can use constants such as NS_MAIN or NS_USER_TALK. + * If you use an array (2. or 3.), the default will be true (for 1. it's false). In 2. and 3. there is no way to overwrite + * a value 'false' once it has already been set (this is due to the undefined order of usergroups). + */ +$wgShowPageOnRedlink = false; diff --git a/includes/EditPage.php b/includes/EditPage.php index 5709a9898e..794072ca73 100644 --- a/includes/EditPage.php +++ b/includes/EditPage.php @@ -418,11 +418,11 @@ class EditPage { } } } - - // If they used redlink=1 and the page exists, redirect to the main article - if ( $wgRequest->getBool( 'redlink' ) && $this->mTitle->exists() ) { - $wgOut->redirect( $this->mTitle->getFullURL() ); - } + + # Evaluate if the edit interface should be shown or + # if the page should be shown, in case redlink=true + if ( $wgRequest->getBool( 'redlink' ) ) + $this->showPageOnRedlink(); wfProfileIn( __METHOD__."-business-end" ); @@ -487,7 +487,45 @@ class EditPage { wfProfileOut( __METHOD__."-business-end" ); wfProfileOut( __METHOD__ ); } - + + /* + * Evaluate if the edit interface should be shown or the page, in case redlink=true. + * If the page exists, it is always shown. If it doesn't, it depends on the settings + * of $wgShowPageOnRedlink (see DefaultSettings for documentation). + */ + protected function showPageOnRedlink() { + global $wgShowPageOnRedlink, $wgUser, $wgRequest, $wgOut; + $redirectToPage = false; + # If the page exists (it has been created after the link has been emerged), + # redirect to the page instead of editing the current page + if ( $this->mTitle->exists() ) + $wgOut->redirect( $this->mTitle->getFullURL() ); + # Check site configuration ($wgShowPageOnRedlink) + if ( is_array( $wgShowPageOnRedlink ) ) { + $ns = $this->mTitle->getNamespace(); + $groups = $wgUser->getEffectiveGroups(); + # Gets overwritten if user is member of a group that has been specified: + $redirectToPage = true; + foreach ( $groups as $i => $group ) { + # Test if there is a rule for a specific usergroup and a specific namespace + if ( isset( $wgShowPageOnRedlink[$group][$ns] ) && $wgShowPageOnRedlink[$group][$ns] == false ) { + $redirectToPage = false; + } + # Test if there is a rule for a specific usergroup in all namespaces + elseif ( isset( $wgShowPageOnRedlink[$group] ) && !is_array( $wgShowPageOnRedlink[$group] ) + && $wgShowPageOnRedlink[$group] == false ) { + $redirectToPage = false; + } + } + } + else { + $redirectToPage = $wgShowPageOnRedlink; + } + if ( $redirectToPage ) { + $wgOut->redirect( $this->mTitle->getFullURL() ); + } + } + protected function getEditPermissionErrors() { global $wgUser; $permErrors = $this->mTitle->getUserPermissionsErrors( 'edit', $wgUser ); -- 2.20.1