User:Goldbishop/Sidebar
MediaWiki version: | 1.15 |
Reason
editIn response to one of my sites that I host, i needed to lock-down certain sections from the normal user/anon viewers. One way i did this was, to create two forms of the sidebar, Anon_sidebar and Sidebar. Obviously, the Sidebar form is hard-coded into the wiki site and I used this for those registerd users of the site. The second form, Anon_sidebar, is for those that are viewing the site and do not feel the need to register.
Sidebar
editThis form is very similar to most, I setup various sections of the sidebar. As my site has three navigation sections outside of the normal (information, toolbox, etc), I setup the main Parents in here, as such:
MediaWiki:Sidebar
edit* SEARCH * navigation ** mainpage|mainpage-description ** Production|Production ** Core|Core * source * project * Information ** portal-url|portal ** currentevents-url|currentevents ** recentchanges-url|recentchanges ** randompage-url|randompage ** helppage|help * TOOLBOX * LANGUAGES
MediaWiki:Anon_sidebar
edit(viewable at Silverlight 3D wiki)
* SEARCH * navigation ** Home|mainpage-description ** Administrativo|Production * information ** portal-url|portal ** currentevents-url|currentevents ** helppage|help
Skin.php
edit===== 1.19 =====
MediaWiki version: | 1.19 |
Reviewed the new structure and noted the correct location for this version.
function buildSidebar() {
global $wgMemc, $wgEnableSidebarCache, $wgSidebarCacheExpiry,
$wgUser; <-- Add this to list so you can access it.
...
$bar = array();
/** Change this
* $this->addToSidebar( $bar, 'sidebar' );
** To below **/
if( $wgUser->isLoggedIn() ){
$this->addToSidebar( $bar, 'sidebar' );
} else {
$this->addToSidebar( $bar, 'anon_sidebar' );
}
wfRunHooks( 'SkinBuildSidebar', array( $this, &$bar ) );
...
}
...
===== 1.15 =====
MediaWiki version: | 1.15 |
After developing these two pages, went into the Skin.php page and edited the following section (Manual:Interface/Sidebar#Change_sidebar_content_when_logged_in_.28PHP.29)
...
function buildSidebar() {
...
if( $wgUser->isLoggedIn() ){
$lines = explode( "\n", wfMsgForContent( 'sidebar' ) );
}else{
$lines = explode( "\n", wfMsgForContent( 'anon_sidebar' ) );
}
...
}
...
Common.js
editMediaWiki version: | 1.15 |
In reference to Manual:Interface/Sidebar#Add_or_remove_sections_.28JavaScript.29, I changed up the code tee-tiny bit to allow me to visibly manage what is available for the anon/users to the site.
Only part i really changed is the way the addOnloadHook() function is used, as you will see below. I will not repeat what has already been stated but will simply show you the changes that i made to accomidate what i was using it for.
This file can be accessed through your wiki via http://<your wiki address>/MediaWiki:Common.js
function ModifySidebar(action, section, name, link) {
try {
switch (section) {
case "languages":
var target = "p-lang";
break;
case "toolbox":
var target = "p-tb";
break;
case "navigation":
var target = "p-navigation";
break;
default:
var target = "p-" + section;
var custom = true;
break;
}
if (action == "addC") {
var node = document.getElementById(target)
.getElementsByTagName('div')[0]
.getElementsByTagName('ul')[0];
var nodeelements = node.getElementsByTagName('li');
for (var i = 0; i < nodeelements.length; i++) {
if (nodeelements[i].getElementsByTagName('a')[0].innerHTML == name ||
nodeelements[i].getElementsByTagName('a')[0].href == link) {
node.removeChild(nodeelements[i]);
}
}
var aNode = document.createElement('a');
var liNode = document.createElement('li');
aNode.appendChild(document.createTextNode(name));
aNode.setAttribute('href', link);
liNode.appendChild(aNode);
liNode.className='plainlinks';
node.appendChild(liNode);
node.style.display = "visible";
}
if (action == "removeC") {
var list = document.getElementById(target)
.getElementsByTagName('div')[0]
.getElementsByTagName('ul')[0];
var listelements = list.getElementsByTagName('li');
for (var i = 0; i < listelements.length; i++) {
if (listelements[i].getElementsByTagName('a')[0].innerHTML == name ||
listelements[i].getElementsByTagName('a')[0].href == link) {
list.removeChild(listelements[i]);
}
}
}
if (action == "removeP"){
var node = document.getElementById(target);
node.style.visibility = "hidden";
}
} catch(e) {
// lets just ignore what's happened
return;
}
}
function AdminSidebar() {
ModifySidebar("addC", "source", "Design", "http://sl3d.woodassoc.us/wiki/Source:Design");
ModifySidebar("addC", "source", "Conceptual", "http://sl3d.woodassoc.us/wiki/Source:Conceptual");
ModifySidebar("addC", "source", "Layout", "http://sl3d.woodassoc.us/wiki/Source:Layout");
ModifySidebar("addC", "project", "Design", "http://sl3d.woodassoc.us/wiki/Silverlight_3D:Design");
ModifySidebar("addC", "project", "Conceptual", "http://sl3d.woodassoc.us/wiki/Silverlight_3D:Conceptual");
ModifySidebar("addC", "project", "Layout", "http://sl3d.woodassoc.us/wiki/Silverlight_3D:Layout");
ModifySidebar("addC", "toolbox", "Upload file", "http://sl3d.woodassoc.us/wiki/Special:Upload");
}
function UserSidebar(){
ModifySidebar("removeP", "toolbox", "toolbox", null);
}
if (isArray(wgUserGroups)){
if (wgUserGroups.Contains('bureaucrat') || wgUserGroups.Contains('sysop')){
//If the user logged in is a Bureaucrat or Sysop
addOnloadHook(AdminSidebar);
}else{
//If the user logged in is not a Bureaucrat or Sysop
addOnloadHook(UserSidebar);
}
}else{
//If an anonymous user is viewing the site
addOnloadHook(UserSidebar);
}
I changed the "add" and "remove" actions to "addC", "addP", "removeC" and "removeP" only to clarify if the items being added/removed was a Child (C) or Parent (P).
Parent nodes are those that contain mutliple children, such as "navigation", "toolbox", "information", etc. Child nodes are those that are contained within a Parent node.
WORD OF ADVISE
If you are looking to have several parent-child-grandchild relationships, it is best to get an extension that utilizes ajax or java to overlay a menu structure. When using the Sidebar, it should be noted that it should contain only parent-child relationships, going only 1 deep. Any further than that and the reader may not be able to effectively browse your content. Think of the Sidebar as more of a Category-Topic relationship. As long as you keep to a simple 1 tier menu structure, this hack should work just fine.