User:Barrylb/Special pages outside Special namespace

From MediaWiki.org
Jump to: navigation, search
MediaWiki extensions manual - list
Crystal Clear action run.png
Special pages outside Special namespace

Release status: unknown

Implementation Special page
Description here is a hack to make special pages integrate better within the site structure. Instead of a special page appearing as http://www.mysite.com/wiki/Special:Events/2006/07/21/Meeting you can make it appear as http://www.mysite.com/wiki/Events/2006/07/21/Meeting.
Author(s) Barrylb
MediaWiki 1.6.7
License No license specified
Download No link
Parameters

$wgIntegratedSpecialPages


If you have some features on your site that are not suitable for wiki content then quite often one of your only choices is to implement a special page but it doesn't look good having Special: appear in the URL.

So here is a hack to make special pages integrate better within the site structure. Instead of a special page appearing as http://www.mysite.com/wiki/Special:Events/2006/07/21/Meeting you can make it appear as http://www.mysite.com/wiki/Events/2006/07/21/Meeting.

This should work on 1.6.7 and 1.7.1. Do the following:

  • Modify includes/Wiki.php. Insert the following before function initializeSpecialCases :
function checkCustomSpecialpages(&$title, &$output) {
  global $wgTitle, $wgIntegratedSpecialPages;

  foreach ($wgIntegratedSpecialPages as $name => $specialname) {
        if ((strpos($title->getText(), $name.'/') === 0) || ($title->getText() == $name)) {
                if ($title->getText() == $name) {
                        $par = NULL;
                        $name = $title->getDBkey();
                }
                else {
                        $bits = split( "/", $title->getDBkey(), 2 );
                        $name = $bits[0];
                        if( !isset( $bits[1] ) ) {
                                $par = NULL;
                        } else {
                                $par = $bits[1];
                        }
                }                                       

                $page = SpecialPage::getPage( $name );
                if (!is_null( $page ) ) {
                        $wgTitle = Title::makeTitle( NS_SPECIAL, $name );
                        if (!is_null( $wgTitle )) {
                                if (!$wgTitle->userCanRead()) {
                                        $output->loginToUse();
                                        $output->output();
                                        exit;
                                }
                                else {
                                        $page->execute( $par );
                                        return true;
                                }
                        }
                }

        }
  }
  return false;
}
  • In function initializeSpecialCases change this:
 else {
   /* No match to special cases */

to this:

else if (!$this->checkCustomSpecialPages($title, $output)) {
   /* No match to special cases */
  • Then in LocalSettings.php define which paths map to which special pages; usually they will be the same name. eg:
 $wgIntegratedSpecialPages = array ('Events' => 'Events', 'Reports' => 'Reports');
Language: English  • русский