User:Charlie Huggard/MediaWiki Hacks
As promised by my user page, this page will contains changes made to MediaWiki software on cirl.missouri.edu. Most of these changes were made for MediaWiki version 1.5.6 on a Gentoo machine. I did recently upgrade to 1.6.5 (with a tad bit of difficulty >_<). Unfortunately I did modify core code in some of these, so I may be downloading 1.7 and attempting modifications in a nicer way in the near future. All of these should be considered to be dirty dirty hacks. Let me know what you think on my talk pages!
Short URL
[edit]Before I saw the instructions at metawikipedia:Using a very short URL, I did the following to get rid of index.php URLs:
- Hard Link - I created hard links from index.php and redirect.php to wiki and goto respectively.
- .htaccess - To my .htaccess file I added the line:
DefaultType application/x-httpd-php
- LocalSettings.php - I changed the lines to look like this:
$wgScript = "$wgScriptPath/wiki"; $wgRedirectScript = "$wgScriptPath/goto";
Userpage Edit Restrictions
[edit]Version 1
[edit]I felt that users of the CIRL wiki should be the only ones who should be able to edit their User pages. I guess there are extensions now that do this, but when I was looking I didn't find one.
- includes/DefaultSettings.php - I added the following lines
$wgOnlyUserEditUserPage = false; $wgGroupPermissions['sysop']['editalluserpages'] = true;
- I set the $wgOnlyUserEditUserPage to true in LocalSettings.php
- includes/Title.php - I changed the following functions to read as shown
function userCanEdit() { global $wgOnlyUserEditUserPage; if(NS_USER == $this->mNamespace && $wgOnlyUserEditUserPage) { global $wgUser; return ($wgUser->isAllowed('editalluserpages')|| $wgUser->getName()==$this->getText()); } else { return $this->userCan('edit'); } }
function userCanMove() { global $wgOnlyUserEditUserPage; if(NS_USER == $this->mNamespace && $wgOnlyUserEditUserPage) { global $wgUser; return ($wgUser->isAllowed('editalluserpages')|| $wgUser->getName()==$this->getText()); } else { return $this->userCan('move'); } }
Version 2
[edit]When I upgraded to MediaWiki 1.6.5 I came up with a slightly better way.
- LocalSettings.php - I added the following lines
$wgOnlyUserEditUserPage = true; $wgGroupPermissions['sysop']['editalluserpages'] = true;
- includes/Title.php - I added the following to the userCan function:
# Protect User Pages from Editing global $wgOnlyUserEditUserPage; if( $wgOnlyUserEditUserPage && NS_USER == $this->mNamespace && !preg_match('/^'.preg_quote($wgUser->getName(), '/').'/', $this->mTextform) && !$wgUser->isAllowed('editalluserpages') && ( $action == 'move' || $action='edit' ) ) { wfProfileOut( $fname ); return false; }
Custom Namespace Logos
[edit]If you notice on the cirl.missouri.edu site the User namespace has a different logo than the main namespace. (There is also a sandbox namespace that is only accessible to registered users that has a 3rd logo). To accomplish this I did the following:
- includes/SkinTemplate.php - I changed the text function to the following
function text( $str ) { global $wgTitle, $wgNamespaceLogos; if('logopath'==$str && isset($wgNamespaceLogos[$wgTitle->getNamespace()])) { echo htmlspecialchars( $wgNamespaceLogos[$wgTitle->getNamespace()] ); } else { echo htmlspecialchars( $this->data[$str] ); } }
- LocalSettings.php - I added a new array mapping numeric namespace numbers to their non-default logos
$wgNamespaceLogos = array ( NS_SANDBOX => "$wgStylePath/common/images/wiki_sandbox.png", NS_SANDBOX_TALK => "$wgStylePath/common/images/wiki_sandbox.png", NS_USER => "$wgStylePath/common/images/wiki_user.png", NS_USER_TALK => "$wgStylePath/common/images/wiki_user.png", );
Calendar Enhancements
[edit]I used Cdamian's Calendar Extension for upcoming events. I did however got sick of Calendar pages showing up in the wanted pages so I changed the query in includes/SpecialWantedpages.php to
"SELECT 'Wantedpages' AS type, pl_namespace AS namespace, pl_title AS title, COUNT(*) AS value FROM $pagelinks LEFT JOIN $page ON pl_namespace=page_namespace AND pl_title=page_title WHERE page_namespace IS NULL AND pl_title not like 'Calendar/%' GROUP BY pl_namespace,pl_title HAVING COUNT(*) > 1";